ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNWI0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYxOTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAyLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThjY2ZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLQk8IS0tIEVjbGlwc2UgVmFsaWRhdGlvbiBwcmVmZXJlbmNlcyAtLT4KLTxjb250ZXh0IGlkPSJqdmdwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgcGFnZSBhbGxvd3MgeW91IHRvIHZpZXcgb3IgY2hhbmdlIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGFsbCB3b3JrYmVuY2ggcHJvamVjdHMuIEEgdmFsaWRhdG9yIGlzIGEgdG9vbCB0aGF0IGNoZWNrcyB0aGF0IHJlc291cmNlcyBjb25mb3JtIHRvIGEgc3BlY2lmaWNhdGlvbiwgRFRELCBvciBzb21lIG90aGVyIHNldCBvZiBydWxlcy4KLQotRWFjaCB2YWxpZGF0b3IgY2FuIGFwcGx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIGNlcnRhaW4gcHJvamVjdCBuYXR1cmVzLCBhbmQgY2VydGFpbiBwcm9qZWN0IGZhY2V0cy4gV2hlbiBhIHZhbGlkYXRvciBhcHBsaWVzIHRvIGEgcHJvamVjdCBmYWNldCBvciBuYXR1cmUsIHRoZSB3b3JrYmVuY2ggdXNlcyB0aGF0IHZhbGlkYXRvciBvbmx5IG9uIHByb2plY3RzIHRoYXQgaGF2ZSB0aGF0IGZhY2V0IG9yIG5hdHVyZS4gTGlrZXdpc2UsIG1vc3QgdmFsaWRhdG9ycyBhcHBseSBvbmx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIHNvIHRoZSB3b3JrYmVuY2ggdXNlcyB0aG9zZSB2YWxpZGF0b3JzIG9ubHkgb24gdGhvc2UgdHlwZXMgb2YgZmlsZXMuCi0KLVNlbGVjdCB0aGUgPGI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIGFsbG93IGluZGl2aWR1YWwgcHJvamVjdHMgdG8gc2V0IHRoZWlyIG93biB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLiBUbyBjb25maWd1cmUgbmV3IHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGFuIGluZGl2aWR1YWwgcHJvamVjdCwgc2VsZWN0IHRoZSBwcm9qZWN0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8Yj5Qcm9wZXJ0aWVzPC9iPiAgICZndDsgPGI+VmFsaWRhdGlvbjwvYj4gLgotCi1TZWxlY3QgdGhlIDxiPlN1c3BlbmQgYWxsIHZhbGlkYXRvcnM8L2I+IGNoZWNrIGJveCB0byBwcmV2ZW50IHZhbGlkYXRpb24gYXQgdGhlIGdsb2JhbCBsZXZlbC4gSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgeW91IGNhbiBzdGlsbCBlbmFibGUgdmFsaWRhdGlvbiBhdCB0aGUgcHJvamVjdCBsZXZlbC4KLQotU2VsZWN0IHRoZSA8Yj5TYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gc2F2ZSBhbnkgcmVzb3VyY2VzIHlvdSBoYXZlIG1vZGlmaWVkIGJlZm9yZSB0aGUgdmFsaWRhdGlvbiBiZWdpbnMuCi0KLUluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIHZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgYXQgdGhlIGdsb2JhbCBsZXZlbC4gRWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGJ1aWxkIHZhbGlkYXRpb24uIENob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nIHRoZSBidXR0b24gaW4gdGhlIDxiPlNldHRpbmdzPC9iPiBjb2x1bW4uIE5vdCBhbGwgdmFsaWRhdG9ycyBoYXZlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCIgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OWFmMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLQk8IS0tIFZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIHByb2plY3QgLS0+Ci0KLTxjb250ZXh0IGlkPSJqdnBwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgdmFsaWRhdGlvbiBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGEgcHJvamVjdC4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1FYWNoIHZhbGlkYXRvciBjYW4gYXBwbHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLiBXaGVuIGEgdmFsaWRhdG9yIGFwcGxpZXMgdG8gYSBwcm9qZWN0IGZhY2V0IG9yIG5hdHVyZSwgdGhlIHdvcmtiZW5jaCB1c2VzIHRoYXQgdmFsaWRhdG9yIG9ubHkgb24gcHJvamVjdHMgdGhhdCBoYXZlIHRoYXQgZmFjZXQgb3IgbmF0dXJlLiBMaWtld2lzZSwgbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzIHRob3NlIHZhbGlkYXRvcnMgb25seSBvbiB0aG9zZSB0eXBlcyBvZiBmaWxlcy4KLQotU2VsZWN0IHRoZSA8Yj5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBzZXQgaW4gdGhlIHdvcmtiZW5jaCBQcmVmZXJlbmNlcyBwYWdlLiBJZiB0aGUgPGI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYj4gY2hlY2sgYm94IGlzIG5vdCBlbmFibGVkLCBnbyB0byA8Yj5XaW5kb3c8L2I+ICAgJmd0OyA8Yj5QcmVmZXJlbmNlczwvYj4gICAmZ3Q7IDxiPlZhbGlkYXRpb248L2I+IGFuZCBzZWxlY3QgdGhlIDxiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2I+IGNoZWNrIGJveC4KLQotU2VsZWN0IHRoZSA8Yj5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9iPiBjaGVjayBib3ggdG8gcHJldmVudCB2YWxpZGF0aW9uIGZvciB0aGlzIHByb2plY3QuCi0KLUluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIHZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgZm9yIHRoaXMgcHJvamVjdC4gRWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGJ1aWxkIHZhbGlkYXRpb24uIENob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIGJ5IGNsaWNraW5nIHRoZSBidXR0b24gaW4gdGhlIDxiPlNldHRpbmdzPC9iPiBjb2x1bW4uIE5vdCBhbGwgdmFsaWRhdG9ycyBoYXZlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCIgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzMjJlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMDcwOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUcmFuc2xhdGlvbiBJbnN0cnVjdGlvbjogc2VjdGlvbiB0byBiZSB0cmFuc2xhdGVkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUGx1Z2luLm5hbWUgPSBXU1QgdmFsaWRhdGlvbiBpbmZvcG9wIHBsdWctaW4KLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjI3YmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICA8Y29udGV4dHMgZmlsZT0iVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIiAvPgotCTxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSIgLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWUxZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmYzZkMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9kZXNjcmlwdGlvbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoZSBIRUFEIGJyYW5jaCBvZiB0aGlzIHBhdGNoIGZlYXR1cmUgaXMgaW50ZW50aW9uYWxseSBlbXB0eSwgCi10byBhdHRlbXB0IHRvIHRyeSBhbmQgYXZvaWQgY29uZnVzaW9uLiAKLQotUGxlYXNlIGxvYWQgdGhlIGNvcnJlY3QgdmVyc2lvbiBmcm9tIHRoZSBicmFuY2ggb2YgdGhlIHJlbGF0ZWQgcGF0Y2guCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyMGNhYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyZjQ2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDQ4MGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDIyM2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIGNvbW1vbiBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTBhNGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIgdmVyc2lvbj0iMi4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIgdmVyc2lvbj0iMi4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuNi41IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiB2ZXJzaW9uPSIzLjEuMTAwIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9zZ2kudXRpbCIgdmVyc2lvbj0iMy4xLjEwMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHZlcnNpb249IjIuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiIHZlcnNpb249IjMuNC40LjEiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIgdmVyc2lvbj0iMS4wLjEwMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB2ZXJzaW9uPSIxLjAuMTAwIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQwZjU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgY29tbW9uIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzRmYzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyNWIwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzOTI1Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjI1MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxN2ZjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUsIGZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUuc291cmNlCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZlMDBlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgY29tbW9uIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU4MzkyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGFmN2QuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjExNjRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ4N2E5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIGNvbW1vbiBVSSBmdW5jdGlvbmFsaXR5LgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmU3OGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRyYXcyZCIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiIHZlcnNpb249IjMuNC40IiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIiB2ZXJzaW9uPSIxLjAuMTAxIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIgdmVyc2lvbj0iMS4wLjEwMSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjIuMCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHZlcnNpb249IjEuMC4xMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuMi4xIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIgdmVyc2lvbj0iMy4xLjEwMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTI1N2EuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlCi1iaW4uaW5jbHVkZXMgPSBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MWNmYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBDb21tb24gVUkuCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDMxNGVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGI3M2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ODk0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImplbXV0aWwiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImplbXV0aWwtbm9ud29ya2JuZWNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNjYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjU0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWw9V0FSTklORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU0MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udXRpbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMyOTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxNTo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU3OWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNUdWUgSnVsIDMxIDIwOjM5OjQ4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhlMWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDZiMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI0ZyaSBNYXkgMTMgMTA6MTA6MDQgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MgotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MgotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MgotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiOTcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS51dGlsOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlciwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQuMSw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUEVSRk1TUl9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTUxMjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUEVSRk1TUl9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlIGNvZGUgY2FuIGJlIGZvdW5kIGluIHRoZSBwZXJmbXNyLmphciBsb2FkZWQgYXMgYmluYXJ5IGluIHRoaXMKLXByb2plY3QuIFNpbmNlIHRoaXMgaXMgb3B0aW9uYWwsIHdlIG5lZWRlZCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgd2l0aG91dCB0aGUgdHJ1ZQotcGx1Z2luIGJlaW5nIGF2YWlsYWJsZS4gU28gd2UgY3JlYXRlZCB0aGUgc3R1YiBqYXIgY29udGFpbmluZyBqdXN0IHdoYXQgd2UgbmVlZGVkLgotCi1JZiB0aGVyZSBpcyBhIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoZSBzdHViIGphciwgeW91IHdpbGwgbmVlZCB0byBjaGVja291dAotdGhlIGZvbGRlciBvcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi4gVGhpcyB3aWxsIHRoZW4KLWJlIGEgc2VwYXJhdGUgcHJvamVjdC4gWW91IGNhbiB0aGVuIG1ha2UgdGhlIGNoYW5nZXMgdGhlcmUsIGFuZCB0aGVuIGZvbGxvd2luZyB0aGUKLVJFQURNRSBpbiB0aGF0IHByb2plY3QgdG8gY3JlYXRlIGFuZCBjb21taXQgdGhlIGNoYW5nZXMuIAotCi1UaGUgamFyIGlzIGluIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCwgYnV0IGl0IGlzIG5vdCBleHBvcnRlZCBhbmQgaXMgbm90IGluCi10aGUgcGx1Z2luLnhtbCBvciBidWlsZC5wcm9wZXJ0aWVzLiBUaGlzIG1lYW5zIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciBjb21waWxhdGlvbgotYnV0IGl0IHdvbid0IHNob3cgdXAgaW4gdGhlIHJ1bnRpbWUgd29ya2JlbmNoLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIiAiYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4ZTk0YS4uMDAwMDAwMAotLS0gImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLURvIG5vdCBpbmNsdWRlIGEgbmV3IGRlcGVuZGVuY3kgcGx1Z2luIHRvIHRoZSBNQU5JRkVTVCBmb3IgdGhpcyBwbHVnaW5kISEhCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIHBsdWdpbiBpcyBhbHNvIGV4ZWN1dGVkIG91dHNpZGUgb2YgRWNsaXBzZSBmcmFtZXdvcmssIHN1Y2ggSUJNIFdlYnNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGMpIElCTS4gV2UgY2Fubm90IGFkZAotbmV3IGRlcGVuZGVuY2llcyB0byB0aGUgcGx1Z2luIGJlY2F1c2UgdGhlIGN1cnJlbnQgc2V0IGlzIGNvbnNpZGVyZWQgdG8gYmUgQVBJLiBBZGRpbmcgYSBuZXcgc2V0IHdpdGhvdXQgY29uc3VsdGluZyB0aG9zZSB1c2VycyB3b3VsZCBicmVhawotdGhlbS4KLQotVGhlIGV4dGVybmFsIEFQSSBpcyBhbnl0aGluZyBpbiB0aGUgamVtdXRpbC1ub253b3JrYmVuY2ggZm9sZGVyLiBJZiBpdCBpcyBvbmx5IGZvciBhIGNsYXNzIGluIHRoZSBvdGhlciBzb3VyY2UgZm9sZGVyKHMpIGl0IG1heSBiZSBPSyBzaW5jZSB0aGV5IHdvdWxkIG5vdCBiZSAKLXVzaW5nIHRoYXQgY29kZS4gQnV0IGl0IHdvdWxkIGJlIGJlc3QgdG8gY29uc3VsdCB3aXRoIHRoZW0gZmlyc3QuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY3MTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGQ4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gamVtdXRpbC8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8sXAotICAgICAgICAgICBqZW11dGlsLW5vbndvcmtibmVjaC8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLWV4dHJhLi4gPSAuL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwYmFlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIHdoZW4gbG9nZ2luZyBpbmZvcm1hdGlvbiB3aGljaCBzaG91bGQgYmUgZ3JvdXBlZCB0b2dldGhlci4gSW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV2ZXJ5IHRpbWUgaXQKLSAqIGlzIG5lZWRlZCwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGNyZWF0ZSBhbiBpbnN0YW5jZSBhbmQgcmV1c2UgaXQuCi0gKiA8cD4KLSAqIEN1cnJlbnRseSB0aGUgb25seSBmaWVsZHMgdGhhdCBhcmUgbG9nZ2VkIGFyZSB0aGUge0BsaW5rICNnZXRUZXh0KCl9IGFuZCB7QGxpbmsgI2dldFRhcmdldEV4Y2VwdGlvbigpfS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dFbnRyeSB7Ci0KLQlwcml2YXRlIGludCBfZXhlY3V0aW9uTWFwID0gMDsKLQotCXByaXZhdGUgVGhyb3dhYmxlIF9jYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnRpZXNGaWxlTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGVPZk9yaWdpbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBzb3VyY2VJZGVudGlmaWVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxhcHNlZFRpbWU7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVR5cGVJZGVudGlmaWVyOwotCi0JLyoqCi0JICogVGhlIGZpbGUgbmFtZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG5hbWUgd2hpY2ggY2FuIGJlIHVzZWQgYnkgUmVzb3VyY2VCdW5kbGUgdG8gbG9hZCB0aGUgc3RyaW5nIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuIFRoZSBwYXJhbWV0ZXIgbXVzdCBub3QKLQkgKiBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXNGaWxlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBMb2dFbnRyeShTdHJpbmcgcHJvcGVydGllc0ZpbGVOYW1lKSB7Ci0JCXNldFByb3BlcnRpZXNGaWxlTmFtZShwcm9wZXJ0aWVzRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTG9nRW50cnkoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGV4ZWN1dGlvbiBtYXAKLQkgKiAKLQkgKiBAcmV0dXJuIGV4ZWN1dGlvbiBtYXAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvbk1hcCgpIHsKLQkJcmV0dXJuIF9leGVjdXRpb25NYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gcHJvcGVydGllcyBmaWxlIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9wZXJ0aWVzRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRhcmdldCBleGNlcHRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRhcmdldCBleGNlcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFRhcmdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIF9jYXVnaHRFeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IGxvY2FsZSBvZiBvcmlnaW4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvY2FsZSBvZiBvcmlnaW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsZU9mT3JpZ2luKCkgewotCQlyZXR1cm4gbG9jYWxlT2ZPcmlnaW47Ci0JfQotCi0JLyoqCi0JICogR2V0IHNvdXJjZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gc291cmNlIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZWlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VJZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBlbGFwc2VkIHRpbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGVsYXBzZWQgdGltZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiBlbGFwc2VkVGltZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1lc3NhZ2UgdHlwZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiBtZXNzYWdlIHR5cGUgaWRlbnRpZmllciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gbWVzc2FnZVR5cGVJZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGlvbk1hcChpbnQgbWFwKSB7Ci0JCV9leGVjdXRpb25NYXAgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogU2V0IHByb3BlcnRpZXMgZmlsZSBuYW1lCi0JICogCi0JICogQHBhcmFtIGZOYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydGllc0ZpbGVOYW1lKFN0cmluZyBmTmFtZSkgewotCQlfcHJvcGVydGllc0ZpbGVOYW1lID0gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhcmdldCBleGNlcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZXhjCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RXhjZXB0aW9uKFRocm93YWJsZSBleGMpIHsKLQkJX2NhdWdodEV4Y2VwdGlvbiA9IGV4YzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgc3RhY2t0cmFjZSBvZiBjdXJyZW50IHN0YWNrIChhdCB0aGUgdGltZSBvZiBjYWxsIHRvIHRoaXMgbWV0aG9kKSB0byB0aGUgdGV4dCBidWZmZXIuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kU3RhY2tUcmFjZSgpIHsKLQkJLy8gR3JhYiB0aGUgc3RhY2sgdHJhY2UgZnJvbSB0aGUgVGhyZWFkIC4uLgotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoYnl0ZU91dHB1dCk7Ci0JCS8vIENhbid0IGNhbGwgVGhyZWFkLmR1bXBTdGFjaygpIGJlY2F1c2UgaXQgZG9lc24ndCB0YWtlIGEgd3JpdGVyIGFzIGlucHV0LgotCQkvLyBDb3B5IGl0cyBtZWNoYW5pc20gaW5zdGVhZC4KLQkJbmV3IEV4Y2VwdGlvbigiU3RhY2sgdHJhY2UiKS5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOyAvLyROT04tTkxTLTEkCi0JCXByaW50V3JpdGVyLmZsdXNoKCk7Ci0KLQkJLy8gYW5kIHVwZGF0ZSB0aGUgdGV4dCB0byB0aGUgTG9nRW50cnkncyB0ZXh0LgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRleHQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChieXRlT3V0cHV0LnRvU3RyaW5nKCkpOwotCQlzZXRUZXh0KGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRleHQuCi0JICogCi0JICogQHJldHVybiB0ZXh0IG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRleHQgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IGV2ZXJ5IGVudHJ5IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGV4Y2VwdCB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXNldEV4ZWN1dGlvbk1hcCgwKTsKLQkJc2V0VGFyZ2V0RXhjZXB0aW9uKG51bGwpOwotCQlsb2NhbGVPZk9yaWdpbiA9IG51bGw7Ci0JCXNvdXJjZUlkZW50aWZpZXIgPSBudWxsOwotCQllbGFwc2VkVGltZSA9IG51bGw7Ci0JCXNldFRleHQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGxvY2FsZSBvZiBvcmlnaW4uCi0JICogCi0JICogQHBhcmFtIG9yaWdpbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsZU9mT3JpZ2luKFN0cmluZyBvcmlnaW4pIHsKLQkJbG9jYWxlT2ZPcmlnaW4gPSBvcmlnaW47Ci0JfQotCi0JLyoqCi0JICogU2V0IHNvdXJjZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VJRChTdHJpbmcgaWQpIHsKLQkJc291cmNlSWRlbnRpZmllciA9IGlkOwotCX0KLQotCS8qKgotCSAqIFNldCBlbGFwc2VkIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGFwc2VkVGltZShsb25nIHRpbWUpIHsKLQkJZWxhcHNlZFRpbWUgPSBTdHJpbmcudmFsdWVPZih0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc291cmNlIGlkZW50aWZpZXIuCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlzZXRTb3VyY2VJRChzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCBtZXNzYWdlIHR5cGUgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0VGV4dChTdHJpbmcpfSBpbnN0ZWFkIGFuZCBjYWxsaW5nIGl0IHdpdGggdGhlIHJlc3VsdCBvZiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSl9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJbWVzc2FnZVR5cGVJZGVudGlmaWVyID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldCBtZXNzYWdlIHR5cGUgaWQuIFNhbWUgYXMgPGNvZGU+c2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyLjwvY29kZT4KLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0VGV4dChTdHJpbmcpfSBpbnN0ZWFkIGFuZCBjYWxsaW5nIGl0IHdpdGggdGhlIHJlc3VsdCBvZiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSl9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVR5cGVJRChTdHJpbmcgc3RyaW5nKSB7Ci0JCXNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0b2tlbnMuIChDdXJyZW50bHkgdGhpcyBpcyBpZ25vcmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRva2VucyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoYnl0ZU91dHB1dCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQlwcmludFdyaXRlci5wcmludGxuKHRleHQpOwotCQlpZiAoX2NhdWdodEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQlfY2F1Z2h0RXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwcmludFdyaXRlcik7Ci0JCX0KLQkJcHJpbnRXcml0ZXIuZmx1c2goKTsKLQkJcmV0dXJuIGJ5dGVPdXRwdXQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWU5NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi0vKioKLSAqIEJhc2ljIGxvZyByZW5kZXJlciBpbnRlcmZhY2UuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBleHRlbnNpb24gPGNvZGU+SUxvZ1JlbmRlcmVyMi48L2NvZGU+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dSZW5kZXJlciB7Ci0KLQkvKioKLQkgKiBMb2dnZWQgdG8gY29uc29sZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05TT0xFX0RFU0NSSVBUSU9OID0gImNvbnNvbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2dnZWQgdG8gd29ya2JlbmNoLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdPUktCRU5DSF9ERVNDUklQVElPTiA9ICJ3b3JrYmVuY2ggbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTm90IGxvZ2dlZC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBOT0xPR19ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2cgbGV2ZWxzLiBUaGVzZSBhcmUgZGVwcmVjYXRlZCwgdXNlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiBjb2RlcyBpbnN0ZWFkLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19FUlJPUiA9IDA7Ci0KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfVFJBQ0UgPSAxOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX1dBUk5JTkcgPSAyOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX0lORk8gPSAzOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFBsdWdpbklEID0gIm9yZy5lY2xpcHNlLmplbS51dGlsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSk7Ci0KLQkvKioKLQkgKiBTdGFydCBvciBzdG9wIHRoZSB0cmFjaW5nLgotCSAqIAotCSAqIEBwYXJhbSBGbGFnCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBzdGFydCB0aGUgdHJhY2luZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBGbGFnKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTY3MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotIAotLyoqCi0gKiBMb2cgcmVuZGVyZXIgdGhhdCBwcm92aWRlcyBtb3JlIGZ1bmN0aW9uLiBCYXNpY2FsbHkgaXQgY2FuIGhhbmRsZQotICogdGhlIGxvZ2dpbmcgb2Ygc3BlY2lmaWMgdHlwZXMgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4gdGhlIGRlZmF1bHQKLSAqIGNvbnZlcnNpb24gdG8gc3RyaW5nIHN1cHBsaWVkIGJ5IExvZ2dlci4KLSAqIAotICogSXQgYWxzbyB1c2VzIHRoZSBMZXZlbCBjbGFzc2VzIGZyb20gamF2YS51dGlsLmxvZ2dpbmcgYXMgdGhlIGxvZ2dpbmcgbGV2ZWxzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nUmVuZGVyZXIyIGV4dGVuZHMgSUxvZ1JlbmRlcmVyIHsKLQkKLQkvKioKLQkgKiBXaGVuIExvZ2dlci5zZXRMZXZlbChERUZBVUxUKTogcmVzdG9yZSB0byB3aGF0IHRoZSBkZWZhdWx0IGxldmVsIHdhcy4KLQkgKiBXaGVuIGxvZyguLi4sREVGQVVMVCk6IExvZyBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhlIHR5cGUgb2Ygb2JqZWN0LgotCSAqLwotCXN0YXRpYyBmaW5hbCBMZXZlbCBERUZBVUxUID0gbmV3IExvZ2dlci5Mb2NhbExldmVsKCJERUZBVUxUIiwgSW50ZWdlci5NQVhfVkFMVUUtMSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBXaGVuIGxvZyguLi4sVFJBQ0UpIDogTG9nIG9ubHkgd2hlbiBpbiB0cmFjZSBtb2RlLgotCSAqIERvbid0IHVzZSBpbiBMb2dnZXIuc2V0TGV2ZWwoKS4gSGFzIG5vIG1lYW5pbmcgaW4gdGhhdCBjYXNlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBMZXZlbCBUUkFDRSA9IG5ldyBMb2dnZXIuTG9jYWxMZXZlbCgiVFJBQ0UiLCBJbnRlZ2VyLk1BWF9WQUxVRS0yKTsJIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgdGhyb3dhYmxlKS4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYW4gb2JqZWN0KS4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgYm9vbGVhbikuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxldmVsKTsJCi0KLQkvKioKLQkgKiBMb2cgdGhlIGNoYXIgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBjaGFyKS4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpOwkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBieXRlKS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBzaG9ydCkuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBpbnQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYW4gaW50KS4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBsb25nKS4KLQkgKiAKLQkgKiBAcGFyYW0gbAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpOwotCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGZsb2F0KS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxldmVsKTsKLQotCS8qKgotCSAqIExvZyB0aGUgZG91YmxlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgZG91YmxlKS4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsZXZlbCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M5ZDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi0vKioKLSAqIERlZmF1bHQgbG9nIHJlbmRlcmVyIHRvIHVzZSB3aGVuIG5vdCBydW5uaW5nIHVuZGVyIEVjbGlwc2UuIEl0IGxvZ3MgdG8gc3lzb3V0IGFuZCBzeXNlcnIuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBKREtDb25zb2xlUmVuZGVyZXIgaW1wbGVtZW50cyBJTG9nUmVuZGVyZXIyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMb2dnZXIgZk15TG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdGVyIHRha2luZyBhIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEpES0NvbnNvbGVSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNeUxvZ2dlciA9IGxvZ2dlcjsKLQkJZlRyYWNlTW9kZSA9IGZNeUxvZ2dlci5nZXRUcmFjZU1vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCi0JCWlmICh0eXBlID09IElMb2dSZW5kZXJlci5MT0dfVFJBQ0UgJiYgIWZUcmFjZU1vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAodHlwZSA9PSBJTG9nUmVuZGVyZXIuTE9HX0VSUk9SKQotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCWVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkNPTlNPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI3NldFRyYWNlTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWNlTW9kZShib29sZWFuIGZsYWcpIHsKLQotCQlpZiAoZlNldHRpbmdUcmFjZSkKLQkJCXJldHVybjsKLQkJZlNldHRpbmdUcmFjZSA9IHRydWU7Ci0JCWZUcmFjZU1vZGUgPSBmbGFnOwotCQlmTXlMb2dnZXIuc2V0VHJhY2VNb2RlKGZsYWcpOwotCQlmU2V0dGluZ1RyYWNlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IExldmVsLlNFVkVSRSkKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBpZiBsb2dnaW5nIGF0IHRoZSBnaXZlbiBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbG9nZ2luZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dnaW5nKExldmVsIGxvZ0xldmVsKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlIHx8IGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsb2dMZXZlbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYm9vbGVhbiwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coY2hhciwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZG91YmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGQpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGZsb2F0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coaW50LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGkpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGxvbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGwpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coc2hvcnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihzKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLlNFVkVSRTsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyh0KSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmFkMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi0vKioKLSAqIFRoaXMgaXMgYSBiYXNlLCBVSSBpbmRlcGVuZGVudCBsb2dnZXIuICAgSXQgd2lsbAotICogY29uc3RydWN0IGEgY29uc2lzdGVudCBtc2cuIGJvZHksIGFuZCBjYWxsIGFuIGVuZmlyb25tZW50IHNwZWNpZmljIElMb2dSZW5kZXJlci4KLSAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9nZ2VyIHdpbGwgdXNlIGEgY29uc29sZSBiYXNlZCBJTG9nUmVuZGVyZXIsCi0gKiBhbmQgYSBKMkVFIFBsdWdpbiBpZGVudGlmaWNhdGlvbi4KLSAqIAotICogPHA+Ci0gKiBXaGVuIHJ1bm5pbmcgb3V0c2lkZSBvZiBFY2xpcHNlLCB0aGUgdHJhY2UgYW5kIGxvZ2dpbmcgbGV2ZWwgY29tZSBmcm9tIHRoZSBzeXN0ZW0gcHJvcGVydGllcwotICogPHVsPgotICogCQk8bGk+ImRlYnVnIiAoPSJ0cnVlIikgLSBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uIAotICogCQk8bGk+ImxvZ0xldmVsIiAoPSJsZXZlbCIgd2hlcmUgImxldmVsIiBpcyBhIGxldmVsIHN0cmluZywgZS5nLiBTRVZFUkUsIFdBUk5JTkcsIGV0Yy4gZnJvbSB0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+IGNsYXNzKS4KLSAqIAkJCVRoZSBkZWZhdWx0IGlzICJXQVJOSU5HIi4KLSAqIDwvdWw+Ci0gKiAKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCQotCS8vIFRoaXMgaXMgdXNlZCBieSBJTG9nUmVuZGVyZXIyIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBsZXZlbC4KLQlzdGF0aWMgY2xhc3MgTG9jYWxMZXZlbCBleHRlbmRzIExldmVsIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MjczMzU3MDc0NzY3ODU0ODgzTDsKLQotCQlwdWJsaWMgTG9jYWxMZXZlbChTdHJpbmcgbmFtZSwgaW50IGxldmVsKSB7Ci0JCQlzdXBlcihuYW1lLCBsZXZlbCk7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90ICAgICAgICAgICAgICAKLQlwcml2YXRlIFN0cmluZyBmUGx1Z2luSUQ7Ci0JcHJpdmF0ZSBJTG9nUmVuZGVyZXIgZlJlbmRlcmVyID0gbnVsbDsKLQlwcml2YXRlIElMb2dSZW5kZXJlcjIgcmVuZGVyZXIyID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGZMaW5lU2VwZXJhdG9yOwotCXByaXZhdGUgTGV2ZWwgbGV2ZWw7Ci0JcHJpdmF0ZSBMZXZlbCBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5TRVZFUkU7CS8vIEJ5IGRlZmF1bHQgb25seSBzZXZlcmUgb3IgZ3JlYXRlciBhcmUgbG9nZ2VkLgotCXByaXZhdGUgU3RyaW5nIGxvZ0ZpbGVOYW1lOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEZWZhdWx0TG9nZ2VyUGx1Z2luID0gSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRDsKLQlzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgTG9nZ2VycyA9IG5ldyBIYXNodGFibGUoKTsgLy8gS2VlcCB0cmFjayBvZiBhbGwgdGhlIExvZ2dlcnMKLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIExvZ01hcmsgPSB7ICIqKiogRVJST1IgKioqICIsIC8vJE5PTi1OTFMtMSQKLQkJIltUcmFjZV0gIiwgLy8kTk9OLU5MUy0xJAotCQkiKysrIFdhcm5pbmcgKysrICIsIC8vJE5PTi1OTFMtMSQKLQkJIkluZm8gIiB9OyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBGaWxsZXIgPSAiICAgICI7IC8vIFVzZSB0aGlzIHRvIGluZGVudCBtc2cuIGJvZHkgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBMb2dnZXIoKSB7Ci0JCXRoaXMoSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRCk7Ci0JfQotCQotCXByb3RlY3RlZCBMb2dnZXIoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZQbHVnaW5JRCA9IHBsdWdpbklEOwotCQlzZXRSZW5kZXJlcihuZXcgSkRLQ29uc29sZVJlbmRlcmVyKHRoaXMpKTsJLy8gU2V0IHVwIGRlZmF1bHQgdG8gdGhpcy4gU29tZW9uZSBjYW4gY2hhbmdlIGl0IGxhdGVyLgotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RhY2t0cmFjZSBhcyBhIHByaW50IGZvcm1hdHRlZCBzdHJpbmcuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBzdGFja3RyYWNlIGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXhjZXB0aW9uVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcikpOwotCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGRlZmF1bHQgbG9nZ2VyLiBUaGlzIGlzIHVzZWQgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBrbm93IGlmIHRoZXkKLQkgKiBhcmUgcnVubmluZyBpbiBFY2xpcHNlIG9yIG91dHNpZGUgb2YgaXQuIFRoaXMgd2F5IHRoZXkgaGF2ZSBhIGNvbW1vbiBsb2dnZXIgZm9ybWF0Ci0JICogd2hpY2ggc3dpdGNoIGNvcnJlY3RseS4KLQkgKiBAcmV0dXJuIGRlZmF1bHQgbG9nZ2VyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGRlZmF1bHRMb2dnZXIgPSAoTG9nZ2VyKSBMb2dnZXJzLmdldChEZWZhdWx0TG9nZ2VyUGx1Z2luKTsKLQkJaWYgKGRlZmF1bHRMb2dnZXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTsKLQkJCWRlZmF1bHRMb2dnZXIuaW5pdCgpOwotCQkJTG9nZ2Vycy5wdXQoRGVmYXVsdExvZ2dlclBsdWdpbiwgZGVmYXVsdExvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRMb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHBsdWdpbi4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBwbHVnZ2luLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpCi0JCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcigpOwotCQlMb2dnZXIgTG9nZ2VyID0gKExvZ2dlcikgTG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCQlpZiAoTG9nZ2VyID09IG51bGwpIHsKLQkJCUxvZ2dlciA9IG5ldyBMb2dnZXIocGx1Z2luSWQpOwotCQkJTG9nZ2VyLmluaXQoKTsKLQkJCUxvZ2dlcnMucHV0KHBsdWdpbklkLCBMb2dnZXIpOwotCQl9Ci0JCXJldHVybiBMb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgc3ViY2xhc3MgdG8gZ2V0IGEgbG9nZ2VyIGlmIGl0IGV4aXN0cywgYnV0IG5vdCBjcmVhdGUgb25lLgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEByZXR1cm4gbG9nZ2VyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcklmRXhpc3RzKFN0cmluZyBwbHVnaW5JZCkgewotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkKLQkJCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAoTG9nZ2VyKSBMb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gaWQgZm9yIHRoaXMgbG9nZ2VyLgotCSAqIEByZXR1cm4gcGx1Z2luaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gZlBsdWdpbklEOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHRyYWNlIG1vZGUgZm9yIHRoaXMgbG9nZ2VyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cmFjaW5nIGlzIGdvaW5nIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFRyYWNlTW9kZSgpIHsKLQkJcmV0dXJuIGZUcmFjZU1vZGU7Ci0JfQotCQotCS8qCi0JICogSW5kZW50IHRoZSBNc2cuIEJvZHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgbG9nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGVudE1zZyhTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7Ci0JCS8vIExpbmUgc2VwZXJhdG9yIGlzIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQgcGxhdGZvcm0sIHVuaXggPSBcbiwgd2luZG93cyBcclxuIGFuZCBtYWMgXHIKLQkJU3RyaW5nIHNlcCA9IGZMaW5lU2VwZXJhdG9yOwotCQlpZiAobXNnLmluZGV4T2YoIlxyXG4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcbiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzZXAgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcciIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzZXAgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1zZywgc2VwKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCWxvZ01zZy5hcHBlbmQoRmlsbGVyICsgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCX0gZWxzZQotCQkJCWxvZ01zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IgKyBGaWxsZXIgKyB0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JfQotCS8qCi0JICogSWYgRWNsaXBzZSBpcyBzdGFydGVkIHdpdGggdGhlIC1YRGVidWcgb3IgLWRlYnVnIHR1cm4gdHJhY2VzIG9uIGZvciB0aGlzIExvZ2dlcgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIzLzIwMDEgNzozNzowNCBQTSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVidWciKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQlmVHJhY2VNb2RlID0gdHJ1ZTsKLQkJbGV2ZWwgPSBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5wYXJzZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZ0xldmVsIiwgTGV2ZWwuV0FSTklORy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWZMaW5lU2VwZXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyBEaWZmIG9uIFdpbi9Vbml4L01hYyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmTGluZVNlcGVyYXRvciA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKgotCSAqIEdlbmVyaWMgbG9nLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgMTo1NTozNCBQTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdHlwZSBpbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsb2dBbnkoU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQkJU3RyaW5nQnVmZmVyIGxvZ01zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbG9nTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7Ci0JCWxvZ01zZy5hcHBlbmQoTG9nTWFya1t0eXBlXSk7Ci0JCXJldHVybiBwdW5jaExvZyhsb2dSZXN0KG1zZywgbG9nTXNnKSwgdHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdG8gYmUgdXNlZCBieSByZW5kZXJlcnMgdGhhdCB3YW50IHRvIHB1dCBhIG1zZyBvdXQKLQkgKiBpbiBhIGdlbmVyaWMgZm9ybWF0LiBUaGlzIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQKLQkgKiBzaG91bGQgYmUgbG9nZ2VkLiBJdCBwdXRzIHRoaW5ncyBsaWtlIGhlYWRlcnMgb24gaXQuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcmV0dXJuIFRoZSBnZW5lcmljIG1lc3NhZ2UgZm9yIHRoZSBzdHJpbmcgYW5kIGxldmVsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJpY01zZyhTdHJpbmcgbXNnLCBMZXZlbCBhTGV2ZWwpIHsKLQkJU3RyaW5nQnVmZmVyIGdlbk1zZyA9IG5ldyBTdHJpbmdCdWZmZXIobXNnLmxlbmd0aCgpKzE2KTsKLQkJZ2VuTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7Ci0JCWdlbk1zZy5hcHBlbmQoZ2V0TGV2ZWxIZWFkZXIoYUxldmVsKSk7Ci0JCWdlbk1zZy5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2VuTXNnLmFwcGVuZChuZXcgRGF0ZSgpKTsKLQkJaW5kZW50TXNnKG1zZywgZ2VuTXNnKTsKLQkJcmV0dXJuIGdlbk1zZy50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIExFVkVMX1NFQVJDSCA9IG5ldyBMZXZlbFtdIHsKLQkJTGV2ZWwuU0VWRVJFLAotCQlMZXZlbC5XQVJOSU5HLAotCQlMZXZlbC5JTkZPLAotCQlJTG9nUmVuZGVyZXIyLlRSQUNFCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMRVZFTF9NQVJLID0gbmV3IFN0cmluZ1tdIHsKLQkJIioqKiBFUlJPUiAqKioiLCAvLyROT04tTkxTLTEkCi0JCSIrKysgV2FybmluZyArKysiLCAvLyROT04tTkxTLTEkCi0JCSJJbmZvIiwgLy8kTk9OLU5MUy0xJAotCQkiW1RyYWNlXSIgLy8kTk9OLU5MUy0xJAotCX07Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGV2ZWxIZWFkZXIoTGV2ZWwgYUxldmVsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxMRVZFTF9TRUFSQ0gubGVuZ3RoOyBpKyspCi0JCQlpZiAoTEVWRUxfU0VBUkNIW2ldID09IGFMZXZlbCkKLQkJCQlyZXR1cm4gTEVWRUxfTUFSS1tpXTsKLQkJcmV0dXJuIGFMZXZlbC5nZXROYW1lKCk7CS8vIE5vdCBmb3VuZCwganVzdCB1c2UgbGV2ZWwgc3RyaW5nLgotCX0KLQkKLQkvLyBUaGUgd3JpdGUncyBhcmUgaGVyZSBmb3IgaGlzdG9yeS4gV2lsbCBpbXBsZW1lbnQgdXNpbmcgbG9nKG9iaiwgTGV2ZWwpIGZvciBhbGwgb2YgdGhlIHR5cGVzLgotCi0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coTGV2ZWwsIEV4Y2VwdGlvbikKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIGxvZyhhTGV2ZWwsIGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSkKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShUaHJvd2FibGUgZXgpIHsKLQkJcmV0dXJuIGxvZyhleCk7Ci0JfQotCQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhPYmplY3QsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gbG9nRW50cnkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIE9iamVjdCBsb2dFbnRyeSkgewotCQlyZXR1cm4gbG9nKGxvZ0VudHJ5LCBhTGV2ZWwpOwotCX0KLQkKLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coU3RyaW5nLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gbG9nKHN0cmluZywgYUxldmVsKTsKLQl9Ci0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgVGhyb3dhYmxlIGV4KSB7Ci0JCXJldHVybiBsb2coZXgsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKLQl9Ci0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhMZXZlbCBhTGV2ZWwsIFRocm93YWJsZSBleCkgewotCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLQkgKiBAcmV0dXJuIGxvZ2dpbmcgbGV2ZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTGV2ZWwgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBpcyBiZWluZyBsb2dnZWQuIChlLmcuIGlmIGN1cnJlbnQgbGV2ZWwgaXMgU0VWRVJFLCB0aGVuIEZJTkUgd2lsbCBub3QgYmUgbG9nZ2VkKS4KLQkgKiBAcGFyYW0gcmVxdWVzdGxldmVsCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGV2ZWwgd2lsbCBiZSBsb2dnZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2dnaW5nTGV2ZWwoTGV2ZWwgcmVxdWVzdGxldmVsKSB7Ci0JCWlmIChyZXF1ZXN0bGV2ZWwgPT0gSUxvZ1JlbmRlcmVyMi5UUkFDRSAmJiAhZ2V0VHJhY2VNb2RlKCkpCi0JCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGFyZW4ndCB0cmFjaW5nIGJ1dCByZXF1ZXN0ZWQgdHJhY2UuCi0JCQotCQlyZXR1cm4gIShyZXF1ZXN0bGV2ZWwuaW50VmFsdWUoKSA8IGdldExldmVsKCkuaW50VmFsdWUoKSB8fCBnZXRMZXZlbCgpID09IExldmVsLk9GRik7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHN0cmluZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nRXJyb3IoU3RyaW5nIG1zZykgewotCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuU0VWRVJFKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdGhyb3dhYmxlCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dFcnJvcihUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLlNFVkVSRSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGluZm8gbWVzc2FnZS4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBsb2cobXNnLCBMZXZlbC5JTkZPKTsKLQl9Ci0JCi0vKioKLSAqIExvZyBhIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCi0gKiBAcGFyYW0gZQotICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLklORk8pOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIGxvZ01zZyBidWZmZXIgcGFzc2VkIGluLiBBcHBlbmQgdGhlIGRhdGUgYW5kIGZvcm1hdCB0aGUKLQkgKiBzdHJpbmcgd2l0aCBuaWNlIGluZGVudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbG9nTXNnCi0JICogQHJldHVybiB0aGUgc3RyaW5nIGZyb20gdGhlIGxvZ01zZyBhZnRlciBsb2dnaW5nIHRoZSByZXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nUmVzdChTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7Ci0JCWxvZ01zZy5hcHBlbmQobmV3IERhdGUoKSk7Ci0JCWluZGVudE1zZyhtc2csIGxvZ01zZyk7Ci0JCXJldHVybiBsb2dNc2cudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIG1zZyBhcyB0cmFjZSBvbmx5LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dUcmFjZShTdHJpbmcgbXNnKSB7Ci0JCWlmIChmVHJhY2VNb2RlKQotCQkJcmV0dXJuIGxvZyhtc2csIElMb2dSZW5kZXJlcjIuVFJBQ0UpOwotCQllbHNlCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLk5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGFzIHRyYWNlIG9ubHkuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dUcmFjZShUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIElMb2dSZW5kZXJlcjIuVFJBQ0UpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgbWVzc2FnZSBhcyB3YXJuaW5nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIGxvZyhtc2csIExldmVsLldBUk5JTkcpOwotCX0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JfQotCQotCS8qKgotCSAqIEFzayB0aGUgUmVuZGVyZXIgdG8gcHVuY2ggdGhlIG1zZy4gaW4gdGhlIGxvZy4uIG9uZQotCSAqIGNhbGxlciBhdCB0aGUgdGltZQotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgOToxOToxNyBBTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdHlwZSBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBwdW5jaExvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCQlyZXR1cm4gZlJlbmRlcmVyLmxvZyhtc2csIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHJlbmRlcmVyIHRvIHVzZS4KLQkgKiBAcGFyYW0gcmVuZGVyZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihJTG9nUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJZlJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JCXJlbmRlcmVyMiA9IChyZW5kZXJlciBpbnN0YW5jZW9mIElMb2dSZW5kZXJlcjIpID8gKElMb2dSZW5kZXJlcjIpIHJlbmRlcmVyIDogbnVsbDsKLQkJcmVuZGVyZXIuc2V0VHJhY2VNb2RlKGdldFRyYWNlTW9kZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB0cmFjZSBtb2RlLgotCSAqIEBwYXJhbSBmbGFnIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gb24gdHJhY2luZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7Ci0JCWZUcmFjZU1vZGUgPSBmbGFnOwotCQlpZiAoZlJlbmRlcmVyICE9IG51bGwpCi0JCQlmUmVuZGVyZXIuc2V0VHJhY2VNb2RlKGZsYWcpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGxldmVsIGN1dG9mZiBmb3IgbG9nZ2luZy4gQW55dGhpbmcgYmVsb3cgdGhpcyBsZXZlbCB3aWxsIG5vdCBsb2cuCi0JICogRG8gbm90IHNldCBsZXZlbCB0byA8Y29kZT5JTG9nUmVuZGVyZXIyLlRSQUNFPC9jb2RlPi4gSXQgZG9lc24ndCBtYWtlIHNlbnNlLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCAoVXNlIDxjb2RlPklMb2dSZW5kZXJlcjIuREVGQVVMVDwvY29kZT4gdG8gcmVzdG9yZSB0byBkZWZhdWx0IGZvciB0aGlzIGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChMZXZlbCBsZXZlbCkgewotCQl0aGlzLmxldmVsID0gbGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBkZWZhdWx0TGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIEl0IHdvbid0IHRvdWNoIHRoZSBjdXJyZW50IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRMZXZlbChMZXZlbCBsZXZlbCkgewotCQl0aGlzLmRlZmF1bHRMZXZlbCA9IGxldmVsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZyBmaWxlIG5hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2dGaWxlTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gbG9nRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2cgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSBsb2dGaWxlTmFtZSBUaGUgbG9nRmlsZU5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQl0aGlzLmxvZ0ZpbGVOYW1lID0gbG9nRmlsZU5hbWU7Ci0JfQotCQotCS8vIE5vdyBhbGwgb2YgdGhlIGxvZygpIHR5cGVzIHRoYXQgdXNlIGEgTGV2ZWwuCi0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgYSB0aHJvd2FibGUuIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGUsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJU3RyaW5nIHN0YWNrVHJhY2UgPSBleGNlcHRpb25Ub1N0cmluZyhlKTsKLQkJCXJldHVybiBsb2dBbnkoc3RhY2tUcmFjZSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLlNFVkVSRSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvKSB7Ci0JCXJldHVybiBsb2cobywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKG8sIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihvKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvLyBUaGUgZm9sbG93aW5nIGFyZSBhZGRlZCB0byBtYXRjaCB1cCB3aXRoIEh5YWRlcyBzbyB0aGF0IHByaW1pdGl2ZXMgY2FuIGJlIGxvZ2dlZCB0b28uCi0JCi0JLyoqCi0JICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZGVmYXVsdCBsZXZlbC4gCi0JICogQHBhcmFtIGIKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiKSB7Ci0JCXJldHVybiBsb2coYiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGIsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihiKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gYwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMpIHsKLQkJcmV0dXJuIGxvZyhjLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGMsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihjKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gYgotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIpIHsKLQkJcmV0dXJuIGxvZyhiLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhiLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzKSB7Ci0JCXJldHVybiBsb2cocywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhzLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YocyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGludCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gaQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSkgewotCQlyZXR1cm4gbG9nKGksIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgaW50IGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBpCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGksIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihpKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwpIHsKLQkJcmV0dXJuIGxvZyhsLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBsCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhsLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YobCksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gZgotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmKSB7Ci0JCXJldHVybiBsb2coZiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhmLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoZiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbAotCSAqIEBwYXJhbSBkCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkKSB7Ci0JCXJldHVybiBsb2coZCwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGxldmVsCi0JICogCi0JICogQHBhcmFtIGQKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZCwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGQpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qCi0JICogVHVybiBuZXcgdHlwZSBpbnRvIG9sZCB0eXBlLiBUaGUgZGVmYXVsdExldmVsIGlzIHRoZQotCSAqIGxldmVsIHRvIHVzZSBpZiB0aGUgaW5jb21pbmcgbGV2ZWwgaXMgbWFya2VkIGFzIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0T2xkVHlwZShMZXZlbCBhTGV2ZWwpIHsKLQkJaWYgKGFMZXZlbCA9PSBMZXZlbC5TRVZFUkUpCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUjsKLQkJZWxzZSBpZiAoYUxldmVsID09IExldmVsLldBUk5JTkcpCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19XQVJOSU5HOwotCQllbHNlIGlmIChhTGV2ZWwgPT0gTGV2ZWwuSU5GTykKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87Ci0JCWVsc2UgaWYgKGFMZXZlbCA9PSBJTG9nUmVuZGVyZXIyLlRSQUNFKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfVFJBQ0U7Ci0JCWVsc2UKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4YTQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDUvMDYvMTYgMjA6MTQ6MjcgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgSU5TVEFOQ0U7Ci0JCi0Jc3RhdGljIHsKLQkJSU5TVEFOQ0UgPSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBDbGFzcyBDT05UUklCVVRPUl9DTEFTUyA9IElFTUZDb250ZXh0Q29udHJpYnV0b3IuY2xhc3M7Ci0JcHJvdGVjdGVkIE1hcCBlbWZDb250ZXh0Q2FjaGUgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQotCQotCXByaXZhdGUgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZSgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZUZyb21FeHRlbnNpb24oKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZUZyb21FeHRlbnNpb24oKSB7Ci0JCWZpbmFsIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5W10gZmFjdG9yeUhvbGRlciA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeVsxXTsKLQkJUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFJlZ2lzdHJ5UmVhZGVyKEpFTVV0aWxQbHVnaW4uSUQsICJpbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5IikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImZhY3RvcnlDbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlmYWN0b3J5SG9sZGVyWzBdID0gKEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmYWN0b3J5SG9sZGVyWzBdOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFTUZOYXR1cmVGYWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY2FjaGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0LCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBlbWZDb250ZXh0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsICYmIGVtZkNvbnRleHQgIT0gbnVsbCkKLQkJCWVtZkNvbnRleHRDYWNoZS5wdXQoYVByb2plY3QsIGVtZkNvbnRleHQpOwotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRDYWNoZWRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSkgZW1mQ29udGV4dENhY2hlLmdldChhUHJvamVjdCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmFQcm9qZWN0PC9jb2RlPiBpcyBlaXRoZXIgYmVpbmcgY2xvc2VkIG9yIGRlbGV0ZWQgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91ciBjYWNoZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDYWNoZWRQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsKSAKLQkJCWVtZkNvbnRleHRDYWNoZS5yZW1vdmUoYVByb2plY3QpOyAKLQkJCi0JfQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBvciBleGlzdGluZyBFTUZOYXR1cmUgb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LiBBbGxvdyB0aGUgPGNvZGU+Y29udHJpYnV0b3I8L2NvZGU+Ci0JICogdG8gY29udHJpYnV0ZSB0byB0aGUgbmV3IG9yIGV4aXN0aW5nIG5hdHVyZSBwcmlvciB0byByZXR1cm5pbmcuCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJbRU1GV29ya2JlbmNoQ29udGV4dEJhc2VdIiArIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzAiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiW0VNRldvcmtiZW5jaENvbnRleHRCYXNlXSIgKyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8xIiwgbmV3IE9iamVjdFtde2FQcm9qZWN0LmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNvbnRleHQgPSBnZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJYm9vbGVhbiBjb250cmlidXRvckZvdW5kID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCWNvbnRleHQgPSBwcmltQ3JlYXRlRU1GQ29udGV4dChhUHJvamVjdCk7Ci0JCQljYWNoZUVNRkNvbnRleHQoYVByb2plY3QsIGNvbnRleHQpOwotCQkJY29udHJpYnV0b3JGb3VuZCA9IGluaXRpYWxpemVFTUZDb250ZXh0RnJvbUNvbnRyaWJ1dG9ycyhhUHJvamVjdCwgY29udGV4dCwgY29udHJpYnV0b3IpOwotCQl9Ci0JCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIGNvbnRleHQgIT0gbnVsbCAmJiAhY29udHJpYnV0b3JGb3VuZCkKLQkJCWNvbnRyaWJ1dG9yLnByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGNvbnRleHQpOwotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZUVNRkNvbnRleHRGcm9tQ29udHJpYnV0b3JzKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBlbWZDb250ZXh0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCWJvb2xlYW4gY29udHJpYnV0b3JGb3VuZCA9IGZhbHNlOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBlbWZDb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gY29udHJpYnV0b3JGb3VuZDsKLQkJTGlzdCBydW50aW1lcyA9IEVNRk5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZXMoYVByb2plY3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSAoSVByb2plY3ROYXR1cmUpIHJ1bnRpbWVzLmdldChpKTsKLQkJCWlmIChuYXR1cmUgIT0gbnVsbCAmJiBDT05UUklCVVRPUl9DTEFTUy5pc0luc3RhbmNlKG5hdHVyZSkpIHsKLQkJCQlpZiAobmF0dXJlID09IGNvbnRyaWJ1dG9yKQotCQkJCQljb250cmlidXRvckZvdW5kID0gdHJ1ZTsKLQkJCQkoKElFTUZDb250ZXh0Q29udHJpYnV0b3IpIG5hdHVyZSkucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoZW1mQ29udGV4dCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRyaWJ1dG9yRm91bmQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYXR1cmVFbmFibGVkKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhUHJvamVjdC5pc05hdHVyZUVuYWJsZWQobmF0dXJlSWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXROYXR1cmVJZHMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCQlyZXR1cm4gYVByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0TmF0dXJlIGdldE5hdHVyZShJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYVByb2plY3QuZ2V0TmF0dXJlKG5hdHVyZUlkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBwcmltQ3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVNRldvcmtiZW5jaENvbnRleHRCYXNlKGFQcm9qZWN0KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXN0aW5nIEVNRk5hdHVyZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIGdldENhY2hlZEVNRkNvbnRleHQoYVByb2plY3QpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBjcmVhdGVTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyKGFSZXNvdXJjZVNldCwgYVByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTI4MzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFByb2plY3RSZXNvdXJjZVNldEltcGwuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yMCAkJCAgJCREYXRlOiAyMDA4LzAzLzEyIDE0OjIxOjQwICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc291cmNlU2V0SW1wbCBleHRlbmRzIFJlc291cmNlU2V0SW1wbCBpbXBsZW1lbnRzIEZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0IHsKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNb2R1bGVVUkkgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJfUFJPVE9DT0xfSU5EWCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTkFNRV9JTkRYID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX05BTUVfSU5EWCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9JTkRYID0gMzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxlYXNpbmcgPSBmYWxzZTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIExpc3QgcmVzb3VyY2VIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKCkgewotCQlzZXRVUklSZXNvdXJjZU1hcChuZXcgSGFzaE1hcCgxMCkpOwkvLyBUZWxsIGl0IHRvIGNhY2hlIHVyaS0+cmVzb3VyY2UgYWNjZXNzLgotCQlnZXRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX1BBUlNFUl9QT09MLCBFTUZOYXR1cmUuU0hBUkVEX1BBUlNFUl9QT09MKTsKLQl9Ci0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdGhpcygpOwotCQlzZXRQcm9qZWN0KGFQcm9qZWN0KTsKLQkJaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKSB7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0U2hhcmVkQ2FjaGUoKS5iZWdpbkxpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxlYXNpbmcoKSB7Ci0JCXJldHVybiBpc1JlbGVhc2luZzsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UoVVJJLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5kZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IGdldFJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkvL0NoZWNrIHRoZSBtYXAgZmlyc3Qgd2hlbiBjcmVhdGluZyB0aGUgcmVzb3VyY2UgYW5kIGRvIG5vdAotCQkvL25vcm1hbGl6ZSBpZiBhIHZhbHVlIGlzIGZvdW5kLgotCQlib29sZWFuIGlzTWFwcGVkID0gZGV0ZWN0VVJJTWFwcGluZyh1cmkpOwotCQlib29sZWFuIGhhc0NvbnRlbnRUeXBlID0gKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpICE9IG51bGwpOwotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAoIWlzTWFwcGVkKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWVsc2UgaWYgKGhhc0NvbnRlbnRUeXBlKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQotCQlSZXNvdXJjZSByZXN1bHQgPSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhjb252ZXJ0ZWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJICAgIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KHVyaSk7Ci0JCSAgICBpZiAocmVzb3VyY2VGYWN0b3J5ICE9IG51bGwpCi0JCSAgICB7Ly9XZSBnb3QgdGhlIHJpZ2h0IGZhY3RvcnksIG5vdyB1c2UgdGhlIHJpZ2h0IFVSSQotCQkgICAgICByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoY29udmVydGVkKTsKLQkJICAgICAgZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCSAgICB9Ci0JCX0KLQkJCQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBDb250ZW50SGFuZGxlci5VTlNQRUNJRklFRF9DT05URU5UX1RZUEUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkZXRlY3RVUklNYXBwaW5nKFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAhKCgoVVJJQ29udmVydGVySW1wbC5VUklNYXApZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpLmVxdWFscyh1cmkpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCVN0cmluZyBmaWxlU3RyaW5nID0gVVJJLmRlY29kZSh1cmkucGF0aCgpKTsKLQkJCWZpbGVTdHJpbmcgPSBmaWxlU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpICsgMSk7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCS8vQ2hlY2sgdGhlIG1hcCBmaXJzdCB3aGVuIGNyZWF0aW5nIHRoZSByZXNvdXJjZSBhbmQgZG8gbm90Ci0JCS8vbm9ybWFsaXplIGlmIGEgdmFsdWUgaXMgZm91bmQuCi0JCWJvb2xlYW4gaXNNYXBwZWQgPSBkZXRlY3RVUklNYXBwaW5nKHVyaSk7Ci0JCWJvb2xlYW4gaGFzQ29udGVudFR5cGUgPSAoZ2V0Q29udGVudFR5cGVOYW1lKHVyaSkgIT0gbnVsbCk7Ci0JCVVSSSBjb252ZXJ0ZWQgPSB1cmk7Ci0JCWlmICghaXNNYXBwZWQpCi0JCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJZWxzZSBpZiAoaGFzQ29udGVudFR5cGUpCi0JCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJUmVzb3VyY2UgcmVzdWx0ID0gY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoY29udmVydGVkKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0KLQkJICAgIGlmIChyZXNvdXJjZUZhY3RvcnkgIT0gbnVsbCkKLQkJICAgIHsKLQkJICAgICAgcmVzdWx0ID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKGNvbnZlcnRlZCk7Ci0JCSAgICAgIGdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQkgICAgICBnZXRVUklSZXNvdXJjZU1hcCgpLnB1dCh1cmksIHJlc3VsdCk7Ci0JCSAgICAgIHJldHVybiByZXN1bHQ7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJldHVybiBudWxsOwotCQkgICAgfQotCQkgIAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQoUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1JlbGVhc2luZykKLQkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBkZWNpZGUgdG8gY3JlYXRlIHRoZSBSZXNvdXJjZSBpbiBhbm90aGVyIG1hbm5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7Ci0JCQlyZXNvdXJjZSA9IGhhbmRsZXIuY3JlYXRlUmVzb3VyY2UodGhpcywgdXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogU2VlIGlmIGFueSByZXNvdXJjZSBoYW5kbGVycyBmcm9tIHRoZSBXb3JrYmVuY2hDb250ZXh0Ci0JICogY2FuIHJldHVybiBhIFJlc291cmNlIGZyb20gYSA8Y29kZT51cmk8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSkpLmdldFJlc291cmNlKHRoaXMsIHVyaSk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIFNlbmQgb3V0IG5vdGlmaWNhdGlvbiBvZiByZWxlYXNlLgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgTm90aWZpY2F0aW9uLk5PX0lOREVYLCBmYWxzZSkgewotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKENsYXNzIGV4cGVjdGVkQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEOwotCQkJCX0KLQkJCQkKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCXJldHVybiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLnRoaXM7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJc2V0SXNSZWxlYXNpbmcodHJ1ZSk7Ci0JCWlmIChzeW5jaHJvbml6ZXIgIT0gbnVsbCkKLQkJCXN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCXN5bmNocm9uaXplciA9IG51bGw7Ci0JCXJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpOwotCQlyZXNvdXJjZUhhbmRsZXJzID0gbnVsbDsKLQkJZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJc2V0UHJvamVjdChudWxsKTsKLQkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLnN0b3BMaXN0ZW5pbmcodGhpcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpIHsKLQkJYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsKLQkJaWYgKGdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgcmV0dXJuOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKTsKLQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJUmVzb3VyY2UgcmVzOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJcmVzLnVubG9hZCgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJY2F1Z2h0RXhjZXB0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoY2F1Z2h0RXhjZXB0aW9uKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbihzKSB1bmxvYWRpbmcgcmVzb3VyY2VzIC0gY2hlY2sgbG9nIGZpbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0SXNSZWxlYXNpbmcoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpc1JlbGVhc2luZyA9IGFCb29sZWFuOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIElQcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSh1cmkudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkJCXJlc3VsdCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRFT2JqZWN0RnJvbUhhbmRsZXJzKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogU2VlIGlmIGFueSByZXNvdXJjZSBoYW5kbGVycyBmcm9tIHRoZSBXb3JrYmVuY2hDb250ZXh0Ci0JICogY2FuIHJldHVybiBhIEVPYmplY3QgZnJvbSBhIDxjb2RlPnVyaTwvY29kZT4gYWZ0ZXIKLQkgKiBmYWlsaW5nIHRvIGZpbmQgaXQgdXNpbmcgdGhlIG5vcm1hbCBtZWNoYW5pc21zLgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RGcm9tSGFuZGxlcnMoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmogPSBudWxsOwotCQlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJaGFuZGxlciA9IChSZXNvdXJjZUhhbmRsZXIpIHJlc291cmNlSGFuZGxlcnMuZ2V0KGkpOwotCQkJb2JqID0gaGFuZGxlci5nZXRFT2JqZWN0RmFpbGVkKHRoaXMsIHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQlyZXR1cm4gb2JqOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhZGQoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgewotCQlyZXR1cm4gcmVzb3VyY2VIYW5kbGVycy5hZGQocmVzb3VyY2VIYW5kbGVyKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRmlyc3QoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgewotCQlyZXNvdXJjZUhhbmRsZXJzLmFkZCgwLCByZXNvdXJjZUhhbmRsZXIpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgewotCQlyZXR1cm4gcmVzb3VyY2VIYW5kbGVycy5yZW1vdmUocmVzb3VyY2VIYW5kbGVyKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3luY2hyb25pemVyLgotCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gc3luY2hyb25pemVyOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBzeW5jaHJvbml6ZXIuCi0JICogQHBhcmFtIHN5bmNocm9uaXplciBUaGUgc3luY2hyb25pemVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I3NldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSBmYWN0b3J5UmVnKSB7Ci0JCWlmIChyZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSAhPSBudWxsICYmIGZhY3RvcnlSZWcgIT0gbnVsbCkgewotCQkJcHJlc2VydmVFbnRyaWVzKGZhY3RvcnlSZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCksIHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpKTsKLQkJCXByZXNlcnZlRW50cmllcyhmYWN0b3J5UmVnLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCksIHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkpOwotCQl9Ci0JCXN1cGVyLnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KGZhY3RvcnlSZWcpOwotCX0KLQkvKgotCSAqIFByZXNlcnZlIHRoZSBlbnRyaWVzIGZyb20gbWFwMiBpbiBtYXAxIGlmIG5vIGNvbGxpc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVzZXJ2ZUVudHJpZXMoTWFwIG1hcDEsIE1hcCBtYXAyKSB7Ci0JCWlmIChtYXAyLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBtYXAyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWlmICghbWFwMS5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpCi0JCQkJbWFwMS5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0KLQkgICAgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbWFwLmdldCh1cmkpOwotCSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCSAgICAgICAgfSAgICAgICAgCi0JICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICBVUklDb252ZXJ0ZXIgdGhlVVJJQ29udmVydGVyID0gZ2V0VVJJQ29udmVydGVyKCk7Ci0JICAgIFVSSSBub3JtYWxpemVkVVJJID0gdGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCSAgICBMaXN0IHJlc291cmNlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogZ2V0UmVzb3VyY2VzKCkpCi0JICAgIHsKLQkgICAgICBpZiAodGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZS5nZXRVUkkoKSkuZXF1YWxzKG5vcm1hbGl6ZWRVUkkpKSB7Ci0JICAgIAkJICAKLQkgICAgCWlmIChnZXRDb250ZW50VHlwZU5hbWUodXJpKSA9PSBudWxsKSB7IC8vIGxvYWRpbmcgZnJvbSBsZWdhY3kgYXJjaGl2ZSBhcGkgb3Igbm9uLXR5cGVkIHJlc291cmNlCi0JCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgCi0JCSAgICAgICAgaWYgKG1hcCAhPSBudWxsKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JCSAgICAgICAgfSAKLQkJICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgIAl9IGVsc2UgIHsvLyBjb250ZW50IHR5cGUgaXMga25vd24KLQkgICAgCQlib29sZWFuIHJlc291cmNlRXhpc3RzID0gZmFsc2U7Ci0JICAgIAkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JICAgIAkJaWYgKGZpbGUgIT0gbnVsbCkKLQkgICAgCQkJcmVzb3VyY2VFeGlzdHMgPSBmaWxlLmV4aXN0cygpOwotCSAgICAJCVN0cmluZyByZXNvdXJjZUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZUlEKHJlc291cmNlKTsKLQkgICAgCQlTdHJpbmcgdXJpQ29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlTmFtZSh1cmkpOwotCSAgICAJCVN0cmluZyBleGlzdGluZ01hcEtleVR5cGUgPSAoZmluZEtleShyZXNvdXJjZSkgIT0gbnVsbCkgPyBnZXRDb250ZW50VHlwZU5hbWUoZmluZEtleShyZXNvdXJjZSkpIDogbnVsbDsKLQkgICAgCQlpZigoIW1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlKSB8fCAoKG1hcC5nZXQodXJpKSAhPSBudWxsKSAmJiBtYXAuZ2V0KHVyaSkuZXF1YWxzKHJlc291cmNlKSkpIC8vIGV4aXN0aW5nIHJlc291cmNlICB3aXRoIGFsdGVybmF0ZSBtYXBwaW5nIGRvZXNuJ3QgZXhpc3QgaW4gbWFwCi0JICAgIAkJCXx8ICAoKHJlc291cmNlQ29udGVudFR5cGVJRCAhPSBudWxsICYmIHJlc291cmNlQ29udGVudFR5cGVJRC5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKSkgewotCQkJCQkJaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkJCQkJfSAvLyBpZiBlbWJlZGRlZCB1cmkgY29udGVudCB0eXBlIGlzIGRpZmZlcmVudCB0aGFuIHJlc291cmNlIGNvbnRlbnQgdHlwZSwgY29udGludWUgc2VhcmNoaW5nCi0JCQkJCQlpZiAocmVzb3VyY2VDb250ZW50VHlwZUlEICE9IG51bGwKLQkJCQkJCQkJJiYgdXJpQ29udGVudFR5cGVJRCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCghcmVzb3VyY2VDb250ZW50VHlwZUlELmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkgfHwgKGV4aXN0aW5nTWFwS2V5VHlwZSAhPSBudWxsICYmICFleGlzdGluZ01hcEtleVR5cGUKLQkJCQkJCQkJCS5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQllbHNlIGlmIChleGlzdGluZ01hcEtleVR5cGUgPT0gbnVsbCAmJiAhcmVzb3VyY2VFeGlzdHMpIHsKLQkJCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICh1cmlDb250ZW50VHlwZUlEICE9IG51bGwgJiYgcmVzb3VyY2VDb250ZW50VHlwZUlEID09IG51bGwgJiYgIXJlc291cmNlRXhpc3RzKSB7Ci0JCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQlpZiAobWFwICE9IG51bGwgJiYgKG1hcC5nZXQodXJpKSA9PSBudWxsKSkgewotCQkJCQkJCW1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJCX0KLQkgICAgCX0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgLy8gQ2xlYW51cCBpbnZhbGlkIHJlc291cmNlcwotCSAgICBnZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzVG9SZW1vdmUpOwotCSAgICBSZXNvdXJjZSBkZWxlZ2F0ZWRSZXNvdXJjZSA9IGRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkgICAgaWYgKGRlbGVnYXRlZFJlc291cmNlICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIGRlbGVnYXRlZFJlc291cmNlKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIGRlbGVnYXRlZFJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgaWYgKGxvYWRPbkRlbWFuZCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZGVtYW5kQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlc291cmNlIGZvciAnIiArIHVyaSArICInOyBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmFjdG9yeSBpcyBuZWVkZWQiKTsKLQkgICAgICB9Ci0JICAgICAgCi0JICAgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JICAgICAgfSAgCi0KLQkgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQotCSAgICAgICAgICAKLQkgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gbnVsbDsKLQkgIAotCX0KLQlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShSZXNvdXJjZSByZXMpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzLmdldFVSSSgpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHJlcy5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJVVJJIGNvbnZlcnRlZFVyaSA9IGNvbnZlcnRlci5ub3JtYWxpemUocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoIXJlcy5nZXRVUkkoKS5lcXVhbHMoY29udmVydGVkVXJpKSkKLQkJCQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShjb252ZXJ0ZWRVcmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlEKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzb3VyY2UpOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCQkJZGVzYyA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChkZXNjICE9IG51bGwgJiYgZGVzYy5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZGVzYy5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIFVSSSBmaW5kS2V5KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1hcCBhTWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkJU2V0IGtleXMgPSBhTWFwLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlVUkkgbmFtZSA9IChVUkkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhTWFwLmdldChuYW1lKS5lcXVhbHMocmVzb3VyY2UpKQotCQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZU5hbWUoVVJJIHVyaSkgewotCQkKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSB8fCAhaXNWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKHVyaSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllciA9ICh1cmkuc2VnbWVudENvdW50KCkgPiAzID8gdXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSA6IG51bGwpOwotCQlpZiAoY29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwgJiYgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSkgIT0gbnVsbCkKLQkJCXJldHVybiBjb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJKSB7Ci0JCWlmIChhTW9kdWxlVVJJLnNlZ21lbnRDb3VudCgpIDwgMykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJCi0KLQkgICAgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbWFwLmdldCh1cmkpOwotCSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCSAgICAgICAgfSAgICAgICAgCi0JICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICBVUklDb252ZXJ0ZXIgdGhlVVJJQ29udmVydGVyID0gZ2V0VVJJQ29udmVydGVyKCk7Ci0JICAgIFVSSSBub3JtYWxpemVkVVJJID0gdGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCSAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogZ2V0UmVzb3VyY2VzKCkpCi0JICAgIHsKLQkgICAgICBpZiAodGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZS5nZXRVUkkoKSkuZXF1YWxzKG5vcm1hbGl6ZWRVUkkpKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCSAgICAgICAgfQotCSAgICAgICAgCi0JICAgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgICB7Ci0JICAgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JICAgICAgICB9IAotCSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgUmVzb3VyY2UgZGVsZWdhdGVkUmVzb3VyY2UgPSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JICAgIGlmIChkZWxlZ2F0ZWRSZXNvdXJjZSAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIG1hcC5wdXQodXJpLCBkZWxlZ2F0ZWRSZXNvdXJjZSk7Ci0JICAgICAgfQotCSAgICAgIHJldHVybiBkZWxlZ2F0ZWRSZXNvdXJjZTsKLQkgICAgfQotCi0JICAgIGlmIChsb2FkT25EZW1hbmQpCi0JICAgIHsKLQkgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlbWFuZENyZWF0ZVJlc291cmNlKHVyaSxyZXNvdXJjZUZhY3RvcnkpOwotCSAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVzb3VyY2UgZm9yICciICsgdXJpICsgIic7IGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3J5IGlzIG5lZWRlZCIpOwotCSAgICAgIH0KLQotCSAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCi0JICAgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JICAgICAgfSAgICAgIAotCSAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgfQotCi0JICAgIHJldHVybiBudWxsOwotCSAgCi0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQjcmVzZXROb3JtYWxpemVkVVJJQ2FjaGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCkgewotCQlpZiAoZ2V0VVJJUmVzb3VyY2VNYXAoKSAhPSBudWxsKQotCQkJZ2V0VVJJUmVzb3VyY2VNYXAoKS5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLHJlc291cmNlRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjM0MTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHJlZGlyZWN0LCBpZiBuZWNlc3NhcnksIHRvIGFub3RoZXIgCi0gKiBSZXNvdXJjZVNldC4gIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyCi0gKiBzbyB0aGF0IHRoZSBVUklzIHBhc3NlZCB3aWxsIHVzZSB0aGUgcGxhdGZvcm0gcHJvdG9jb2wuICBBbnl0aGluZyBlbHNlIHdpbGwgYmUgY29uc2lkZXJlZAotICogdG8gYmUgYW1iaWd1b3VzIGFuZCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlZGlyZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyIGltcGxlbWVudHMgUmVzb3VyY2VIYW5kbGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLgotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qCi0JKiBAc2VlIElSZXNvdXJjZUhhbmRsZXIjZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQsIFVSSSkKLQkqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7Ci0JCVVSSSBtYXBwZWRVUkkgPSAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKW9yaWdpbmF0aW5nUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpOwotCQlpZiAoaXNHbG9iYWxQbHVnaW5Mb2FkKG1hcHBlZFVSSSkpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIDxjb2RlPnVyaTwvY29kZT4uCi0JICogVGhlIDxjb2RlPnVyaTwvY29kZT4gd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogICBwbGF0Zm9ybTovcmVzb3VyY2UvW3Byb2plY3QgbmFtZV0uCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQkJaWYgKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgIT0gc2V0KQotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIHNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIDxjb2RlPnVyaTwvY29kZT4uCi0JCSAqIFRoZSA8Y29kZT51cmk8L2NvZGU+IHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgcGxhdGZvcm06L3Jlc291cmNlL1twcm9qZWN0IG5hbWVdLgotCQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJCQotCQlSZXNvdXJjZVNldCBzZXQgPSBKRU1VdGlsUGx1Z2luLmdldFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIHNldCk7Ci0JCX0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2VTZXQgcmVkaXJlY3RlZFJlc291cmNlU2V0KSB7Ci0JCXJldHVybiByZWRpcmVjdGVkUmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQl9Ci0JLyoqCi0JICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgZmlsZSBuYW1lLgotCSAqIFRoaXMgaXMgZm9yIGNvbXBhdGFiaWxpdHkgcHVycG9zZXMgZm9yIHBlb3BsZSB1c2luZyB0aGUgcGxhdGZvcm06L3Jlc291cmNlIHByb3RvY29sLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKLQkJCWlmIChvcmlnaW5hdGluZ1Jlc291cmNlU2V0ICE9IHNldCkKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkJICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgZmlsZSBuYW1lLgotCQkgKiBUaGlzIGlzIGZvciBjb21wYXRhYmlsaXR5IHB1cnBvc2VzIGZvciBwZW9wbGUgdXNpbmcgdGhlIHBsYXRmb3JtOi9yZXNvdXJjZSBwcm90b2NvbC4KLQkJICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkKLQkJUmVzb3VyY2VTZXQgc2V0ID0gSkVNVXRpbFBsdWdpbi5nZXRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpLCBzZXQpOwotCQkJCi0JfQotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCByZWRpcmVjdGVkUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIHJlZGlyZWN0ZWRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3cyA9IGdldFdvcmtzcGFjZSgpOwotCQlpZiAod3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFByb2plY3QocmVzb3VyY2VTZXQpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlc291cmNlSGFuZGxlciNjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCwgVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCi0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7Ci0JCVVSSSBtYXBwZWRVUkkgPSAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKW9yaWdpbmF0aW5nUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpOwotCQlpZiAoaXNHbG9iYWxQbHVnaW5Mb2FkKG1hcHBlZFVSSSkpCi0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlc291cmNlSGFuZGxlciNnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0LCBVUkksIGJvb2xlYW4pCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHbG9iYWxQbHVnaW5Mb2FkKFVSSSBhVVJJKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKGFVUkkpKSB7Ci0JCQlTdHJpbmdbXSBnbG9iYWxQbHVnaW5zID0gSkVNVXRpbFBsdWdpbi5nZXRHbG9iYWxMb2FkaW5nUGx1Z2luTmFtZXMoKTsKLQkJCWZvciAoaW50IGk9MDtpPGdsb2JhbFBsdWdpbnMubGVuZ3RoO2krKykgewotCQkJCWlmIChhVVJJLnNlZ21lbnQoMSkuc3RhcnRzV2l0aChnbG9iYWxQbHVnaW5zW2ldKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMGFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYXB0dXJlIGFsbCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGZyb20gZWFjaCBQcm9qZWN0UmVzb3VyY2VTZXQKLSAqIGFuZCBmb3J3YXJkIGl0IG9uIHRvIGFueSBpbnRlcnJlc3RlZCBsaXN0ZW5lcnMuICBUaGlzIGlzIHRvIGFsbG93IHlvdSB0byBsaXN0ZW4gdG8gb25lIG9iamVjdAotICogdG8gZ2FpbiBhbGwgQUREIGFuZCBSRU1PVkUgbm90aWZpY2F0aW9ucyBmb3IgZWFjaCBSZXNvdXJjZVNldCB3aXRoaW4gdGhlIHN5c3RlbS4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgZXh0ZW5kcyBOb3RpZmllckltcGwgewotCXByb3RlY3RlZCBBZGFwdGVyIHByb2plY3RBZGFwdGVyID0gbmV3IFdvcmtzcGFjZVJlc291cmNlQ2FjaGVBZGFwdGVyKCk7Ci0KLQljbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZUNhY2hlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJLyoqCi0JCSAqIEZvcndhcmQgQUREIGFuZCBSRU1PVkUgbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJCQllTm90aWZ5KG1zZyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdvcmtzcGFjZVJlc291cmNlQ2FjaGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQmVnaW4gbGlzdGVuaW5nIHRvIGEgUHJvamVjdFJlc291cmNlU2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luTGlzdGVuaW5nKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKGFSZXNvdXJjZVNldCAhPSBudWxsKSB7IAotCQkJaWYgKGFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKSA9PSBudWxsIHx8ICAKLQkJCSFhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuY29udGFpbnMocHJvamVjdEFkYXB0ZXIpKQotCQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZChwcm9qZWN0QWRhcHRlcik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZyhQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgIT0gbnVsbCkKLQkJCWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5yZW1vdmUocHJvamVjdEFkYXB0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmVSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWY3YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRk5hdHVyZVJlZ2lzdHJ5LmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotcHVibGljIGNsYXNzIEVNRk5hdHVyZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfUkVHSVNUUkFUSU9OX1BPSU5UID0gIm9yZy5lY2xpcHNlLmplbS51dGlsLm5hdHVyZV9yZWdpc3RyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRSAgPSAibmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgRU1GTmF0dXJlUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFTUZOYXR1cmVSZWdpc3RyeSBzaW5nbGV0b247Ci0JCi0JcHVibGljIGZpbmFsIFNldCBSRUdJU1RFUkVEX05BVFVSRV9JRFMgPSBuZXcgSGFzaFNldCgpOwotCQotCXB1YmxpYyBzdGF0aWMgRU1GTmF0dXJlUmVnaXN0cnkgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgRU1GTmF0dXJlUmVnaXN0cnkoKTsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCS8vIHJlZ2lzdGVyIE5hdHVyZSBJRHMgZm9yIHRoZSBKMkVFTmF0dXJlcwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgciA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlID0gci5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTkFUVVJFX1JFR0lTVFJBVElPTl9QT0lOVCk7Ci0JCVN0cmluZyBuYXR1cmVJZDsKLQkJZm9yIChpbnQgaT0wOyBpPGNlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2VbaV0uZ2V0TmFtZSgpLmVxdWFscyhOQVRVUkUpKSB7Ci0JCQkJbmF0dXJlSWQgPSBjZVtpXS5nZXRBdHRyaWJ1dGUoU1RBVElDX0lEKTsKLQkJCQlpZiAobmF0dXJlSWQgIT0gbnVsbCkKLQkJCQkJcmVnaXN0ZXJOYXR1cmVJRChuYXR1cmVJZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJOYXR1cmVJRChTdHJpbmcgbmF0dXJlSWQpIHsKLQkJaWYgKCFSRUdJU1RFUkVEX05BVFVSRV9JRFMuY29udGFpbnMobmF0dXJlSWQpKQotCQkJUkVHSVNURVJFRF9OQVRVUkVfSURTLmFkZChuYXR1cmVJZCk7Ci0JCWVsc2UKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZOYXR1cmVSZWdpc3RyeV9FUlJPUl8wIiwgbmV3IE9iamVjdFtdIHtuYXR1cmVJZH0pKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWE4ZTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJlbWZ3b3JrYmVuY2giKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCQkKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCXRyeSB7cmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7cmV0dXJuIGdldFN0cmluZyhrZXkpO30KLQotfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9DaGFyYWN0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDUyYjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9DaGFyYWN0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuVVRGMTY7Ci0gCi0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBoYW5kbGUgY2hhcmFjdGVycyBpbiB0aGUgbmV3IFVURiBtdWx0aS1jaGFyIGZvcm1hdC4KLSAqIEl0IGlzIG5lZWRlZCBiZWNhdXNlIElDVTRKIGN1cnJlbnRseSBkb2Vzbid0IGhhbmRsZSBzb21lIGNvcnJlY3RseSB5ZXQgdGhhdCB3ZQotICogbmVlZCB0byBoYXZlIHdvcmtpbmcuIEFzIElDVTRKIGdldHMgdGhlbSB3b3JraW5nLCB0aGUgbWV0aG9kcyBoZXJlIHdpbGwgYmVjb21lCi0gKiBkZXByZWNhdGVkLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIENoYXJhY3RlclV0aWwgewotCi0JcHJpdmF0ZSBDaGFyYWN0ZXJVdGlsKCkgewotCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogVE9ETyBTbyB1bnRpbCBJQ1U0SiBkb2VzIHdvcmsgY29ycmVjdGx5IHRoaXMgdXRpbCB3aWxsIGJlIG5lZWRlZC4gSXQgd2lsbAotCSAqIHN0YXkgYXJvdW5kIGJlY2F1c2UgaXQgaXMgQVBJLCBidXQgYXQgdGhhdCB0aW1lIGl0IHdpbGwgYmUgbWFya2VkIGRlcHJlY2F0ZWQuIEl0IHNob3VsZAotCSAqIGFsc28gdGhlbiByZXJvdXRlIHRvIElDVTRKIGluc3RlYWQgb2YgZG9pbmcgdGhlIG1ldGhvZCByZWZsZWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCwgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUOwotCQotCXN0YXRpYyB7Ci0JCS8vIFRyeSB0byBnZXQgdGhlIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyKGludCkgbWV0aG9kLiBJZiB0aGVyZSwgdGhlbiB3ZSBhcmUgaW4gMS41IG9yIGFib3ZlLiBFbHNlIHVzZSB0aGUgY2hhciBmb3JtLgotCQl0cnkgewotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IENoYXJhY3Rlci5jbGFzcy5nZXRNZXRob2QoImlzSmF2YUlkZW50aWZpZXJTdGFydCIsIG5ldyBDbGFzc1tdIHtJbnRlZ2VyLlRZUEV9KTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gRGVmYXVsdCB0byB1c2UgKGNoYXIpIHR5cGUgaW5zdGVhZC4KLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgPSBudWxsOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gRGVmYXVsdCB0byB1c2UgKGNoYXIpIHR5cGUgaW5zdGVhZC4KLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgPSBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBDaGFyYWN0ZXIuY2xhc3MuZ2V0TWV0aG9kKCJpc0phdmFJZGVudGlmaWVyUGFydCIsIG5ldyBDbGFzc1tdIHtJbnRlZ2VyLlRZUEV9KTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gRGVmYXVsdCB0byB1c2UgKGNoYXIpIHR5cGUgaW5zdGVhZC4KLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IG51bGw7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gbnVsbDsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogSXMgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyCi0JICogQHBhcmFtIGludENoYXIgaW50IGNoYXJhY3RlciAoVVRGIG11bHRpLWNoYXIgaXMgdmFsaWQpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIuCi0JICogCi0JICogQHNlZSBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydChpbnQgaW50Q2hhcikgewotCQlpZiAoTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEJvb2xlYW4pIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW50Q2hhcil9KSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCgoY2hhcikgaW50Q2hhcik7Ci0JfQotCQotCS8qKgotCSAqIElzIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBpbnRDaGFyIGludCBjaGFyYWN0ZXIgKFVURiBtdWx0aS1jaGFyIGlzIHZhbGlkKQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBzZWUgQ2hhcmFjdGVyI2lzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyKQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyUGFydChpbnQgaW50Q2hhcikgewotCQlpZiAoTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQm9vbGVhbikgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJULmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGludENoYXIpfSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoY2hhcikgaW50Q2hhcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGFySXRlcmF0b3IgewotCi0JCQotCQlwcm90ZWN0ZWQgZmluYWwgQ2hhclNlcXVlbmNlIGNoYXJTZXE7Ci0JCXByaXZhdGUgaW50IHBvcyA9IDA7Ci0JCXByaXZhdGUgaW50IGxhc3RDaGFySW5kZXggPSAwOwotCi0JCS8qKgotCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KLQkJICogQHBhcmFtIGNoYXJTZXEKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0Q2hhckl0ZXJhdG9yKENoYXJTZXF1ZW5jZSBjaGFyU2VxKSB7Ci0JCQl0aGlzLmNoYXJTZXEgPSBjaGFyU2VxOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBuZXh0IGNoYXIgaW5kZXguCi0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXBvcyA9IGluZGV4OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEhhcyBhbm90aGVyIGNoYXIuCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYW5vdGhlciBjaGFyIHRvIHJldHVybi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBwb3MgPCBjaGFyU2VxLmxlbmd0aCgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogSGFzIGFub3RoZXIgY2hhciBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uIERvaW5nIHByZXZpb3VzCi0JCSAqIHdpbGwgcmV0dXJuIHRoZSBjaGFyIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCQlyZXR1cm4gcG9zID4gMDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiBuZXh0IGNoYXIgZnJvbSB0aGUgb25lIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQuCi0JCSAqIEByZXR1cm4gbmV4dCBjaGFyLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHQoKSB7Ci0JCQlpZiAoIWhhc05leHQoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkKLQkJCWludCBuZXh0ID0gdXRmQ2hhckF0KHBvcyk7Ci0JCQlsYXN0Q2hhckluZGV4ID0gcG9zOwotCQkJcG9zICs9IFVURjE2LmdldENoYXJDb3VudChuZXh0KTsKLQkJCXJldHVybiBuZXh0OwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBVVEYtMzIgY2hhciBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0JCSAqIEBwYXJhbSBwb3MKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHV0ZkNoYXJBdChpbnQgcG9zKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIGNoYXJhY3RlciBmcm9tIHRoZSBvbmUgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgaW50IHByZXZpb3VzKCkgewotCQkJaWYgKCFoYXNQcmV2aW91cygpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQotCQkJaW50IG5leHQ7Ci0JCQlpZiAoVVRGMTYuaXNUcmFpbFN1cnJvZ2F0ZShjaGFyU2VxLmNoYXJBdCgtLXBvcykpKSB7Ci0JCQkJaWYgKHBvcyA+IDApCi0JCQkJCW5leHQgPSB1dGZDaGFyQXQoLS1wb3MpOwotCQkJCWVsc2UKLQkJCQkJbmV4dCA9IGNoYXJTZXEuY2hhckF0KHBvcyk7Ci0JCQl9IGVsc2UgewotCQkJCW5leHQgPSBjaGFyU2VxLmNoYXJBdChwb3MpOwotCQkJfQotCQkJbGFzdENoYXJJbmRleCA9IHBvczsKLQkJCXJldHVybiBuZXh0OwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBVVEYxNiBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhlIGNoYXIgdGhhdCB3YXMganVzdCByZXR1cm5lZCBmcm9tIGVpdGhlcgotCQkgKiBwcmV2aW91cyBvciBuZXh0LgotCQkgKiBUaGlzIGlzIHRoZSAoY2hhcikgcG9zaXRpb24gbm90IHRoZQotCQkgKiBwb3NpdGlvbiBvZiBsb2dpY2FsIGludCBjaGFycyByZXR1cm5lZC4gRm9yIGV4YW1wbGUgYSBzdGFuZGFyZCBzdHJpbmcgb2YKLQkJICogPGNvZGU+ImFiYyI8L2NvZGU+IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhciAnYicgaXMgMS4gQnV0IHRha2UgdGhlIHN0cmluZwotCQkgKiA8Y29kZT4iYWIxYjJjIjwvY29kZT4gd2hlcmUgImIxYjIiIGlzIG9uZSBVVEYtMzIgY2hhciwgdGhlbiB0aGUgcG9zaXRpb24KLQkJICogb2YgJ2MnIGlzIDMuIEl0IHdvdWxkIG5vdCBiZSAyLCB3aGljaCBpcyB3aGF0IHRoZSBsb2dpY2FsIGNoYXIgcG9zaXRpb24KLQkJICogd291bGQgYmUgaWYgdGFraW5nIFVGVDMyIGludG8gYWNjb3VudC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotCQkJcmV0dXJuIGxhc3RDaGFySW5kZXg7Ci0JCX0KLQkKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBjaGFyIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBpbnRzIGluc3RlYWQgb2YgY2hhcnMgZm9yCi0JICogd2Fsa2luZyBzdHJpbmdzIHRoYXQgY2FuIGNvbnRhaW4gVVRGIG11bHRpLWNoYXJzLiBUaGlzIGlzCi0JICogYSBsaW1pdGVkIHZlcnNpb24gb2Yge0BsaW5rIGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcn0uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0Q2hhckl0ZXJhdG9yIHsKLQkJCi0KLQkJLyoqCi0JCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgotCQkgKiBAcGFyYW0gc3RyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdJdGVyYXRvcihTdHJpbmcgc3RyKSB7Ci0JCQlzdXBlcihzdHIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuQ2hhcmFjdGVyVXRpbC5BYnN0cmFjdENoYXJJdGVyYXRvciN1dGZDaGFyQXQoaW50KQotCQkgKi8KLQkJcHJvdGVjdGVkIGludCB1dGZDaGFyQXQoaW50IHBvcykgewotCQkJcmV0dXJuIFVURjE2LmNoYXJBdCgoU3RyaW5nKSBjaGFyU2VxLCBwb3MpOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIGNoYXIgaXRlcmF0b3IgdGhhdCByZXR1cm5zIGludHMgaW5zdGVhZCBvZiBjaGFycyBmb3IKLQkgKiB3YWxraW5nIHN0cmluZ3MgdGhhdCBjYW4gY29udGFpbiBVVEYgbXVsdGktY2hhcnMuIFRoaXMgaXMKLQkgKiBhIGxpbWl0ZWQgdmVyc2lvbiBvZiB7QGxpbmsgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yfS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0J1ZmZlckl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFySXRlcmF0b3IgewotCQkKLQotCQkvKioKLQkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCi0JCSAqIEBwYXJhbSBzdHJCdWZmZXIKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIFN0cmluZ0J1ZmZlckl0ZXJhdG9yKFN0cmluZ0J1ZmZlciBzdHJCdWZmZXIpIHsKLQkJCXN1cGVyKHN0ckJ1ZmZlcik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsLkFic3RyYWN0Q2hhckl0ZXJhdG9yI3V0ZkNoYXJBdChpbnQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IHV0ZkNoYXJBdChpbnQgcG9zKSB7Ci0JCQlyZXR1cm4gVVRGMTYuY2hhckF0KChTdHJpbmdCdWZmZXIpIGNoYXJTZXEsIHBvcyk7Ci0JCX0KLQkJCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFmMmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMyAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi0vKioKLSAqIFRoaXMgaXMgdGhlIGluc3RhbnRpYXRpb24gdG8gdXNlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLiBJdCBiYXNpY2FsbHkgZG9lcyBub3RoaW5nLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIE5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IgZXh0ZW5kcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKLQotCS8qCi0JICogT25seSBpbnN0YW50aWF0ZWQgZnJvbSB0aGlzIHBhY2thZ2UuCi0JICovCi0JTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjc2V0VmFyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JfQotCi0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXApIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1BlcmZvcm1hbmNlTW9uaXRvclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjNhMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1BlcmZvcm1hbmNlTW9uaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuSVBlcmZvcm1hbmNlTW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxpZmllZCB3cmFwcGVyIHRvIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yIHRoYXQgaGlkZXMgaXQgc28gdGhhdCB0aGUgYWN0dWFsIHBsdWdpbiBjYW4gYmUgb3B0aW9uYWwgYW5kIG5vdCByZXF1aXJlZC4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7Ci0JLyoqCi0JICogRXZlbnQgZm9yIFBlcmZvcm1hbmNlTGlzdGVuZXIgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyZm9ybWFuY2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY4MDA3MTQ2Mjc1MDE4MDMzOUw7Ci0KLQkJUGVyZm9ybWFuY2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgc3RlcCkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCXNuYXBzaG93V2l0aFR5cGVzID0gZmFsc2U7Ci0JCQl0aGlzLnN0ZXAgPSBzdGVwOwotCQkJdGhpcy50eXBlcyA9IDA7CS8vIE5vdCBzZXQuCi0JCX0KLQkJCi0JCVBlcmZvcm1hbmNlRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHN0ZXAsIGludCB0eXBlcykgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCXNuYXBzaG93V2l0aFR5cGVzID0gdHJ1ZTsKLQkJCXRoaXMuc3RlcCA9IHN0ZXA7Ci0JCQl0aGlzLnR5cGVzID0gdHlwZXM7Ci0JCX0KLQotCQkKLQkJLyoqCi0JCSAqIFNuYXBzaG90IHdpdGggdHlwZXMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gc25hcHNob3dXaXRoVHlwZXM7Ci0KLQkJLyoqCi0JCSAqIFN0ZXAgb2Ygc25hcHNob3QKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgaW50IHN0ZXA7Ci0JCQotCQkvKioKLQkJICogdHlwZXMgb2Ygc25hcHNob3QuCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIGludCB0eXBlczsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybWFuY2UgTGlzdGVuZXIgaW50ZXJmYWNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBQZXJmb3JtYW5jZUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIFNuYXBzaG90IHdhcyBjYWxsZWQuCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzbmFwc2hvdChQZXJmb3JtYW5jZUV2ZW50IGV2ZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBQZXJmb3JtYW5jZUxpc3RlbmVyW10gbGlzdGVuZXJzOwotCi0JcHVibGljIGludGVyZmFjZSBUeXBlcyB7Ci0KLQkJLyoqCi0JCSAqIDEgLSBXcml0ZSBvdXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoZXNlIGluY2x1ZGUgd29ya2luZyBzZXQsIHBlYWsgd29ya2luZyBzZXQsIGVsYXBzZWQgdGltZSwgdXNlciB0aW1lLCBhbmQKLQkJICoga2VybmVsIHRpbWUuCi0JCSAqLwotCQlpbnQgT3BlcmF0aW5nU3lzdGVtQ291bnRlcnMgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLk9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzOwotCi0JCS8qKgotCQkgKiAyIC0gV3JpdGUgb3V0IHRoZSBnbG9iYWwgcGVyZm9ybWFuY2UgaW5mby4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgdG90YWwgY29tbWl0dGVkIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uCi0JCSAqIAotCQkgKiBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIEdldFBlcmZvcm1hbmNlSW5mbygpIGZ1bmN0aW9uIGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgV2luZG93cyBwc2FwaS5kbGwuIFRoaXMgaXMgYXZhaWxhYmxlIGluIFhQIGJ1dCBpcyB1c3VhbGx5Ci0JCSAqIG5vdCBhdmFpbGFibGUgaW4gV2luLzIwMDAuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLQkJICovCi0JCWludCBHbG9iYWxTeXN0ZW1Db3VudGVycyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuR2xvYmFsU3lzdGVtQ291bnRlcnM7Ci0KLQkJLyoqCi0JCSAqIDQgLSBXcml0ZSBvdXQgdGhlIHNpemUgb2YgdGhlIEphdmEgSGVhcC4KLQkJICovCi0JCWludCBKYXZhSGVhcFNpemUgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkphdmFIZWFwU2l6ZTsKLQotCQkvKioKLQkJICogOCAtIFdyaXRlIG91dCBob3cgbXVjaCBvZiB0aGUgSmF2YSBoZWFwIGlzIGJlaW5nIHVzZWQuIFRoaXMgY2FsbHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHNvIGl0IG1heSBza2V3IHRpbWluZyByZXN1bHRzLgotCQkgKi8KLQkJaW50IEphdmFIZWFwVXNlZCA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuSmF2YUhlYXBVc2VkOwotCi0JCS8qKgotCQkgKiAxNiAtIFRoZSBwbHVnaW4gc3RhcnR1cCBhbmQgc2l6ZSBpbmZvcm1hdGlvbi4KLQkJICovCi0JCWludCBQbHVnaW5JbmZvID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5QbHVnaW5JbmZvOwotCi0JCS8qKiAweGZmZmYgLSBFdmVyeXRoaW5nLiAqLwotCQlpbnQgQWxsID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5BbGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCBzaGFyZWRNb25pdG9yOwotCi0JcHVibGljIHN0YXRpYyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIGdldE1vbml0b3IoKSB7Ci0JCWlmIChzaGFyZWRNb25pdG9yID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luIik7IC8vIFRoaXMganVzdCB0ZXN0cyBpZiB0aGUgcGVyZm9ybWFuY2UgcGx1Z2luIGlzIGF2YWlsYWJsZS4gVGhyb3dzIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gZXhjZXB0aW9uIG90aGVyd2lzZS4KLQkJCQlDbGFzcyBwcmVzZW50Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0udXRpbC5QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIik7IC8vIEdldCB0aGUgY2xhc3Mgd2UgdXNlIHdyYXBwZXIgaXQuIC8vJE5PTi1OTFMtMSQKLQkJCQlzaGFyZWRNb25pdG9yID0gKFBlcmZvcm1hbmNlTW9uaXRvclV0aWwpIHByZXNlbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJCWlmICghc2hhcmVkTW9uaXRvci5pc1ZhbGlkKCkpCi0JCQkJCXNoYXJlZE1vbml0b3IgPSBudWxsOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWYgYW55IHJ1bnRpbWUgZXhjZXB0aW9uLCBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWYgY2xhc3Mgbm90IGZvdW5kLCB0aGVuIHBsdWdpbiBub3QgYXZhaWxhYmxlLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gUHJvYmxlbSBpbnN0YW50aWF0aW5nLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU29tZSBpbGxlZ2FsIGFjY2Vzcywgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0KLQkJCWlmIChzaGFyZWRNb25pdG9yID09IG51bGwpIHsKLQkJCQkvLyBDb3VsZG4ndCBnZXQgdGhlIHBlcmZvcm1hbmNlIG9uZSBmb3Igc29tZSByZWFzb24uIFVzZSBub3QgcHJlc2VudCBvbmUgaW5zdGVhZC4KLQkJCQlzaGFyZWRNb25pdG9yID0gbmV3IE5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hhcmVkTW9uaXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyCi0JICogICAgICAgICAgICBhIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgdmFyaWF0aW9uIG51bWJlcnMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcik7Ci0KLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2Ygc29tZSBkZWZhdWx0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcAotCSAqICAgICAgICAgICAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNuYXBzaG90KGludCBzdGVwKSB7Ci0JCWRvU25hcHNob3Qoc3RlcCk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCW5vdGlmeVNuYXBzaG90KG5ldyBQZXJmb3JtYW5jZUV2ZW50KHRoaXMsIHN0ZXApKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVNuYXBzaG90KFBlcmZvcm1hbmNlRXZlbnQgZXZlbnQpIHsKLQkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIGxpc3QgPSBsaXN0ZW5lcnM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbGlzdFtpXS5zbmFwc2hvdChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG8gdGhlIGFjdHVhbCBzbmFwc2hvdAotCSAqIEBwYXJhbSBzdGVwCi0JICogCi0JICogQHNlZSAjc25hcHNob3QoaW50KQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXApOwotCi0JLyoqCi0JICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZWxlY3RlZCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHN0ZXAKLQkgKiAgICAgICAgICAgIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZXMKLQkgKiAgICAgICAgICAgIFRoaXMgY29udHJvbHMgd2hpY2ggbWVhc3VyZW1lbnRzIGFyZSBzZWxlY3RlZC4gSXQgaXMgYW4gb3InZCB0b2dldGhlciBsaXN0IG9mIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzIGNvbnN0YW50cy4KLQkgKiAKLQkgKiBAc2VlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JCWRvU25hcHNob3Qoc3RlcCwgdHlwZXMpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCi0JCQlub3RpZnlTbmFwc2hvdChuZXcgUGVyZm9ybWFuY2VFdmVudCh0aGlzLCBzdGVwLCB0eXBlcykpOwkJCi0JfQotCQotCS8qKgotCSAqIERvIHRoZSBhY3R1YWwgc25hcHNob3QKLQkgKiBAcGFyYW0gc3RlcAotCSAqIAotCSAqIEBzZWUgI3NuYXBzaG90KGludCwgaW50KQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcyk7CQotCQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lciB0byBsaXN0LgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBlcmZvcm1hbmNlTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZmluZExpc3RlbmVyKGxpc3RlbmVyKSAhPSAtMSkKLQkJCXJldHVybjsKLQkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIG5ld0xpc3QgPSBuZXcgUGVyZm9ybWFuY2VMaXN0ZW5lcltsaXN0ZW5lcnMgIT0gbnVsbCA/IGxpc3RlbmVycy5sZW5ndGgrMSA6IDFdOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdCwgMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JCW5ld0xpc3RbbmV3TGlzdC5sZW5ndGgtMV0gPSBsaXN0ZW5lcjsKLQkJbGlzdGVuZXJzID0gbmV3TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZmluZExpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpCi0JCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBlcmZvcm1hbmNlTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpbnQgaW5kZXggPSBmaW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCWlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDEpIHsKLQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBuZXdMaXN0ID0gbmV3IFBlcmZvcm1hbmNlTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCAwLCBuZXdMaXN0LCAwLCBpbmRleCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgaW5kZXgrMSwgbmV3TGlzdCwgaW5kZXgsIG5ld0xpc3QubGVuZ3RoLWluZGV4KTsKLQkJCWxpc3RlbmVycyA9IG5ld0xpc3Q7Ci0JCX0KLQl9Ci0JLyoqCi0JICogVXBsb2FkIHRoZSByZXN1bHRzIHRvIHRoZSBzZXJ2ZXIuIFRoaXMgY2F1c2VzIHRoZSBmaWxlIHRvIGJlCi0JICogY2xvc2VkLCBhbmQgdGhlIG1vbml0b3IgdG8gYmUgcGxhY2VkIGludG8gdGhlIGZpbmlzaGVkIHN0YXRlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgdXBsb2FkaG9zdCwgdXBsb2FkcG9ydCBhbmQgdXBsb2FkdXNlcmlkCi0JICogaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIGhhbmQuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIChpdCBjYW4gYmUgbnVsbCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKXtyZXR1cm4gZmFsc2U7fQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1ByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjFjZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1ByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5JUGVyZm9ybWFuY2VNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5QZXJmTXNyQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIHVzZWQgd2hlbiB0aGUgcGVyZm9ybWFuY2UgcGx1Z2luIGlzIGF2YWlsYWJsZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3VwbG9hZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwbG9hZChTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIG1vbml0b3IudXBsb2FkKGRlc2NyaXB0aW9uKS5zdWNjZXNzOwotCX0KLQkKLQlwcml2YXRlIElQZXJmb3JtYW5jZU1vbml0b3IgbW9uaXRvcjsKLQotCS8qCi0JICogU28gdGhhdCBvbmx5IGluc3RhbnRpYXRlZCBieSB0aGlzIHBhY2thZ2UuCi0JICovCi0JUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvcigpIHsKLQkJbW9uaXRvciA9IFBlcmZNc3JDb3JlUGx1Z2luLmdldFBlcmZvcm1hbmNlTW9uaXRvcih0cnVlKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNpc1ZhbGlkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gbW9uaXRvciAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNzZXRWYXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotCQltb25pdG9yLnNldFZhcih2YXIpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCkgewotCQltb25pdG9yLnNuYXBzaG90KHN0ZXApOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQkJbW9uaXRvci5zbmFwc2hvdChzdGVwLCB0eXBlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2U4Mjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFJlZ2lzdHJ5UmVhZGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjQ1ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogQ2xhc3MgdG8gcmVhZCBhIHJlZ2lzdHJ5LiBJdCBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgc3BlY2lmaWMgZnVuY3Rpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0JU3RyaW5nIHBsdWdpbklkOwotCi0JU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGUgc3lzdGVtQnVuZGxlOwotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBwbHVnaW4gaWQgb2YgYSBjb25maWd1YXRpb24gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAotCSAqIEByZXR1cm4gcGx1Z2luIGlkIG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCi0JCWlmIChjb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCi0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0JCQkJcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlZ2lzdHJ5UmVhZGVyIHRha2luZyBhIHJlZ2lzdHJ5LCBwbHVnaW4gaWQsIGFuZCBleHRlbnNpb24gcG9pbnQgaWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogQHBhcmFtIHBsdWdpbklECi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIFJlZ2lzdHJ5UmVhZGVyKHBsdWdpbiwgZXh0ZW5zaW9uUG9pbnQpIGluc3RlYWQuIFRoZSByZWdpc3RyeSBwYXNzZWQgaW4gaXMgaWdub3JlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0aGlzKHBsdWdpbklELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlZ2lzdHJ5UmVhZGVyIHRha2luZyB0aGUgcGx1Z2luIGlkIGFuZCBleHRlbnNpb24gcG9pbnQgaWQuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbklECi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JRDsKLQkJZXh0ZW5zaW9uUG9pbnRJZCA9IGV4dGVuc2lvblBvaW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmICghcmVjb2duaXplZCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogTG9ncyB0aGUgZXJyb3IgaW4gdGhlIGRlc2t0b3AgbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoKLQkgKiBMb2dzIGEgdmVyeSBjb21tb24gcmVnaXN0cnkgZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50IGF0dHJpYnV0ZXMuIElmIHRoaXMgZWxlbWVudCBoYXMgc3ViZWxlbWVudHMsIHRoZSByZWFkZXIgd2lsbCByZWN1cnNpdmVseSBjeWNsZSB0aHJvdWdoIHRoZW0gYW5kIGNhbGwgdGhpcwotCSAqIG1ldGhvZCBzbyBkb24ndCBkbyBpdCBoZXJlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFJlYWQgdGhlIGV4dGVuc2lvbiBwb2ludCBhbmQgcGFyc2UgaXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KHBsdWdpbklkLCBleHRlbnNpb25Qb2ludElkKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsUmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdG8gc2VlIGlmIGl0IGlzIHZhbGlkIGF0IHRoaXMgcG9pbnQgaW4gdGltZSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uIEEgdmFsaWQgcmVhc29uIG5vdCB0byB3b3VsZCBiZSB0aGF0IHRoZSB3b3Jrc3BhY2UgaXMKLQkgKiBzaHV0dGluZyBkb253LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyB2YWxpZCBwb2ludCB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKFBsYXRmb3JtLmlzUnVubmluZygpICYmIGdldFN5c3RlbUJ1bmRsZSgpLmdldFN0YXRlKCkgIT0gQnVuZGxlLlNUT1BQSU5HKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN5c3RlbSBidW5kbGUKLQkgKiAKLQkgKiBAcmV0dXJuIHN5c3RlbSBidW5kbGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdW5kbGUgZ2V0U3lzdGVtQnVuZGxlKCkgewotCQlpZiAoc3lzdGVtQnVuZGxlID09IG51bGwpCi0JCQlzeXN0ZW1CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3lzdGVtQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9UaW1lclRlc3RzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI0Zjc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9UaW1lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotcHVibGljIGNsYXNzIFRpbWVyVGVzdHMgewotCi0JLyoqCi0JICogRGVmYXVsdCBUaW1lclRlc3RzIGNsYXNzIHRvIHVzZSB3aGVuIG5vdCB1c2luZyB5b3VyIG93bi4gSXQncyBhIGdsb2JhbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRpbWVyVGVzdHMgYmFzaWNUZXN0ID0gbmV3IFRpbWVyVGVzdHMoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfUEFSRU5UX0lEID0gImN1cnJlbnQgcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFBhcmVudElkID0gbnVsbDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUaW1lclN0ZXAgewotCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gMDsKLQkJc3RhdGljIGZpbmFsIGludCBTVE9QID0gMTsKLQkJc3RhdGljIGZpbmFsIGludCBTVEFSVF9DVU1VTEFUSVZFID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBTVE9QX0NVTVVMQVRJVkUgPSAzOwotCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUX0FDQ1VNVUxBVElORyA9IDQ7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RPUF9BQ0NVTVVMQVRJTkcgPSA1OwotCQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0JCXByb3RlY3RlZCBsb25nIGN1cnJlbnRUaW1lOwotCQlwcm90ZWN0ZWQgaW50IHRocmVhZElkOwotfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdE9uID0gZmFsc2U7Ci0JcHJvdGVjdGVkIExpc3Qgc3RlcHM7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCVRpbWVyU3RlcCBzdGVwID0gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlQpOwotCQlyZXR1cm4gc3RlcCAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUaW1lclN0ZXAgY3JlYXRlVGltZXJTdGVwKFN0cmluZyBpZCwgaW50IHN0ZXBUeXBlKSB7Ci0JCVRpbWVyU3RlcCBuZXdTdGVwID0gbmV3IFRpbWVyU3RlcCgpOwotCQluZXdTdGVwLnRocmVhZElkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpOwotCQluZXdTdGVwLmlkID0gaWQ7Ci0JCW5ld1N0ZXAudHlwZSA9IHN0ZXBUeXBlOwotCQluZXdTdGVwLmN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXN0ZXBzLmFkZChuZXdTdGVwKTsKLQotCQlyZXR1cm4gbmV3U3RlcDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0JCVRpbWVyU3RlcCBzdGVwID0gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUCk7Ci0JCXJldHVybiBzdGVwICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0QWNjdW11bGF0aW5nKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVF9BQ0NVTVVMQVRJTkcpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BBY2N1bXVsYXRpbmcoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1BfQUNDVU1VTEFUSU5HKSAhPSBudWxsOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRDdW11bGF0aXZlU3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlRfQ1VNVUxBVElWRSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcEN1bXVsYXRpdmVTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUF9DVU1VTEFUSVZFKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSB0ZXN0cyBzbyB0aGF0IHlvdSBjYW4gcmVzdGFydCBhbmQgZG8gc29tZSBtb3JlIHRlc3RzLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhclRlc3RzKCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybjsKLQkJc3RlcHMuY2xlYXIoKTsKLQkJY3VycmVudFBhcmVudElkID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUdXJuIHRoaXMgdGVzdCBvbi4gSWYgbm90IHR1cm5lZCBvbiB0aGVuIGFsbCBjYWxscyB3aWxsIHF1aWNrbHkgcmV0dXJuIHdpdGggbm8gZXJyb3JzLiBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBzdGF5IGluIHBsYWNlIGV2ZW4gd2hlbiBub3QKLQkgKiBkZWJ1Z2dpbmcuCi0JICogPHA+Ci0JICogV2hlbiB0dXJuZWQgb2ZmLCBpdCB3aWxsIGNsZWFyIHRoZSB0ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0ZXN0U3RhdGUoYm9vbGVhbiBvbikgewotCQlpZiAob24gPT0gdGVzdE9uKQotCQkJcmV0dXJuOwotCQlpZiAob24pIHsKLQkJCXRlc3RPbiA9IHRydWU7Ci0JCQlpZiAoc3RlcHMgPT0gbnVsbCkKLQkJCQlzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCXRlc3RPbiA9IGZhbHNlOwotCQkJc3RlcHMgPSBudWxsOwotCQl9Ci0JCWN1cnJlbnRQYXJlbnRJZCA9IG51bGw7Ci0JfQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEN1bXVsYXRpdmVJbmZvcm1hdGlvbiB7Ci0JCXB1YmxpYyBUaW1lclN0ZXAgY3VycmVudEN1bXVsYXRpdmVTdGVwOwotCQlwdWJsaWMgbG9uZyBjdW1UaW1lOwotCQlwdWJsaWMgaW50IGN1bUNvdW50OwotCQlwdWJsaWMgaW50IGN1bUNvdW50Tm9uWmVybzsKLQkJcHVibGljIGxvbmcgbWF4VGltZTsKLQkJcHVibGljIGxvbmcgbWluVGltZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlwdWJsaWMgbG9uZyBtaW5UaW1lTm9uWmVybyA9IEludGVnZXIuTUFYX1ZBTFVFOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJpbnRJdCgpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm47Ci0JCWlmIChzdGVwcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlNYXAgc3RlcEluZm9CeVRocmVhZElkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGluZGVudHNCeVRocmVhZElkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGN1bVN0ZXBzOwotCQlUaW1lclN0ZXAgcHJldlN0ZXAgPSBudWxsOwotCQlUaW1lclN0ZXAgc3RhcnRTdGVwOwotCQlOdW1iZXJGb3JtYXQgcGVyY2VudEZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXRQZXJjZW50SW5zdGFuY2UoKTsKLQkJZG91YmxlIHRvdGFsVGltZSA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigxNTApOwotCQlpZiAoc3RlcHMuc2l6ZSgpID4gMil7Ci0JCQl0b3RhbFRpbWUgPSAoKFRpbWVyU3RlcClzdGVwcy5nZXQoc3RlcHMuc2l6ZSgpLTEpKS5jdXJyZW50VGltZSAtICgoVGltZXJTdGVwKXN0ZXBzLmdldCgwKSkuY3VycmVudFRpbWU7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwcy5zaXplKCk7IGkrKykgewotCQkJVGltZXJTdGVwIHN0ZXAgPSAoVGltZXJTdGVwKSBzdGVwcy5nZXQoaSk7Ci0JCQlJbnRlZ2VyIHRocmVhZElkID0gbmV3IEludGVnZXIoc3RlcC50aHJlYWRJZCk7Ci0JCQlzd2l0Y2ggKHN0ZXAudHlwZSkgewotCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUOgotCQkJCWNhc2UgVGltZXJTdGVwLlNUT1A6Ci0JCQkJCUludGVnZXIgdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWludCBpbmRlbnQgPSAwOwotCQkJCQlpZiAoc3RlcC50eXBlID09IFRpbWVyU3RlcC5TVEFSVCkgewotCQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpICsgMTsKLQkJCQkJCWluZGVudHNCeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgbmV3IEludGVnZXIoaW5kZW50KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7Ci0JCQkJCQlpZiAoaW5kZW50ID4gMCkKLQkJCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIG5ldyBJbnRlZ2VyKGluZGVudCAtIDEpKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluZGVudHNCeVRocmVhZElkLnJlbW92ZSh0aHJlYWRJZCk7Ci0JCQkJCQkJaW5kZW50ID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKLQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc3dpdGNoIChzdGVwLnR5cGUpIHsKLQkJCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUOgotCQkJCQkJCXN0cmIuYXBwZW5kKCJTdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCWNhc2UgVGltZXJTdGVwLlNUT1A6Ci0JCQkJCQkJc3RyYi5hcHBlbmQoIlN0b3AgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJOwotCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCU1hcCBzdGFydFN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChzdGFydFN0ZXBzID09IG51bGwpCi0JCQkJCQlzdGVwSW5mb0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBzdGFydFN0ZXBzID0gbmV3IEhhc2hNYXAoKSk7Ci0JCQkJCWlmIChzdGVwLnR5cGUgPT0gVGltZXJTdGVwLlNUQVJUKSB7Ci0JCQkJCQkvLyBTdG9yZSB0aGUgc3RhcnQgc3RlcCBmb3IgbGF0ZXIgbG9va3VwIHdoZW4gY2FsdWxhdGluZyB0aGUgdG90YWwgdGltZQotCQkJCQkJc3RhcnRTdGVwcy5wdXQoc3RlcC5pZCwgc3RlcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBUaGlzIGlzIHRoZSBzdG9wIHRpbWUgZm9yIGEgc3RlcC4gV2UgbmVlZCB0byBmaW5kCi0JCQkJCQkvLyB0aGUgY29ycmVzcG9uZGluZyBzdGFydCB0aW1lIGFuZCBjYWxjdWxhdGUgdGhlIHRvdGFsIHRpbWUuCi0JCQkJCQlPYmplY3QgaXRlbSA9IHN0YXJ0U3RlcHMucmVtb3ZlKHN0ZXAuaWQpOwotCQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUaW1lclN0ZXApIHsKLQkJCQkJCQlzdGFydFN0ZXAgPSAoVGltZXJTdGVwKSBpdGVtOwotCQkJCQkJCWlmIChzdGFydFN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgYWRkY2hhcnMgPSAxMDAgLSBzdHJiLmxlbmd0aCgpOwotCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFkZGNoYXJzOyBqKyspIHsKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlsb25nIGRlbHRhID0gc3RlcC5jdXJyZW50VGltZSAtIHN0YXJ0U3RlcC5jdXJyZW50VGltZTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgICBUb3RhbCA9ICIgKyBkZWx0YSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCWlmICh0b3RhbFRpbWUgPiAwKQotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgICIgKyBwZXJjZW50Rm9ybWF0dGVyLmZvcm1hdChkZWx0YS90b3RhbFRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgLS0tPiBDb3VsZG4ndCBmaW5kIFN0YXJ0aW5nIHBvaW50IGZvciBcIiIgKyBzdGVwLmlkICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXByZXZTdGVwID0gc3RlcDsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUX0FDQ1VNVUxBVElORzoKLQkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKGN1bVN0ZXBzID09IG51bGwpCi0JCQkJCQlzdGVwSW5mb0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBjdW1TdGVwcyA9IG5ldyBIYXNoTWFwKCkpOwotCQkJCQljdW1TdGVwcy5wdXQoc3RlcC5pZCwgbmV3IEN1bXVsYXRpdmVJbmZvcm1hdGlvbigpKTsKLQkJCQkJdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWluZGVudCA9IDA7Ci0JCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOwotCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKLQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc3RyYi5hcHBlbmQoIlN0YXJ0IEFjY3VtdWxhdGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcHJldlN0ZXAgPSBzdGVwOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlRfQ1VNVUxBVElWRToKLQkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOwotCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pCi0JCQkJCQkJKChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm8pLmN1cnJlbnRDdW11bGF0aXZlU3RlcCA9IHN0ZXA7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgVGltZXJTdGVwLlNUT1BfQ1VNVUxBVElWRToKLQkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOwotCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pIHsKLQkJCQkJCQlDdW11bGF0aXZlSW5mb3JtYXRpb24gY3VtSW5mbyA9IChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm87Ci0JCQkJCQkJaWYgKGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwICE9IG51bGwpIHsKLQkJCQkJCQkJY3VtSW5mby5jdW1Db3VudCsrOwotCQkJCQkJCQlsb25nIGRlbHRhID0gc3RlcC5jdXJyZW50VGltZSAtIGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwLmN1cnJlbnRUaW1lOwotCQkJCQkJCQljdW1JbmZvLmN1bVRpbWUgKz0gZGVsdGE7Ci0JCQkJCQkJCWlmIChjdW1JbmZvLm1heFRpbWUgPCBkZWx0YSkKLQkJCQkJCQkJCWN1bUluZm8ubWF4VGltZSA9IGRlbHRhOwotCQkJCQkJCQlpZiAoZGVsdGEgPCBjdW1JbmZvLm1pblRpbWUpCi0JCQkJCQkJCQljdW1JbmZvLm1pblRpbWUgPSBkZWx0YTsKLQkJCQkJCQkJaWYgKGRlbHRhICE9IDApIHsKLQkJCQkJCQkJCWN1bUluZm8uY3VtQ291bnROb25aZXJvKys7Ci0JCQkJCQkJCQlpZiAoZGVsdGEgPCBjdW1JbmZvLm1pblRpbWVOb25aZXJvKQotCQkJCQkJCQkJCWN1bUluZm8ubWluVGltZU5vblplcm8gPSBkZWx0YTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RPUF9BQ0NVTVVMQVRJTkc6Ci0JCQkJCXRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpbmRlbnQgPSAwOwotCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKLQkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7Ci0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOwotCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7Ci0JCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN0cmIuYXBwZW5kKCJTdG9wICBBY2N1bXVsYXRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKLQkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSB7Ci0JCQkJCQkJQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIGN1bUluZm8gPSAoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvOwotCQkJCQkJCWlmIChjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBjdW11bGF0aXZlIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1UaW1lKTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGN1bXVsYXRpdmUgY291bnQ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1Db3VudCk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtYXggdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1heFRpbWUpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWluIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5taW5UaW1lKTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGF2ZyB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKCgoZG91YmxlKSBjdW1JbmZvLmN1bVRpbWUpL2N1bUluZm8uY3VtQ291bnQpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgTm9uWmVybyB0aW1lczogY3VtdWxhdGl2ZSB+MCBjb3VudD0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyk7Ci0JCQkJCQkJCWlmIChjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyAhPSAwKSB7Ci0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWluIH4wIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWluVGltZU5vblplcm8pOwotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGF2ZyB+MCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlzdHJiLmFwcGVuZCgoKGRvdWJsZSkgY3VtSW5mby5jdW1UaW1lKSAvIGN1bUluZm8uY3VtQ291bnROb25aZXJvKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlwcmV2U3RlcCA9IHN0ZXA7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NTg4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNy8wNC8xMCAwMTowOTozNiAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogU3RhdGljIHV0aWxpdHkgY2xhc3MgZm9yIFVJQ29udGV4dCBkZXRlcm1pbmF0aW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFVJQ29udGV4dERldGVybWluYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAxMDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFETEVTU19DT05URVhUX0xJVEVSQUwgPSAiSGVhZGxlc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX0xJVEVSQUwgPSAiVUkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFETEVTU19DT05URVhUID0gMTAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlfQ09OVEVYVCA9IDEwMTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBjYWNoZWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGludCBjdXJyZW50Q29udGV4dCA9IFVOS05PV047Ci0KLQlwcml2YXRlIFVJQ29udGV4dERldGVybWluYXRpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzIGJhc2VkIG9uIHRoZSBVSSBvciBIZWFkbGVzcyBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIG5ldyBjbGFzcyBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBrZXkgaXMgaW52YWxpZCAoZS5nLiBubyBleHRlbnNpb24gaXMgZm91bmQgZm9yIHRoZSBrZXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlSW5zdGFuY2UoU3RyaW5nIGtleSkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGNhY2hlZEV4dGVuc2lvbnMgPT0gbnVsbCkKLQkJCWluaXRFeHRlbnNpb25zKCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb250ZXh0U2Vuc2l0aXZlQ2xhc3MgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjYWNoZWRFeHRlbnNpb25zLmdldChrZXkpOwotCQl0cnkgewotCQkJaWYgKGNvbnRleHRTZW5zaXRpdmVDbGFzcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGNvbnRleHRTZW5zaXRpdmVDbGFzcwotCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyLlVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ0xBU1NOQU1FX0FUVFIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiUHJvYmxlbSBsb2FkaW5nIGV4dGVuc2lvbiBub3QgZm91bmQgZm9yIGtleSBcIiIgKyBrZXkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXh0ZW5zaW9uIG5vdCBmb3VuZCBmb3Iga2V5IFwiIiArIGtleSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IC0tIGRldGVybWluZXMgdGhlIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnQgY29udGV4dAotCSAqIEBzZWUgI0hFQURMRVNTX0NPTlRFWFQKLQkgKiBAc2VlICNVSV9DT05URVhUCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q3VycmVudENvbnRleHQoKSB7Ci0JCWlmIChjdXJyZW50Q29udGV4dCA9PSBVTktOT1dOKSB7Ci0JCQljdXJyZW50Q29udGV4dCA9IEhFQURMRVNTX0NPTlRFWFQ7Ci0JCQluZXcgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50Q29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIEludm9rZXMgdGhlIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlciB0byBjYWNoZSBhbGwgb2YgdGhlIGV4dGVuc2lvbnMsIGlmIG5lY2Vzc2FyeS4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKGNhY2hlZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJY2FjaGVkRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQluZXcgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENvbnZlcnRzIHRoZSBpbnB1dCB0byBvbmUgb2YgVUlfQ09OVEVYVCBvciBIRUFETEVTU19DT05URVhULiBEZWZhdWx0cyB0byBIRUFETEVTUyBvbiBpbnZhbGlkIGlucHV0Ci0JICogCi0JICogQHBhcmFtIGxpdGVyYWwgQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBjb252ZXJ0TGl0ZXJhbChTdHJpbmcgbGl0ZXJhbCkgewotCQlyZXR1cm4gKFVJX0NPTlRFWFRfTElURVJBTC5lcXVhbHMobGl0ZXJhbCkpID8gVUlfQ09OVEVYVCA6IEhFQURMRVNTX0NPTlRFWFQ7Ci0JfQotCi0JLyoKLQkgKiBSZWFkcyB0aGUgcmVnaXN0cmF0aW9uIG9mIFVJIENvbnRleHQtc2Vuc2l0aXZlIGNsYXNzIGV4dGVuc2lvbnMgYW5kIGluaXRpYWxpemVzIHRoZSBjYWNoZSBvZiB0aGUgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiBvYmplY3QuCi0JICogCi0JICogQGF1dGhvciBtZGVsZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfRUxFTUVOVCA9ICJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0tFWV9BVFRSID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NPTlRFWFRfQVRUUiA9ICJjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCQlzdXBlcihKRU1VdGlsUGx1Z2luLlBMVUdJTl9JRCwgSkVNVXRpbFBsdWdpbi5VSV9DT05URVhUX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19FTEVNRU5UKSkgewotCi0JCQkJU3RyaW5nIGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfS0VZX0FUVFIpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DT05URVhUX0FUVFIpOwotCi0JCQkJaWYgKCFjYWNoZWRFeHRlbnNpb25zLmNvbnRhaW5zS2V5KGtleSkgfHwgZ2V0Q3VycmVudENvbnRleHQoKSA9PSBjb252ZXJ0TGl0ZXJhbChjb250ZXh0KSkKLQkJCQkJY2FjaGVkRXh0ZW5zaW9ucy5wdXQoa2V5LCBlbGVtZW50KTsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8qCi0JICogUmVhZHMgdGhlIHVpVGVzdGVyIGV4dGVuc2lvbiBhbmQgaW5zdGFudGlhdGUgdGhlIGFueSBvZiB0aGUgVUlUZXN0ZXIgY2xhc3NlcyBpdCBmaW5kcy4KLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGlmIG11bHRpcGxlIFVJVGVzdGVycyBhcmUgcmVnaXN0ZXJlZCwgYW55IG9mIHRoZW0gY2FuIHRyaXAgdGhlIGN1cnJlbnRDb250ZXh0IGludG8gdGhlIFVJX0NPTlRFWFQKLQkgKiBzdGF0ZS4KLQkgKiAKLQkgKiBAYXV0aG9yIG1kZWxkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBVSVRlc3RlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1RFU1RFUl9FTEVNRU5UID0gInVpVGVzdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1RFU1RFUl9DTEFTU05BTUVfQVRUUiA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCQlzdXBlcihKRU1VdGlsUGx1Z2luLlBMVUdJTl9JRCwgSkVNVXRpbFBsdWdpbi5VSV9URVNURVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFVJX1RFU1RFUl9FTEVNRU5UKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgYm90aGVyIHJ1bm5pbmcgdGVzdGVyIGl0IGlmIHdlIGFscmVhZHkgcHJvY2Vzc2VkIG9uZSBleHRlbnNpb24gdGhhdCByZXR1cm5lZCB0cnVlLgotCQkJCQlpZiAoY3VycmVudENvbnRleHQgIT0gVUlfQ09OVEVYVCAmJiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQpKSB7Ci0JCQkJCQlVSVRlc3RlciB0ZXN0ZXIgPSAoVUlUZXN0ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihVSV9URVNURVJfQ0xBU1NOQU1FX0FUVFIpOwotCQkJCQkJaWYgKHRlc3Rlci5pc0N1cnJlbnRDb250ZXh0VUkoKSkKLQkJCQkJCQljdXJyZW50Q29udGV4dCA9IFVJX0NPTlRFWFQ7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJVSUNvbnRleHREZXRlcm1pbmF0aW9uIGlzIHByb2NlZWRpbmcgaW4gSEVBRExFU1MgbW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDUxN2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogVUlUZXN0ZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIFVJVGVzdGVyLiBUaGUgImNsYXNzbmFtZSIgYXR0cmlidXRlIG9uIHRoZSAidWlUZXN0ZXIiIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgaW1wbGVtZW50IHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVJVGVzdGVyIHsKLQotCS8qKgotCSAqIEFuc3dlciBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIGFuIFVJIGNvbnRleHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiBVSSBjb250ZXh0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudENvbnRleHRVSSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRmZjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogQ29udGV4dEJhc2UgZm9yIEVNRldvcmtiZW5jaC4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgYXMgbmVlZGVkIGZvciBhZGRpdGlvbmFsIG9yIG92ZXJyaWRlIGZ1bmN0aW9uLiBJdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJvamVjdCA9IGFQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhlIGNvbnRleHQgYmFzZS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkKLQkJCXJlc291cmNlU2V0LnJlbGVhc2UoKTsKLQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQlwcm9qZWN0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgdGhpcyBjb250ZXh0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBzZXQgKGNyZWF0aW5nIGlmIG5lZWRlZCkgZm9yIGNvbnRleHQuCi0JICogCi0JICogQHJldHVybiByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VTZXQgPSBjcmVhdGVSZXNvdXJjZVNldCgpOwotCQkJaW5pdGlhbGl6ZVJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3Igb3B0aW1pemF0aW9uOyBhbnN3ZXIgd2hldGhlciBhIHJlc291cmNlU2V0IGhhcyBiZWVuIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVzb3VyY2Ugc2V0IGhhcyBiZWVuIGNyZWF0ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVNldCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlU2V0KFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJY3JlYXRlUmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0KTsKLQkJYVJlc291cmNlU2V0LnNldFVSSUNvbnZlcnRlcihjcmVhdGVVUklDb252ZXJ0ZXIoYVJlc291cmNlU2V0KSk7Ci0JCWFSZXNvdXJjZVNldC5hZGQobmV3IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpKTsKLQkJSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuYWRkRXh0ZW5kZWRSZXNvdXJjZUhhbmRsZXJzKGFSZXNvdXJjZVNldCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4gQnkgZGVmYXVsdCBpdCBpcyBhIFByb2plY3RSZXNvdXJjZVNldEltcGwuCi0JICogCi0JICogQHJldHVybiBwcm9qZWN0J3MgbmV3IHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8yIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUHJvamVjdFJlc291cmNlU2V0SW1wbChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBVUklDb252ZXJ0ZXIgZm9yIHRoZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEByZXR1cm4gYSB1cmkgY29udmVydGVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKGdldFByb2plY3QoKSwgYVJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZXNvdXJjZSBzZXQgd29ya2JlbmNoIHN5bmNocm9uaXplci4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHJldHVybiBhIHJlc291cmNlIHNldCB3b3JrYmVuY2ggc3luY2hyb25pemVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBjcmVhdGVSZXNvdXJjZVNldFN5bmNocm9uaXplcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZGVsZXRlRmlsZShhUmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUZpbGUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcmVzb3VyY2UgKHdpdGggdGhlIGdpdmVuIFVSSSkgZnJvbSB0aGUgcHJvamVjdCByZXNvdXJjZSBzZXQuIExvYWQgaXQgaWYgbm90IGFscmVhZHkgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlIGZvciB0aGUgdXJpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMzFmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBGbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldCB7Ci0JCi0JCi0JLyoqCi0JICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSByZXNvbHZlZCBieSB0aGUgVVJJLgotCSAgICogPHA+Ci0JICAgKiBBIHJlc291cmNlIHNldCBpcyBleHBlY3RlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBzdHJhdGVneSAKLQkgICAqIGluIG9yZGVyIHRvIHJlc29sdmUgdGhlIGdpdmVuIFVSSSB0byBhIHJlc291cmNlLgotCSAgICogRmlyc3QgaXQgdXNlcyBpdCdzIHtAbGluayAjZ2V0VVJJQ29udmVydGVyIFVSSSBjb252ZXJ0ZXJ9IHRvIHtAbGluayBVUklDb252ZXJ0ZXIjbm9ybWFsaXplIG5vcm1hbGl6ZX0gdGhlIFVSSSAKLQkgICAqIGFuZCB0aGVuIHRvIGNvbXBhcmUgaXQgd2l0aCB0aGUgbm9ybWFsaXplZCBVUkkgb2YgZWFjaCByZXNvdXJjZTsKLQkgICAqIGlmIGl0IGZpbmRzIGEgbWF0Y2gsIAotCSAgICogdGhhdCByZXNvdXJjZSBiZWNvbWVzIHRoZSByZXN1bHQuCi0JICAgKiBGYWlsaW5nIHRoYXQsCi0JICAgKiBpdCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbGVnYXRlZEdldFJlc291cmNlIGRlbGVnYXRlc30gCi0JICAgKiB0byBhbGxvdyB0aGUgVVJJIHRvIGJlIHJlc29sdmVkIGVsc2V3aGVyZS4KLQkgICAqIEZvciBleGFtcGxlLCAKLQkgICAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5I0lOU1RBTkNFIHBhY2thZ2UgcmVnaXN0cnl9Ci0JICAgKiBpcyB1c2VkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkjZ2V0RVBhY2thZ2UgcmVzb2x2ZX0gCi0JICAgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSBuYW1lc3BhY2UgVVJJfSBvZiBhIHBhY2thZ2UKLQkgICAqIHRvIHRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhhdCBwYWNrYWdlLgotCSAgICogU28gdGhlIGltcG9ydGFudCBwb2ludCBpcyB0aGF0IGFuIGFyYml0cmFyeSBpbXBsZW1lbnRhdGlvbiBtYXkgcmVzb2x2ZSB0aGUgVVJJIHRvIGFueSByZXNvdXJjZSwKLQkgICAqIG5vdCBuZWNlc3NhcmlseSB0byBvbmUgY29udGFpbmVkIGJ5IHRoaXMgcGFydGljdWxhciByZXNvdXJjZSBzZXQuCi0JICAgKiBJZiB0aGUgZGVsZWdhdGlvbiBzdGVwIGZhaWxzIHRvIHByb3ZpZGUgYSByZXN1bHQsCi0JICAgKiBhbmQgaWYgPGNvZGU+bG9hZE9uRGVtYW5kPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiwKLQkgICAqIGEgcmVzb3VyY2UgaXMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZW1hbmRDcmVhdGVSZXNvdXJjZSBjcmVhdGVkfSAKLQkgICAqIGFuZCB0aGF0IHJlc291cmNlIGJlY29tZXMgdGhlIHJlc3VsdC4KLQkgICAqIElmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgICAqIGFuZCB0aGUgcmVzdWx0IHJlc291cmNlIGlzIG5vdCB7QGxpbmsgUmVzb3VyY2UjaXNMb2FkZWQgbG9hZGVkfSwgCi0JICAgKiBpdCB3aWxsIGJlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZCBsb2FkZWR9IGJlZm9yZSBpdCBpcyByZXR1cm5lZC4KLQkgICAqIDwvcD4KLQkgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byByZXNvbHZlLgotCSAgICogQHBhcmFtIGxvYWRPbkRlbWFuZCB3aGV0aGVyIHRvIGNyZWF0ZSBhbmQgbG9hZCB0aGUgcmVzb3VyY2UsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdHMuCi0JICAgKiBAcGFyYW0gcmVnaXN0ZXJlZEZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSByZXNvdXJjZSBpZiBuZWVkZWQgCi0JICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSByZXNvbHZlZCBieSB0aGUgVVJJLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpc24ndCBvbmUgYW5kIGl0J3Mgbm90IGJlaW5nIGRlbWFuZCBsb2FkZWQuCi0JICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgYSByZXNvdXJjZSBjYW4ndCBiZSBkZW1hbmQgY3JlYXRlZC4KLQkgICAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgZGVtYW5kIGxvYWQuCi0JICAgKiBAc2luY2UgMi4xCi0JICAgKi8KLQkKLQlSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCwgRmFjdG9yeSByZWdpc3RlcmVkRmFjdG9yeSk7Ci0JCi0JLyoqCi0JICAgKiBDcmVhdGVzIGEgbmV3IHJlc291cmNlLCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSwgYW5kIHJldHVybnMgaXQuCi0JICAgKiA8cD4KLQkgICAqIEl0IGRlbGVnYXRlcyB0byB0aGUgcmVzb3VyY2UgZmFjdG9yeSB7QGxpbmsgI2dldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5fSAKLQkgICAqIHRvIGRldGVybWluZSB0aGUge0BsaW5rIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkjZ2V0RmFjdG9yeSBjb3JyZWN0fSBmYWN0b3J5LAotCSAgICogYW5kIHRoZW4gaXQgdXNlcyB0aGF0IGZhY3RvcnkgdG8ge0BsaW5rIFJlc291cmNlLkZhY3RvcnkjY3JlYXRlUmVzb3VyY2UgY3JlYXRlfSB0aGUgcmVzb3VyY2UKLQkgICAqIGFuZCBhZGQgaXQgdG8gdGhlIHtAbGluayAjZ2V0UmVzb3VyY2VzIGNvbnRlbnRzfS4KLQkgICAqIElmIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgZmFjdG9yeSwgPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSByZXR1cm5lZDsKLQkgICAqIHdoZW4gcnVubmluZyB3aXRoaW4gRWNsaXBzZSwKLQkgICAqIGEgZGVmYXVsdCBYTUkgZmFjdG9yeSB3aWxsIGJlIHJlZ2lzdGVyZWQsCi0JICAgKiBhbmQgdGhpcyB3aWxsIG5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgICAqIDwvcD4KLQkgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgdG8gY3JlYXRlLgotCSAgICogQHBhcmFtIHJlc291cmNlRmFjdG9yeSAKLQkgICAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGZhY3RvcnkgaXMgcmVnaXN0ZXJlZC4KLQkgICAqLwotCQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lFTUZDb250ZXh0Q29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lFTUZDb250ZXh0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1ZDdmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IElFTUZDb250ZXh0Q29udHJpYnV0b3IuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi0vKioKLSAqIEVNRiBDb250ZXh0IENvbnRyaWJ1dG9yIGludGVyZmFjZS4gSW1wbGltZW50ZXJzIGFyZSBjYWxsZWQgdG8gY29udHJpYnV0ZSB0byB0aGUgY29udGV4dC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNjcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVNRkNvbnRleHRDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gYWRkIGEgcHJpbWFyeSBFTUZOYXR1cmUuIFR5cGljYWxseSB5b3Ugd291bGQgYWRkIHRvIHRoZSBXb3JrYmVuY2hDb250ZXh0IGhlbGQgYnkgPGNvZGU+YU5hdHVyZTwvY29kZT4gaW4gb3JkZXIgdG8KLQkgKiBjaGFuZ2UgdGhlIGNvbnRhaW5lciBmb3IgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBvciBhZGQgYWRhcHRlciBmYWN0b3JpZXMgdG8gdGhlIFJlc291cmNlU2V0IG9yIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBuZWVkZWQuCi0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpOwotCi0JLyoqCi0JICogVGhpcyBpcyB5b3VyIG9wcG9ydHVuaXR5IHRvIGFkZCBhIHNlY29uZGFyeSBFTUZOYXR1cmUuIFR5cGljYWxseSB5b3Ugd291bGQgYWRkIHRvIHRoZSBXb3JrYmVuY2hDb250ZXh0IGhlbGQgYnkgPGNvZGU+YU5hdHVyZTwvY29kZT4gaW4gb3JkZXIKLQkgKiB0byBjaGFuZ2UgdGhlIGNvbnRhaW5lciBmb3IgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBvciBhZGQgYWRhcHRlciBmYWN0b3JpZXMgdG8gdGhlIFJlc291cmNlU2V0IG9yIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBuZWVkZWQuCi0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzBkZDFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBJU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIEltcGxpbWVudGVycyBhbGxvd3MgY2xpZW50cywgZWcge0BsaW5rIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GTmF0dXJlQ29udHJpYnV0b3J9LCB0byBleHRlbmQgdGhlIGJlaGF2aW9yIG9mIHRoZQotICogUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciNhZGRFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIpCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3luY2hyb25pemVyRXh0ZW5kZXIgewotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgcHJvamVjdCBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKTsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHByb2plY3QgaGFzIGJlZW4gY2xvc2VkLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcHJvamVjdENsb3NlZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTc2OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0UmVzb3VyY2VTZXQuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDcvMDgvMzAgMDI6Mzc6MDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogQSBSZXNvdXJjZVNldCBmb3IgYW4gZW50aXJlIHByb2plY3QuIEl0IGFsbG93cyBzaGFyaW5nIG9mIHJlc291cmNlcyBmcm9tIG11bHRpcGxlIGVkaXRvcnMvdmlld2VycyBmb3IgYSBwcm9qZWN0LgotICogPHA+Ci0gKiBBbiBhZGRpdGlvbmFsIE5vdGlmaWNhdGlvbiB0eXBlIGlzIHNlbnQgb3V0IGJ5IFByb2plY3RSZXNvdXJjZVNldCdzIG9mIHByb2plY3QgcmVzb3VyY2Ugc2V0IGFib3V0IHRvIGJlIHJlbGVhc2VkLiBBIHJlbGVhc2UgaXMKLSAqIGNhbGxlZCB3aGVuIHByb2plY3RzIGFyZSBhYm91dCB0byBiZSBjbG9zZWQuIFRoZXkgcmVsZWFzZSBhbGwgb2YgdGhlIHJlc291cmNlcyBhbmQgdW5sb2FkIHRoZW0uIFRoaXMgbm90aWZpY2F0aW9uIGNhbiBiZSB1c2VkIAotICogdG8ga25vdyB0aGF0IHRoaXMgaXMgYWJvdXQgdG8gaGFwcGVuIGFuZCB0byBkbyBzb21ldGhpbmcgYmVmb3JlIHRoZSByZXNvdXJjZXMgYmVjb21lIGludmFsaWQuIEl0IHdpbGwgYmUgc2VudCBvdXQganVzdCBiZWZvcmUgdGhlCi0gKiByZXNvdXJjZSBzZXQgd2lsbCBiZSByZWxlYXNlZC4gCi0gKiAKLSAqIEBzZWUgUHJvamVjdFJlc291cmNlU2V0I1NQRUNJQUxfTk9USUZJQ0FUSU9OX1RZUEUKLSAqIEBzZWUgUHJvamVjdFJlc291cmNlU2V0I1BST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0UmVzb3VyY2VTZXQgZXh0ZW5kcyBSZXNvdXJjZVNldCB7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHR5cGUgaW4gbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBQcm9qZWN0UmVzb3VyY2VTZXQgZm9yCi0JICogc3BlY2lhbCBub3RpZmljYXRpb25zLCBhbmQgbm90IHRoZSBzdGFuZGFyZCBvbmVzIGZyb20gUmVzb3VyY2VTZXQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24jZ2V0RXZlbnRUeXBlKCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlzdGF0aWMgaW50IFNQRUNJQUxfTk9USUZJQ0FUSU9OX1RZUEUgPSBOb3RpZmljYXRpb24uRVZFTlRfVFlQRV9DT1VOVCs0OwotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiBGZWF0dXJlIElEIGZvciByZXNvdXJjZSBzZXQgYWJvdXQgdG8gYmUgcmVsZWFzZWQuCi0JICogVXNlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24jZ2V0RmVhdHVyZUlEKGphdmEubGFuZy5DbGFzcyl9IHRvCi0JICogZ2V0IHRoaXMgaWQuIFRoZSBnZXRGZWF0dXJlKCkgb24gbm90aWZpY2F0aW9uIHdpbGwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0Jc3RhdGljIGludCBQUk9KRUNUUkVTT1VSQ0VTRVRfQUJPVVRfVE9fUkVMRUFTRV9JRCA9IDEwMDA7Ci0KLQkvKioKLQkgKiBDYWxsIHdoZW4gdGhlIFJlc291cmNlU2V0IGlzIG5vIGxvbmdlciB0byBiZSB1c2VkLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotCi0JLyoqCi0JICogQWRkIHRoZSA8Y29kZT5yZXNvdXJjZUhhbmRsZXI8L2NvZGU+IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCi0JICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCB3YXMgYWRkZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JYm9vbGVhbiBhZGQoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcik7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIDxjb2RlPnJlc291cmNlSGFuZGxlcjwvY29kZT4gdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgotCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkRmlyc3QoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIDxjb2RlPnJlc291cmNlSGFuZGxlcjwvY29kZT4gZnJvbSB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIHRydWUgaWYgaXQgd2FzIHJlbW92ZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JYm9vbGVhbiByZW1vdmUoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IHN5bmNocm9uaXplciB0aGF0IHdpbGwgc3luY2hyb25pemUgdGhlIFJlc291cmNlU2V0IHdpdGggY2hhbmdlcyBmcm9tIHRoZSBXb3JrYmVuY2guCi0JICogCi0JICogQHJldHVybiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGdldFN5bmNocm9uaXplcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBSZXNvdXJjZVNldCBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplIHRoZSBSZXNvdXJjZVNldCB3aXRoIGNoYW5nZXMgZnJvbSB0aGUgV29ya2JlbmNoLgotCSAqIAotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICogQHJldHVybiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgc2V0U3luY2hyb25pemVyKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpOwotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IGNsaWVudHMgd2hlbmV2ZXIgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcHJvamVjdCBjaGFuZ2VzIHN1Y2ggdGhhdCBhbnkgY2FjaGVkIFVSSXMgd2lsbCBiZSBpbnZhbGlkLiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0JICogc291cmNlIGZvbGRlcnMgd2l0aGluIHRoZSBVUklDb252ZXJ0ZXIgY2hhbmdlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcmVzZXROb3JtYWxpemVkVVJJQ2FjaGUoKTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUyZTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFByb2plY3RVdGlsaXRpZXMuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS42ICQkICAkJERhdGU6IDIwMDgvMDMvMDUgMTk6NDM6MTggJCQgCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIEVNRiBXb3JrYmVuY2ggUHJvamVjdCBVdGlsaXRpZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIFByb2plY3QgY29udHJvbCBmaWxlIG5hbWUgaW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfUFJPSkVDVCA9ICIucHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENsYXNzcGF0aCBjb250cm9sIGZpbGUgbmFtZSBpbiBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVF9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcm9qZWN0VXRpbGl0aWVzKCkgewotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmF0dXJlIGlkIHRvIHRoZSBwcm9qZWN0IGFoZWFkIG9mIGFsbCBvdGhlciBuYXR1cmUgaWRzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hdHVyZSBpZCBhZnRlciBhbGwgb2YgdGhlIG90aGVyIG5hdHVyZSBpZHMgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdExhc3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5hdHVyZSBpZCBmcm9tIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpbnQgc2l6ZSA9IHByZXZOYXR1cmVzLmxlbmd0aDsKLQkJaW50IG5ld3NpemUgPSAwOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJYm9vbGVhbiBtYXRjaGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocHJldk5hdHVyZXNbaV0uZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCW1hdGNoZm91bmQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJbmV3TmF0dXJlc1tuZXdzaXplKytdID0gcHJldk5hdHVyZXNbaV07Ci0JCX0KLQkJaWYgKCFtYXRjaGZvdW5kKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKRU1VdGlsUGx1Z2luLklELCAwLAotCQkJCQkiVGhlIG5hdHVyZSBpZCAiICsgbmF0dXJlSWQgKyAiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQllbHNlIHsKLQkJCVN0cmluZ1tdIHRlbXAgPSBuZXdOYXR1cmVzOwotCQkJbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbbmV3c2l6ZV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIG5ld05hdHVyZXMsIDAsIG5ld3NpemUpOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGxpc3Qgb2YgcHJvamVjdHMgdG8gZW5kIG9mIHRoZSAicmVmZXJlbmNlZCBwcm9qZWN0cyIgbGlzdCBmcm9tIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdG9CZUFkZGVkUHJvamVjdHNMaXN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIExpc3QgdG9CZUFkZGVkUHJvamVjdHNMaXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQmVBZGRlZFByb2plY3RzTGlzdC5zaXplKCk7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZCh0b0JlQWRkZWRQcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc2luZ2xlIHByb2plY3QgdG8gdGhlIGVuZCBvZiB0aGUgInJlZmVyZW5jZWQgcHJvamVjdHMiIGxpc3QgZnJvbSB0aGUgcHJvamVjdCdzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3RUb0JlQWRkZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQmVBZGRlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCXByb2plY3RzTGlzdC5hZGQocHJvamVjdFRvQmVBZGRlZCk7Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgYSBhbiBpbW1lZGlhdGUgYnVpbGQgb2YgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlQXV0b0J1aWxkKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9SZXZpc2l0OiBOZWVkIHRvIHVzZSBhIExvZ2dlcgotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIGF1dG8gYnVpbGQgaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEN1cnJlbnRBdXRvQnVpbGRTZXR0aW5nKCkgewotCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIHdkLmlzQXV0b0J1aWxkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIG1heSBiZSBhbiA8Y29kZT5JUHJvamVjdCwgSVJlc291cmNlLCBJQWRhcHRhYmxlICh0byBhbiBJUHJvamVjdCksIEVPYmplY3QgKGdldHMgSVByb2plY3QgaWYgb2JqZWN0IGlzIGluIGEgUHJvamVjdFJlc291cmNlU2V0PC9jb2RlPi4KLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gcmV0dXJucyBwcm9qZWN0LiBJZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiByZXR1cm5zIHByb2plY3Qgb25seSBpZiBwcm9qZWN0IGhhcyB0aGlzIG5hdHVyZSBpZC4KLQkgKiBAcmV0dXJuIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gZ2V0UHJvamVjdChvYmplY3QpOwotCQlpZiAobmF0dXJlSWQgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuaXNBY2Nlc3NpYmxlKCkgJiYgbmF0dXJlSWQgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc3VsdC5oYXNOYXR1cmUobmF0dXJlSWQpKQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgbWF5IGJlIGFuIDxjb2RlPklQcm9qZWN0LCBJUmVzb3VyY2UsIElBZGFwdGFibGUgKHRvIGFuIElQcm9qZWN0KSwgRU9iamVjdCAoZ2V0cyBJUHJvamVjdCBpZiBvYmplY3QgaXMgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQ8L2NvZGU+LgotCSAqIEByZXR1cm4gcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpIG9iamVjdDsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzdWx0ID0gKChJUmVzb3VyY2UpIG9iamVjdCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXN1bHQgPSBnZXRQcm9qZWN0KChFT2JqZWN0KSBvYmplY3QpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gRU9iamVjdC4gKElmIGluIGEgUHJvamVjdFJlc291cmNlU2V0LCB0aGVuIHRoZSBwcm9qZWN0IGZyb20gdGhhdCByZXNvdXJjZSBzZXQpLgotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogQHJldHVybiBwcm9qZWN0IGlmIGFzc29jaWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBhUmVmT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldFByb2plY3QocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCVN0cmluZyBmaWxlU3RyaW5nID0gVVJJLmRlY29kZSh1cmkucGF0aCgpKTsKLQkJCWZpbGVTdHJpbmcgPSBmaWxlU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpICsgMSk7Ci0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBSZXNvdXJjZS4gKElmIGluIGEgUHJvamVjdFJlc291cmNlU2V0LCB0aGVuIHRoZSBwcm9qZWN0IGZyb20gdGhhdCByZXNvdXJjZSBzZXQpLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gcHJvamVjdCBpZiBhc3NvY2lhdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKHJlc291cmNlLmdldFVSSSgpKTsKLQkJCWlmIChmaWxlID09IG51bGwpIAotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCQkKLQkJaWYgKHNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCXJldHVybiAoKFByb2plY3RSZXNvdXJjZVNldCkgc2V0KS5nZXRQcm9qZWN0KCk7Ci0JCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBzZXQgPT0gbnVsbCA/IG51bGwgOiBzZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgJiYgKChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnZlcnRlcikuZ2V0T3V0cHV0Q29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCXJldHVybiAoKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgY29udmVydGVyKS5nZXRPdXRwdXRDb250YWluZXIoKS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbGlzdCBvZiBwcm9qZWN0cyBmcm9tIHRoZSBsaXN0IG9mICJyZWZlcmVuY2VkIHByb2plY3RzIiBpbiB0aGUgcHJvamVjdCdzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHRvQmVSZW1vdmVkUHJvamVjdExpc3QKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIExpc3QgdG9CZVJlbW92ZWRQcm9qZWN0TGlzdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQmVSZW1vdmVkUHJvamVjdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5yZW1vdmUodG9CZVJlbW92ZWRQcm9qZWN0TGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwcm9qZWN0IGZyb20gdGhlIGxpc3Qgb2YgInJlZmVyZW5jZWQgcHJvamVjdHMiIGluIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdG9CZVJlbW92ZWRQcm9qZWN0Ci0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdCB0b0JlUmVtb3ZlZFByb2plY3QpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQoKHByb2plY3RzW2ldKSk7Ci0JCX0KLQotCQlwcm9qZWN0c0xpc3QucmVtb3ZlKHRvQmVSZW1vdmVkUHJvamVjdCk7Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHVybiBhdXRvLWJ1aWxkaW5nIG9mZi4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9mZigpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHVybiBhdXRvLWJ1aWxkaW5nIG9uLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0dXJuQXV0b0J1aWxkT24oKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJd2Quc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhdXRvLWJ1aWxkaW5nIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBhQm9vbGVhbgotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdHVybiBhdXRvLWJ1aWxkaW5nIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0dXJuQXV0b0J1aWxkT24oYm9vbGVhbiBhQm9vbGVhbikgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyhhQm9vbGVhbik7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od2QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBidWlsZGVyIHRvIHRoZSBidWlsZCBzcGVjIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRlcklECi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFByb2plY3QgdG8gYWRkIHRvLgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgYnVpbGRlciBpZCB3YXMgYWN0dWFsbHkgYWRkZWQgKGl0IG1heSBoYXZlIGFscmVhZHkgZXhpc3RlZCkKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9CdWlsZFNwZWMoU3RyaW5nIGJ1aWxkZXJJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkVG9CdWlsZFNwZWNCZWZvcmUoYnVpbGRlcklELCBudWxsLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgYnVpbGRlciB0byB0aGUgYnVpbGQgc3BlYyBmb3IgdGhlIGdpdmVuIHByb2plY3QsIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3NvciBidWlsZGVyLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGVySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgYnVpbGRlci4KLQkgKiBAcGFyYW0gc3VjY2Vzc29ySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCB0byBwdXQgdGhlIGJ1aWxkZXIgYmVmb3JlLgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgYnVpbGRlciBpZCB3YXMgYWN0dWFsbHkgYWRkZWQgKGl0IG1heSBoYXZlIGFscmVhZHkgZXhpc3RlZCkKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9CdWlsZFNwZWNCZWZvcmUoU3RyaW5nIGJ1aWxkZXJJRCwgU3RyaW5nIHN1Y2Nlc3NvcklELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3NvckZvdW5kID0gZmFsc2U7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZGVzY3JpcHRpb24ubmV3Q29tbWFuZCgpOwotCQkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShidWlsZGVySUQpOwotCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggKyAxXTsKLQkJCWZvciAoaW50IGogPSAwLCBpbmRleCA9IDA7IGogPCBjb21tYW5kcy5sZW5ndGg7IGorKywgaW5kZXgrKykgewotCQkJCWlmIChzdWNjZXNzb3JJRCAhPSBudWxsICYmIGNvbW1hbmRzW2pdLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKHN1Y2Nlc3NvcklEKSkgewotCQkJCQlzdWNjZXNzb3JGb3VuZCA9IHRydWU7Ci0JCQkJCW5ld0NvbW1hbmRzW2luZGV4KytdID0gY29tbWFuZDsKLQkJCQl9Ci0JCQkJbmV3Q29tbWFuZHNbaW5kZXhdID0gY29tbWFuZHNbal07Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3NvckZvdW5kKQotCQkJCW5ld0NvbW1hbmRzW25ld0NvbW1hbmRzLmxlbmd0aCAtIDFdID0gY29tbWFuZDsKLQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gIWZvdW5kOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYnVpbGRlciBmcm9tIHRoZSBidWlsZCBzcGVjLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGVySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgYnVpbGRlci4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byByZW1vdmUgZnJvbS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gaWYgdGhlIGJ1aWxkZXIgaWQgd2FzIGZvdW5kIGFuZCByZW1vdmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21CdWlsZFNwZWMoU3RyaW5nIGJ1aWxkZXJJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kKSB7Ci0JCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW2NvbW1hbmRzLmxlbmd0aCAtIDFdOwotCQkJaW50IG5ld0NvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoIShjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSkgewotCQkJCQkvL0FkZCB0aGUgZXhpc3RuZyB0byB0aGUgbmV3IGFycmF5Ci0JCQkJCW5ld0NvbW1hbmRzW25ld0NvdW50XSA9IGNvbW1hbmRzW2ldOwotCQkJCQluZXdDb3VudCsrOwotCQkJCX0KLQkJCX0KLQotCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIGZvdW5kOwotCi0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoZSBjb250YWluZXIgaXMgbm90IHJlYWQtb25seS4KLQkgKiA8cD4KLQkgKiBGb3IgTGludXgsIGEgUmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQgaW4gYSBSZWFkT25seSBmb2xkZXIuIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIG5ldyBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSByZXNvdXJjZSB0byBtYWtlIHJlYWQvd3JpdGUKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5leGlzdHMoKSkgeyAvL2l0IG11c3QgYmUgbmV3Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHIgPSBjb250YWluZXIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7Ci0JCQl3aGlsZSAoYXR0ciAhPSBudWxsICYmICFhdHRyLmlzUmVhZE9ubHkoKSkgewotCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWF0dHIgPSBjb250YWluZXIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgYXR0ciAhPSBudWxsKQotCQkJCWF0dHIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHByb2plY3RzIGZyb20gcHJpbWFyeSBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZUlECi0JICogQHJldHVybiBBbGwgcHJvamVjdHMgdGhhdCBoYXZlIHRoZSBnaXZlbiBuYXR1cmUgaWQgYXMgdGhlIGZpcnN0IG5hdHVyZSBpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHNGb3JQcmltYXJ5TmF0dXJlKFN0cmluZyBuYXR1cmVJRCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzV2l0aE5hdHVyZSA9IG5ldyBJUHJvamVjdFtdIHt9OwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldEFsbFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1Byb2plY3RQcmltYXJ5TmF0dXJlKHByb2plY3RzW2ldLCBuYXR1cmVJRCkpCi0JCQkJcmVzdWx0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSByZXN1bHQudG9BcnJheShwcm9qZWN0c1dpdGhOYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqIAotCSAqIEByZXR1cm4gYWxsIHdvcmtzcGFjZSBwcm9qZWN0cwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxQcm9qZWN0cygpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIG5hdHVyZSBpZCB0aGUgcHJpbWFyeSBuYXR1cmUgaWQgZm9yIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gbmF0dXJlSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpcnN0IG5hdHVyZSBpZCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvamVjdFByaW1hcnlOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlEKSB7Ci0JCVN0cmluZ1tdIG5hdHVyZXMgPSBudWxsOwotCQl0cnkgewotCQkJbmF0dXJlcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCX0KLQkJcmV0dXJuIChuYXR1cmVzICE9IG51bGwgJiYgbmF0dXJlcy5sZW5ndGggPiAwICYmIG5hdHVyZXNbMF0uZXF1YWxzKG5hdHVyZUlEKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUGF0aCBjcmVhdGVQYXRoKElQcm9qZWN0IHAsIFN0cmluZyBkZWZhdWx0U291cmNlTmFtZSkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocC5nZXROYW1lKCkpOwotCQlwYXRoID0gcGF0aC5hcHBlbmQoZGVmYXVsdFNvdXJjZU5hbWUpOwotCQlwYXRoID0gcGF0aC5tYWtlQWJzb2x1dGUoKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgZXhpc3RpbmcgZmlsZXMgd2hpY2ggd2lsbCBiZSBtb2RpZmllZCBpZiB0aGUgY2xhc3NwYXRoIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiBwcm9lamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gbGlzdCBvZiBhZmZlY3RlZCBmaWxlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RmlsZXNBZmZlY3RlZEJ5Q2xhc3NwYXRoQ2hhbmdlKElQcm9qZWN0IHApIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlhZGRGaWxlSWZFeGlzdHMocCwgcmVzdWx0LCBET1RfQ0xBU1NQQVRIKTsKLQkJYWRkRmlsZUlmRXhpc3RzKHAsIHJlc3VsdCwgRE9UX1BST0pFQ1QpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRGaWxlSWZFeGlzdHMoSVByb2plY3QgcCwgTGlzdCBhTGlzdCwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCUlGaWxlIGFGaWxlID0gcC5nZXRGaWxlKGZpbGVuYW1lKTsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCi0JCQlhTGlzdC5hZGQoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIFN0cmlwIG9mZiBhIGxlYWRpbmcgIi8iIGZyb20gZWFjaCBwcm9qZWN0IG5hbWUgaW4gdGhlIGFycmF5LCBpZiBpdCBoYXMgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWNOYW1lcwotCSAqIEByZXR1cm4gYXJyYXkgb2YgcHJvamVjdCBuYW1lcyB3aXRoIGFsbCBsZWFkaW5nICcvJyByZW1vdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvamVjdE5hbWVzV2l0aG91dEZvcndhcmRTbGFzaChTdHJpbmdbXSBwcm9qZWNOYW1lcykgewotCQlTdHJpbmdbXSBwcm9qTmFtZXMgPSBuZXcgU3RyaW5nW3Byb2plY05hbWVzLmxlbmd0aF07Ci0JCUxpc3QgdGVtcCA9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KHByb2plY05hbWVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpICh0ZW1wLmdldChpKSk7Ci0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXByb2pOYW1lc1tpXSA9IG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qTmFtZXNbaV0gPSBuYW1lOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qTmFtZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgY3JlYXRlRmlsZVVSTChJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCBmaXJzdCBuZXdPYmplY3QgdGhhdCBpcyBub3QgaW4gdGhlIG9sZE9iamVjdHMgYXJyYXkgKHVzaW5nICI9PSIpLgotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmplY3RzCi0JICogQHBhcmFtIG5ld09iamVjdHMKLQkgKiBAcmV0dXJuIGZpcnN0IG5ld09iamVjdCBub3QgZm91bmQgaW4gb2xkT2JqZWN0cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYWxsIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5ld09iamVjdChPYmplY3RbXSBvbGRPYmplY3RzLCBPYmplY3RbXSBuZXdPYmplY3RzKSB7Ci0JCWlmIChvbGRPYmplY3RzICE9IG51bGwgJiYgbmV3T2JqZWN0cyAhPSBudWxsICYmIG9sZE9iamVjdHMubGVuZ3RoIDwgbmV3T2JqZWN0cy5sZW5ndGgpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3T2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gbmV3T2JqZWN0c1tpXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZE9iamVjdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG9sZE9iamVjdHNbal0gPT0gb2JqZWN0KSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKQotCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCWlmIChvbGRPYmplY3RzID09IG51bGwgJiYgbmV3T2JqZWN0cyAhPSBudWxsICYmIG5ld09iamVjdHMubGVuZ3RoID09IDEpCi0JCQlyZXR1cm4gbmV3T2JqZWN0c1swXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGlzdCBvZiBhbGwgZmlsZXMgaW4gdGhlIHByb2plY3QuCi0JICogPHA+Ci0JICogTm90ZTogQSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byB1c2Uge0BsaW5rIElSZXNvdXJjZSNhY2NlcHQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yLCBpbnQpfQotCSAqIAotCSAqIEBwYXJhbSAxLjAuMAotCSAqIEByZXR1cm4gbGlzdCBvZiBmaWxlcyBpbiB0aGUgcHJvamVjdAotCSAqIAotCSAqIEBzZWUgSVJlc291cmNlI2FjY2VwdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3IsIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUHJvamVjdEZpbGVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl0cnkgewotCQkJcmVzdWx0ID0gY29sbGVjdEZpbGVzKHByb2plY3QubWVtYmVycygpLCByZXN1bHQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgY29sbGVjdEZpbGVzKElSZXNvdXJjZVtdIG1lbWJlcnMsIExpc3QgcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHJlY3Vyc2l2ZWx5IGNvbGxlY3QgZmlsZXMgZm9yIHRoZSBnaXZlbiBtZW1iZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCWNvbGxlY3RGaWxlcygoKElGb2xkZXIpIHJlcykubWVtYmVycygpLCByZXN1bHQpOwotCQkJfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJlc3VsdC5hZGQocmVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuIGEgSVByb2plY3QgZ2l2ZW4gdGhlIHByb2plY3ROYW1lCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYnVpbGRlciBuYW1lIGlzIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGJ1aWxkZXJOYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBidWlsZGVyIG5hbWUgaXMgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0J1aWxkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGJ1aWxkZXJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJQ29tbWFuZFtdIGJ1aWxkZXJzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZGVycy5sZW5ndGg7IGkrKykgewotCQkJCUlDb21tYW5kIGJ1aWxkZXIgPSBidWlsZGVyc1tpXTsKLQkJCQlpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWlsZGVyLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJOYW1lKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNzA3ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgcHJvdmlkZSBleHRlbnNpb24gY2FwYWJpbGl0aWVzIG9uIHJlc291cmNlIHNldC4gU3VjaCBhcyBsb29raW5nIG9yIGNyZWF0aW5nIGluIG90aGVyIHJlc291cmNlIHNldHMgZm9yIGEKLSAqIHJlc291cmNlIG9yIGFuIEVPYmplY3QuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQjYWRkKFJlc291cmNlSGFuZGxlcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBFYWNoIFJlc291cmNlSGFuZGxlciBmb3IgYSBXb3JrYmVuY2hDb250ZXh0ICh3aGljaCBob2xkcyBhIFByb2plY3RSZXNvdXJjZVNldCkgd2lsbCBnZXQgYW4gb3BvcnR1bml0eSB0byBnZXQgdGhlIFJlc291cmNlIGdpdmVuIHRoZSB1cmlTdHJpbmcKLQkgKiBwcmlvciB0byB0aGUgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCBnZXR0aW5nIGl0IGluIHRoZSBub3JtYWwgbWFubmVyLgotCSAqIAotCSAqIElmIHRoaXMgaGFuZGxlciBsb2FkZWQgYSBSZXNvdXJjZSBpbiBpdHMgY3JlYXRlKFJlc291cmNlU2V0LCB1cmlTdHJpbmcpIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIGl0IGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBpZiBmb3VuZCBvciA8Y29kZT5udWxsbC9jb2RlPiBpZiB0aGlzIGhhbmRsZXIgZGlkbid0IGZpbmQgaXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEVPYmplY3QgZm9yIHRoZSBnaXZlbiBVUkksIGlmIGl0IGNhbi4gTG9hZCB0aGUgcmVzb3VyY2UgaWYgbG9hZE9uRGVtYW5kIGlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdXJpIG9mIEVPYmplY3QgYmVpbmcgcmVxdWVzdGVkCi0JICogQHBhcmFtIGxvYWRPbkRlbWFuZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzb3VyY2Ugc2hvdWxkIGJlIGxvYWRlZAotCSAqIEByZXR1cm4gZW9iamVjdCBpZiBmb3VuZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCi0JICovCi0JRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcmVzb3VyY2UgcG9pbnRlZCB0byBiZSB0aGUgVVJJIGlmIHRoaXMgaGFuZGxlciB3aWxsIGhhbmRsZSBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIGNyZWF0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGhhbmRsZXIgZG9lc24ndCBoYW5kbGUgdGhpcyB0eXBlLgotCSAqLwotCVJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2VjNTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFN5bmNocm9uaXplciBvbiB0aGUgd29ya2JlbmNoLiBJdCBsaXN0ZW5zIGZvciB0aGUgcHJvamVjdCB0byBzZWUgaWYgaXQgaXMgY2xvc2VkIG9yIGRlbGV0ZWQuIElmIGl0IGRvZXMgaXQgbm90aWZpZXMgdGhpcyBvdXQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKiBFeHRlbmRlcnMgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIGFmdGVyIGEgcHJlIGJ1aWxkIHJlc291cmNlIGNoYW5nZSAqLwotCXByb3RlY3RlZCBMaXN0IGV4dGVuZGVyczsKLQotCS8qKiBUaGUgZGVsdGEgZm9yIHRoaXMgcHJvamVjdCB0aGF0IHdpbGwgYmUgYnJvYWRjYXN0IHRvIHRoZSBleHRlbmRlcnMgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlRGVsdGEgY3VycmVudFByb2plY3REZWx0YTsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRFdmVudFR5cGUgPSAtMTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHRha2luZyBhIHJlc291cmNlIHNldCBhbmQgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmVzb3VyY2VTZXQgPSBhUmVzb3VyY2VTZXQ7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJaWYgKGFSZXNvdXJjZVNldCAhPSBudWxsICYmIGFSZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCSgoUHJvamVjdFJlc291cmNlU2V0KSBhUmVzb3VyY2VTZXQpLnNldFN5bmNocm9uaXplcih0aGlzKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBmb3IgdGhpcyBzeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJY3VycmVudEV2ZW50VHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKLQkJY3VycmVudFByb2plY3REZWx0YSA9IG51bGw7Ci0JCWlmICgoY3VycmVudEV2ZW50VHlwZSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfHwgY3VycmVudEV2ZW50VHlwZSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKQotCQkJCSYmIGV2ZW50LmdldFJlc291cmNlKCkuZXF1YWxzKGdldFByb2plY3QoKSkpIHsKLQkJCW5vdGlmeUV4dGVuZGVyc09mQ2xvc2UoKTsKLQkJCXJlbGVhc2UoKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RXh0ZW5kZXJzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChjdXJyZW50RXZlbnRUeXBlICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIHx8IGV4dGVuZGVycyA9PSBudWxsIHx8IGN1cnJlbnRQcm9qZWN0RGVsdGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlciA9IChJU3luY2hyb25pemVyRXh0ZW5kZXIpIGV4dGVuZGVycy5nZXQoaSk7Ci0JCQlleHRlbmRlci5wcm9qZWN0Q2hhbmdlZChjdXJyZW50UHJvamVjdERlbHRhKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUV4dGVuZGVyc09mQ2xvc2UoKSB7Ci0JCWlmIChleHRlbmRlcnMgIT0gbnVsbCAmJiAhZXh0ZW5kZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVN5bmNocm9uaXplckV4dGVuZGVyKSBleHRlbmRlcnMuZ2V0KGkpOwotCQkJCWV4dGVuZGVyLnByb2plY3RDbG9zZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlnZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsCi0JCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoZSBzeW5jaHJvbml6ZXIuIENhbGxlZCB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJvamVjdCBpcyBnb2luZyBhd2F5IHNvIHdlIG5lZWQgdG8gY2xlYW51cCBvdXJzZWxmIGFuZCB0aGUgUmVzb3VyY2VTZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKEpFTVV0aWxQbHVnaW4uaXNBY3RpdmF0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQkJCSgoUHJvamVjdFJlc291cmNlU2V0KSByZXNvdXJjZVNldCkucmVsZWFzZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5yZW1vdmVDYWNoZWRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGV4dGVuZGVyIHRvIGJlIG5vdGlmaWVkIG9mIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5kZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIpIHsKLQkJaWYgKGV4dGVuZGVycyA9PSBudWxsKQotCQkJZXh0ZW5kZXJzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJZXh0ZW5kZXJzLmFkZChleHRlbmRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGV4dGVuZGVyIGZyb20gbm90aWZpY2F0aW9uIG9mIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5kZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIpIHsKLQkJaWYgKGV4dGVuZGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlleHRlbmRlcnMucmVtb3ZlKGV4dGVuZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICcoJyArICgoZ2V0UHJvamVjdCgpICE9IG51bGwpID8gZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6ICJudWxsIikgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUZWxsIFN5bmNocm9uaXplciB0aGF0IGEgZmlsZSBpcyBhYm91dCB0byBiZSBzYXZlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYW4gRU1GIHJlc291cmNlLgotCSAqIDxwPgotCSAqIERlZmF1bHQgZG9lcyBub3RoaW5nLCBidXQgc3ViY2xhc3NlcyBjYW4gZG8gc29tZXRoaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgYWJvdXQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSkgewotCQkvL0RlZmF1bHQgaXMgZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MmY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci0KLS8qKgotICogQnl0ZUFycmF5IE91dHB1dFN0cmVhbSBmb3IgdGhlIFdvcmtiZW5jaC4gSXQgd29ya3Mgd2l0aCB0aGUgc3luY2hyb25pemVyIHtAbGluayBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyfXRvCi0gKiBub3RpZnkgb2YgYSBzYXZlLiBJdCBhbHNvIGNoYW5nZXMgYWxsIG9mIHRoZSBsaW5lIHNlcGFyYXRvcnMgdG8gdGhlIGN1cnJlbnQgc3lzdGVtIGxpbmUgc2VwYXJhdG9yLCBpLmUuIGlmIHRoZXJlIGFyZSBzb21lICdccicgYW5kIHdlIGFyZSBvbgotICogV2luZG93cyhSKSB0aGVuIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gJ1xuXHInKSwgaWYgdGhlIHNldHRpbmcgZm9yIHRoZSBzdHJlYW0gaXMgdG8gZG8gZW9sIGNvbnZlcnNpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbC5QbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShJRmlsZSBhRmlsZSkgewotCQl0aGlzKGFGaWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIElGaWxlIGFuZCBhIHN5bmNocm9uaXplci4gVGhpcyB3YXkgc3luY2hyb25pemVyIHdpbGwga25vdyB3aGVuIGZpbGUgaXMgYWJvdXQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKElGaWxlIGFGaWxlLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXN1cGVyKGFGaWxlLCBmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCXN5bmNocm9uaXplciA9IGFTeW5jaHJvbml6ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3luY2hyb25pemVyICE9IG51bGwpCi0JCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShmaWxlKTsKLQkJc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwuUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbSNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3luY2hyb25pemVyICE9IG51bGwpCi0JCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShmaWxlKTsKLQkJc3VwZXIuZmx1c2goKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29udmVydEVPTChieXRlW10gZGF0YSkgewotCQkvLyBBbGdvcml0aG06Ci0JCS8vIFJlbW92ZSBhbGwgJ1xyJyBjaGFycwotCQkvLyBSZXBsYWNlIGFsbCAnXG4nIGNoYXJzIHdpdGggbGluZSBzZXBlcmF0b3IgY2hhcnMKLQotCQlTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlieXRlW10gRU9MQnl0ZXMgPSBFT0wuZ2V0Qnl0ZXMoKTsKLQotCQlpbnQgb3V0ID0gMDsKLQotCQlmb3IgKGludCBpbiA9IDA7IGluIDwgZGF0YS5sZW5ndGg7IGluKyspIHsKLQkJCWlmIChkYXRhW2luXSA9PSAnXHInKSB7Ci0JCQkJLy8gZG9uJ3Qgb3V0cHV0IChpZSwgdGhyb3cgdGhlIGNoYXIgYXdheSkKLQkJCX0gZWxzZSBpZiAoZGF0YVtpbl0gPT0gJ1xuJykgewotCQkJCS8vIFRoZSBjb2RlIGRvZXMgbm90IGN1cnJlbnRseSBoYW5kbGUgZXhwYW5kaW5nIHRoZSBhcnJheQotCQkJCWlmICgoaW4gLSBvdXQgKyAxKSA8IEVPTEJ5dGVzLmxlbmd0aCkKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW06IEV4cGFuZGluZyBFT0wgY2hhcnMgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRU9MQnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGF0YVtvdXQrK10gPSBFT0xCeXRlc1tpXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEp1c3QgY29weSB0aGUgZGF0YQotCQkJCWRhdGFbb3V0KytdID0gZGF0YVtpbl07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3V0OwotCX0KLQotCS8qKgotCSAqIElzIEVPTCBjb252ZXJzaW9uIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIEVPTCBjb252ZXJzaW9uIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnZlcnRFT0xDaGFycygpIHsKLQkJcmV0dXJuIGZDb252ZXJ0RU9MOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgRU9MIGNvbnZlcnNpb24gZmxhZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBjdXJyZW50IGxpbmUgc2VwYXJhdG9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDaGFycyhib29sZWFuIHNldCkgewotCQlmQ29udmVydEVPTCA9IHNldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvQnl0ZUFycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKLQkJYnl0ZVtdIGNvbnRlbnRzID0gc3VwZXIudG9CeXRlQXJyYXkoKTsKLQkJaWYgKGlzQ29udmVydEVPTENoYXJzKCkpCi0JCQljb252ZXJ0RU9MKGNvbnRlbnRzKTsKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI2MjM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA4LzAzLzEyIDE0OjIxOjM5ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLldvcmtzcGFjZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFdvcmtiZW5jaCByZXNvdXJjZSBoZWxwZXIKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgewotCi0JLyoqCi0JICogRXZlcnl0aGluZyBpcyBzdGF0aWMsIGRvbid0IGtub3cgd2h5IHRoZXJlIGlzIGFuIGluc3RhbmNlIGhlcmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgSU5TVEFOQ0UgPSBuZXcgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlciB3b3Jrc3BhY2VVUklMb2FkZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCBjb250YWluZWQgPSByZWZPYmplY3QuZUNvbnRlbnRzKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZC5zaXplKCk7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIGNvbnRhaW5lZC5nZXQoaSk7Ci0JCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVOb25Db250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCQlpZiAocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZS5zaXplKCk7IGorKykKLQkJCQkJCXZhbHVlLmdldChqKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZPYmplY3QuZUdldChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcmNlIGFsbCBvZiB0aGUgcHJveGllcyB3aXRoIDxjb2RlPnJlc291cmNlPC9jb2RlPiB0byBiZSByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJCUVPYmplY3QgbW9mT2JqZWN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKLQkJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBwcm94aWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGUgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gbGlzdCBvZiBwcm94aWVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnYXRoZXJQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IHRvcExldmVscy5zaXplKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIHRvcExldmVscy5nZXQoaSk7Ci0JCQlnYXRoZXJQcm94aWVzKChJbnRlcm5hbEVPYmplY3QpIG1vZk9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdhdGhlclByb3hpZXMoSW50ZXJuYWxFT2JqZWN0IHJlZk9iamVjdCwgTGlzdCBwcm94aWVzKSB7Ci0JCWlmIChyZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGlzdCBjb250YWlucyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCWlmIChjb250YWlucyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNvbnRhaW5zLnNpemUoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgY29udGFpbnMuZ2V0KGkpOwotCQkJCWdhdGhlclByb3hpZXMocmVmT2JqZWN0LCBzZiwgcHJveGllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2F0aGVyUHJveGllcyhJbnRlcm5hbEVPYmplY3QgcmVmT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIExpc3QgcHJveGllcykgewotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSBudWxsOwotCQlpZiAoc2YuaXNNYW55KCkgfHwgcmVmT2JqZWN0LmVJc1NldChzZikpIHsKLQkJCXZhbHVlID0gcmVmT2JqZWN0LmVHZXQoc2YsIGZhbHNlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNmLmlzTWFueSgpKSB7Ci0JCQkJCUl0ZXJhdG9yIGogPSAoKEludGVybmFsRUxpc3QpIHZhbHVlKS5iYXNpY0l0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChqLmhhc05leHQoKSkgewotCQkJCQkJcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBqLm5leHQoKTsKLQkJCQkJCWlmIChwcm94eS5lSXNQcm94eSgpKQotCQkJCQkJCXByb3hpZXMuYWRkKHByb3h5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKQotCQkJCQlwcm94aWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJaWYgKHJlZk9iamVjdCAhPSBudWxsKSB7Ci0JCQlyZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOwotCQkJcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzdGluZyBjb250ZXh0IGJhc2Ugb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgYmFzZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmdldEVNRkNvbnRleHQoYVByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlc291cmNlIGZyb20gdGhlIFVSSS4gVGhlIFVSSSBtdXN0IGNvbnRhaW4gdGhlIHByb2plY3QgbmFtZSwgZWl0aGVyIGFzIHRoZSBmaXJzdCBzZWdtZW50LCBvciBpZiBpbiBwbGF0Zm9ybSByZXNvdXJjZSB1cmwgcHJvdG9jb2wuCi0JICoge0BsaW5rICNnZXRSZXNvdXJjZVNldChVUkkpfQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlIGZvciB0aGUgdXJpIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgdXJpCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGEgY2FjaGVkIFJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBub25lIGlzIGZvdW5kLCBjcmVhdGUgYSBuZXcgUmVzb3VyY2UgZm9yIHdpdGggdGhlIFVSSSBhZ2FpbnN0IHRoZSBwcm9wZXIgUmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgcHJvamVjdCB1cmkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSwgZ2V0UmVzb3VyY2VTZXQodXJpKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBVUkkuIFRoZSBVUkkgbXVzdCBiZSBhIHdvcmtiZW5jaCBwcm9qZWN0IHN0eWxlIFVSSS4gCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gdGhlIElGaWxlIGlmIHRoZSBVUkkgaXMgYSBwcm9qZWN0IGZvcm0sIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgZm9ybSwgT1IgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdC4gVGhlIElGaWxlIHJldHVybmVkIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZXhpc3QuIFVzZSB7QGxpbmsgSUZpbGUjZXhpc3RzKCl9IHRvIHRlc3QgdGhhdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldElGaWxlKFVSSSB1cmkpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QodXJpKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aDsKLQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBwYXRoIGFuZCByZW1vdmUgdGhlIGZpcnN0IHR3byBzZWdtZW50cyAoL3Jlc291cmNlL3Byb2plY3QgbmFtZS8pLgotCQkJCXBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcGF0aCBhbmQgcmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50ICgvcHJvamVjdCBuYW1lLykuCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhIGNhY2hlZCBSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgbm9uZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IFJlc291cmNlIGZvciB3aXRoIHRoZSBVUkkgYWdhaW5zdCB0aGUgZ2l2ZW4gUmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIHVyaSAKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzZXQgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IHNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXMgPSBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCXJldHVybiByZXM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIGNvbnRleHQgYmFzZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uIEFsbG93IHRoZSA8Y29kZT5jb250cmlidXRvcjwvY29kZT4gdG8gY29udHJpYnV0ZSB0byB0aGUgbmV3IG9yIGV4aXN0aW5nCi0JICogbmF0dXJlIHByaW9yIHRvIHJldHVybmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gY29udHJpYnV0b3IKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRU1GQ29udGV4dChhUHJvamVjdCwgY29udHJpYnV0b3IpOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhlIHBhc3NlZCBVUkkgaGF2ZSB0aGUgZm9ybSBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uID8KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBhIHBsYXRmb3JtIHJlc291cmNlIHByb3RvY29sLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUmVzb3VyY2VVUkkoVVJJIHVyaSkgewotCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhcGkgbWF5IGJlIHVzZWQgdG8gY2FjaGUgYSBSZXNvdXJjZSBpZiBpdCBoYXMgYSBVUkkgdGhhdCBpcyBXb3Jrc3BhY2UgcmVsYXRpdmUuIFJldHVybiB0cnVlIGlmIGl0IGlzIGNhY2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCB3YXMgc3VjY2Vzc2Z1bCB0byBjYWNoZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldChhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXBpIGlzIHVzZWQgaWYgeW91IGNyZWF0ZSBhIG5ldyBNT0YgcmVzb3VyY2UgYW5kIHlvdSB3YW50IHRvIGFkZCBpdCB0byB0aGUgY29ycmVjdCBSZXNvdXJjZVNldC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZCB0aGUgSVByb2plY3QKLQkgKiB0aGF0IHlvdSB3YW50IGFSZXNvdXJjZSB0byBiZSBjYWNoZWQgd2l0aGluIGFzIHdlbGwgYXMgdGhlIElQYXRoIHdoaWNoIGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgUmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzb3VyY2Ugd2FzIGNhY2hlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShJUHJvamVjdCBhUHJvamVjdCwgUmVzb3VyY2UgYVJlc291cmNlLCBJUGF0aCBmdWxsUGF0aCkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KGFQcm9qZWN0KTsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlVUkkgY29udmVydGVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKGNvbnZlcnRlZCAhPSBhUmVzb3VyY2UuZ2V0VVJJKCkpCi0JCQkJYVJlc291cmNlLnNldFVSSShjb252ZXJ0ZWQpOwotCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwYXRoIG9mIHRoZSBwcm9qZWN0IHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb3IgcmVsYXRpdmUgdG8gdGhlIGxpc3Qgb2YgY29udGFpbmVycyBpbiB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEByZXR1cm4gcGF0aAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdHVhbFByb2plY3RSZWxhdGl2ZVVSSShJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gZ2V0UGF0aEluUHJvamVjdChwcm9qZWN0LCBhUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCXJldHVybiBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElQYXRoIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCBhIFJlc291cmNlIHVzaW5nIHRoZSA8Y29kZT5mdWxsUGF0aDwvY29kZT4uIFRoaXMgd2lsbCBiZSBhIHByb2plY3QgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gcGF0aAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGF0aEluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgewotCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJaWYgKCFjb250YWluZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoY29udGFpbmVycywgZnVsbFBhdGgpOwotCQlyZXR1cm4gZnVsbFBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgbmF0dXJlID0gY3JlYXRlRU1GQ29udGV4dChwcm9qZWN0LCBudWxsKTsKLQkJaWYgKG5hdHVyZSAhPSBudWxsKSB7Ci0JCQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJaWYgKGNvbnYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29udi5nZXRJbnB1dENvbnRhaW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHBhdGggaXMgY29udGFpbmVkIHdpdGhpbiBvbmUgb2YgdGhlIGxpc3RlZCBjb250YWluZXJzLCB0aGVuIHJldHVybiB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJzCi0JICogQHBhcmFtIGZ1bGxQYXRoCi0JICogQHJldHVybiBwYXRoIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyLCBvciB1bmNoYW5nZWQgcGF0aCBpZiBub3QgaW4gYSBjb250YWluZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzLCBJUGF0aCBmdWxsUGF0aCkgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIHJlc3VsdDsKLQkJaW50IHNpemUgPSBjb250YWluZXJzLnNpemUoKTsKLQkJaW50IG1hdGNoaW5nID0gLTE7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljb250YWluZXIgPSAoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSk7Ci0JCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCQltYXRjaGluZyA9IGZ1bGxQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhjb250YWluZXJQYXRoKTsKLQkJCWlmIChtYXRjaGluZyA+IDAgJiYgbWF0Y2hpbmcgPT0gY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJCXJlc3VsdCA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmcpOwotCQkJCXJlc3VsdCA9IHJlc3VsdC5tYWtlUmVsYXRpdmUoKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmdWxsUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+dXJpPC9jb2RlPiBoYXMgaXRzIGNvbnRhaW5lciBzZWdtZW50cyB2aXNpYmxlIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lcnMgZm9yIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1cmkgaXMgdmlzaWJsZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250YWluZXJTdHJ1Y3R1cmUoSVByb2plY3QgcHJvamVjdCwgVVJJIHVyaSkgewotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpLnRvU3RyaW5nKCkpOwotCQkJTGlzdCBjb250YWluZXJzID0gZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSBzZWdtZW50Q291bnQgPiAxID8gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkgOiBudWxsOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY29udGFpbmVyID0gKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCQkJCWlmICghY29udGFpbmVyLmlzQWNjZXNzaWJsZSgpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoc2VnbWVudENvdW50ID09IDEpIHsKLQkJCQkJaWYgKGNvbnRhaW5lciA9PSBwcm9qZWN0KQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKGNvbnRhaW5lclBhdGgpOwotCQkJCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGUgdXJpLiBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLiBJdCB3aWxsIGJlIGxvYWRlZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuIElmIGl0IGlzIG5vdCB0bwotCSAqIGJlIGxvYWRlZCBpZiBub3QgbG9hZGVkIHVzZSB7QGxpbmsgI2dldFJlc291cmNlKFVSSSwgYm9vbGVhbil9IGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9qZWN0IG5vdCBmb3VuZCBvciBub3QgYSB2YWxpZCBwcm9qZWN0IHJlc291cmNlLgotCSAqIAotCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSB3aXRob3V0IGZvcmNpbmcgYSBsb2FkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShhRmlsZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUsIGZvcmNpbmcgYSBsb2FkIGlmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gc2F5cyBzby4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGZvcmNlIGEgbG9hZCBvZiByZXNvdXJjZSBpZiBub3QgbG9hZGVkLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlIHdpdGhvdXQgYSBsb2FkIGlmIG5vdCBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgbG9hZChJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoYUZpbGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgZm9yIHRoZSB1cmkuIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKLQkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCi0JICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2F1c2UgcmVzb3VyY2UgdG8gYmUgbG9hZGVkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdCBub3QgZm91bmQsIG9yIG5vdCBhIHZhbGlkIHByb2plY3QgcmVzb3VyY2UgdXJpLgotCSAqIAotCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZCBpZiBsb2FkT25EZW1hbmQgaXMgdHJ1ZS4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBVUkkuIFRoZSBVUkkgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQgcGxhdGZvcm06L3Jlc291cmNlL3twcm9qZWN0IG5hbWV9Ly4uLiBvciB7cHJvamVjdCBuYW1lfS8uLi4gZm9yIHRoaXMKLQkgKiBhcGkgdG8gd29yay4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBvZiBjb3JyZWN0IGZvcm0gb3IgcHJvamVjdCBkb2Vzbid0IGhhdmUgYSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChVUkkgdXJpKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHVyaSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGUgdXJpIGlmIHRoZSB1cmkgaXMgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCBmb3JtYXQgdXJpLiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lOwotCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCi0JCQlwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOwotCQllbHNlIGlmICh1cmkuc2NoZW1lKCkgPT0gbnVsbCkgewotCQkJcHJvamVjdE5hbWUgPSBuZXcgUGF0aCh1cmkucGF0aCgpKS5zZWdtZW50KDApOyAvL2Fzc3VtZSBwcm9qZWN0IG5hbWUgaXMgZmlyc3QgaW4gdGhlIFVSSQotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVVJJLmRlY29kZShwcm9qZWN0TmFtZSkpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBJUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIG5hdCA9IGNyZWF0ZUVNRkNvbnRleHQocHJvamVjdCwgbnVsbCk7Ci0JCWlmIChuYXQgIT0gbnVsbCkKLQkJCXJldHVybiBuYXQuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB3b3Jrc3BhY2UuIChqdXN0IHVzZSB7QGxpbmsgUmVzb3VyY2VzUGx1Z2luI2dldFdvcmtzcGFjZSgpfSkuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBzZXQKLQkgKiBAcmV0dXJuIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVzb3VyY2Ugc2V0IG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KSB7Ci0JCQkJUHJvamVjdFJlc291cmNlU2V0IHBzZXQgPSAoUHJvamVjdFJlc291cmNlU2V0KSBzZXQ7Ci0JCQkJcmV0dXJuIHBzZXQuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWRVUklNYXBwaW5nKFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlID0gaHJlZjsKLQkJCWludCBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpOwotCQkJaWYgKGluZGV4ID4gLTEpCi0JCQkJZmlsZSA9IGhyZWYuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCXJldHVybiBVUklDb252ZXJ0ZXIuVVJJX01BUC5nZXQoZmlsZSkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHJlc291cmNlIHNldCBhbmQgdGhlbiB1bmxvYWQgdGhlbS4gVW5sb2FkIGZvcmNlcyBhbGwgb2YgdGhlIG9iamVjdHMgdG8gYmVjb21lIHByb3hpZXMgc28gbmV4dCByZXNvbHZlIHdpbGwKLQkgKiByZWxvYWQgdGhlIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gYVNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbmRVbmxvYWRBbGwoTGlzdCByZXNvdXJjZXMsIFJlc291cmNlU2V0IGFTZXQpIHsKLQkJaWYgKGFTZXQgPT0gbnVsbCB8fCByZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlhU2V0LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZXNvdXJjZXMpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXMudW5sb2FkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUdXJuIG9iamVjdCBpbnRvIGEgcHJveHkuCi0JICogCi0JICogQHBhcmFtIGFuT2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvYmplY3Qgd2FzIGFibGUgdG8gYmVjb21lIGEgcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJlY29tZVByb3h5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IGFuT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJCQkoKEludGVybmFsRU9iamVjdCkgYW5PYmplY3QpLmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQocmVzLmdldFVSSUZyYWdtZW50KGFuT2JqZWN0KSkpOwotCQkJCS8vYW5PYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIFdyYXBwZWRFeGNlcHRpb24gaXMgYWN0dWFsbHkgYSBSZXNvdXJjZSBOb3QgRm91bmQuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZWRFeAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgZXhjZXB0aW9uIHdyYXBwZXJzIGEgcmVzb3VyY2Ugbm90IGZvdW5kLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc291cmNlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJRXhjZXB0aW9uIGV4Y2VwID0gd3JhcHBlZEV4LmV4Y2VwdGlvbigpOwotCQl3aGlsZSAoZXhjZXAgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uKSB7Ci0JCQlleGNlcCA9ICgoV3JhcHBlZEV4Y2VwdGlvbikgZXhjZXApLmV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKGV4Y2VwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQoVGhyb3dhYmxlIGV4Y2VwKSB7Ci0JCWlmIChleGNlcCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBleGNlcCkuZ2V0U3RhdHVzKCk7Ci0JCQlyZXR1cm4gc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EICYmIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMuZXF1YWxzKHN0YXR1cy5nZXRQbHVnaW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBXcmFwcGVkRXhjZXB0aW9uIGlzIGFjdHVhbGx5IGEgUmVzb3VyY2UgTm90IEZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVkRXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIGV4Y2VwdGlvbiB3cmFwcGVycyBhIHJlc291cmNlIG5vdCBmb3VuZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXNvdXJjZU5vdEZvdW5kKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJcmV0dXJuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4LmdldENhdXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFVSSSByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQotCSAqIEByZXR1cm4gdXJpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0Tm9uUGxhdGZvcm1VUkkoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkocGxhdGZvcm1VUkkpKSB7Ci0JCQlTdHJpbmcgdXJpU3RyaW5nID0gcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKHBsYXRmb3JtVVJJKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHBsYXRmb3JtVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQotCSAqIEByZXR1cm4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb25QbGF0Zm9ybVVSSVN0cmluZyhVUkkgcGxhdGZvcm1VUkkpIHsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSShwbGF0Zm9ybVVSSSkpIHsgcmV0dXJuIHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhwbGF0Zm9ybVVSSSk7IH0KLQkJcmV0dXJuIHBsYXRmb3JtVVJJLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgInBsYXRmb3JtOi9yZXNvdXJjZS8iIGZyb20gdGhlIGZyb250IG9mIHRoZSBwbGF0Zm9ybVVSSSBhbmQgcmV0dXJuIHRoZSByZW1haW5pbmcgU3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCVN0cmluZyB1cmlTdHJpbmcgPSBwbGF0Zm9ybVVSSS50b1N0cmluZygpOwotCQkvLyJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpcyAxOSBjaGFyYWN0ZXJzLgotCQlyZXR1cm4gdXJpU3RyaW5nLnN1YnN0cmluZygxOSwgdXJpU3RyaW5nLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSBwYXNzZWQgVVJJIGhhdmUgdGhlIGZvcm0gcGxhdGZvcm06L3BsdWdpbi8uLi4gPwotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVyaSBpcyBwbGF0Zm9ybSBwbHVnaW4gcHJvdG9jb2wuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTY4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIFdvcmtiZW5jaFVSSSBjb252ZXJ0ZXJzLiBXb3JrYmVuY2ggVVJJIGNvbnZlcnRlcnMgaGFuZGxlIHJlZmVyZW5jZXMgdG8gZmlsZXMgaW4gdGhlIHByb2plY3QncyBjb250YWluZXJzLgotICogVGhpcyBjb252ZXJ0ZXIgaXMgb25seSBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBvbGQgYW1iaWd1b3VzIHdvcmtiZW5jaCBVUklzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2JlbmNoVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKLQotCS8qKgotCSAqIEFkZCBpbnB1dCBjb250YWluZXIgdG8gdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKTsKLQotCS8qKgotCSAqIEFkZCBsaXN0IG9mIGNvbnRhaW5lcnMgdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVycwotCSAqICAgICAgICAgICAgbGlzdCBvZiA8Y29kZT5JQ29udGFpbmVyPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXJzKExpc3QgY29udGFpbmVycyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgcmVsYXRpdmUgdG8gYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gZmlsZSByZWxhdGl2ZSB0byBhIGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEdldCBmaXJzdCBpbnB1dCBjb250YWluZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGZpcnN0IGlucHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJQ29udGFpbmVyIGdldElucHV0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGlucHV0IGNvbnRhaW5lcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlMaXN0IGdldElucHV0Q29udGFpbmVycygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBvdXRwdXQgY29udGFpbmVyIGlmIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIG91dHB1dCBjb250YWluZXIgb3IgPGNvZGU+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMmE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4NjFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotc3JjLnppcAotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNWVkMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaC9wZXJmPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMTJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDZkZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6NDA6NTIgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4Y2ViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEphbiAzMCAxOTo0NTo0MSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTgyNDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNlOTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLXNlYXJjaC8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkyMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIAotICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmNkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSEgUGx1Zy1pbiBwcm9wZXJ0aWVzCi1wbHVnaW5OYW1lICAgICA9IFdTVCBDb21tb24gQ29yZSBQbHVnLWluCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmY2YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZWFyY2hQYXJ0aWNpcGFudHMiIG5hbWU9IiVzZWFyY2hQYXJ0aWNpcGFudHMiIC8+ICAgICAgCi08L3BsdWdpbj4KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2M5NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc2NoZW1hL3NlYXJjaFBhcnRpY2lwYW50cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaCIgaWQ9InNlYXJjaFBhcnRpY2lwYW50cyIgbmFtZT0iJXNlYXJjaFBBcnRpY2lwYW50cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL0lTZWFyY2hPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMDVlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgbWFwIG9mIHNlYXJjaCBvcHRpb25zIHBhc3NlZAotICogdG8KLSAqIHtAbGluayBTZWFyY2hFbmdpbmUjc2VhcmNoKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuLCBTZWFyY2hSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGUsIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICogU2VhcmNoRW5naW5lLnNlYXJjaCgpfS4KLSAqIDxwPgotICogTm90ZSB0aGF0IG5vdCBhbGwgc2VhcmNoIHBhcnRpY2lwYW50cyB3aWxsIHByb3ZpZGUgc3BlY2lhbGl6ZWQgYmVoYXZpb3IgYmFzZWQgb24KLSAqIHVzZSBvZiB0aGVzZSBzZWFyY2ggb3B0aW9ucy4KLSAqIDxwPgotICogQWxzbyBub3RlIHRoYXQgaW5kaXZpZHVhbCBzZWFyY2ggcGFydGljaXBhbnRzIG1heSBzdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9ucyBub3QKLSAqIGxpc3RlZCBoZXJlLiBUaGVzZSBzZWFyY2ggb3B0aW9ucyBzaG91bGQgYmUgZm9ybWVkIHNvIHRoYXQgYSBzZWFyY2ggcGFydGljaXBhbnQgY2FuCi0gKiBzYWZlbHkgaWdub3JlIGFueSB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMgewotCi0JLyoqCi0JICogU2VhcmNoIG9wdGlvbiBzcGVjaWZ5aW5nIGEgdHJhZGUtb2ZmIGNob2ljZSBiZXR3ZWVuIHNlYXJjaCBwZXJmb3JtYW5jZSBhbmQKLQkgKiBjb21wbGV0ZW5lc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfT1BUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guUFJJT1JJVFkiOyAvLyROT05fTkxTXzEkCi0JLyoqCi0JICogQ2hvaWNlIGZvciB0aGUge0BsaW5rICNQUklPUklUWV9PUFRJT059IHNlYXJjaCBvcHRpb24gdGhhdCBlbXBoYXNpemVzCi0JICogcGVyZm9ybWFuY2UgYXQgdGhlIHBvc3NpYmxlIGV4cGVuc2Ugb2YgYWNjdXJhY3kuIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgZm9yCi0JICogYWxsIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQuIEluIHNvbWUgY2FzZXMsIHNlYXJjaAotCSAqIHJlc3VsdHMgbWF5IG5vdCBiZSBjb21wbGV0ZSBiZWNhdXNlIG9mIGluYWNjdXJhY2llcyBjYXVzZWQgYnkgdGltaW5nIHdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfVElNRUxJTkVTUyA9ICJGQVNUX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBDaG9pY2UgZm9yIHRoZSB7QGxpbmsgI1BSSU9SSVRZX09QVElPTn0gc2VhcmNoIG9wdGlvbiB0aGF0IGVtcGhhc2l6ZXMKLQkgKiBhY2N1cmFjeSBhdCB0aGUgcG9zc2libGUgZXhwZW5zZSBvZiB0aW1lbGluZXNzLiBUaGlzIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkCi0JICogZm9yIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQsIGJlY2F1c2Ugc29tZSBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgbWF5IGNob29zZSB0byB1c2UgdGltZS1jb25zdW1pbmcgYmFja2dyb3VuZCBwcm9jZXNzaW5nIHRvIHJldHVybiBhCi0JICogY29tcGxldGUgc2V0IG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfQ09NUExFVEVORVNTID0gIkNPTVBMRVRFX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBEZWZhdWx0IGNob2ljZSBmb3IgdGhlIHtAbGluayAjUFJJT1JJVFlfT1BUSU9OfSBzZWFyY2ggb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1ZBTFVFX0RFRkFVTFQgPSBQUklPUklUWV9WQUxVRV9USU1FTElORVNTOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWQxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLlNlYXJjaERvY3VtZW50U2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFRoZSB7QGxpbmsgU2VhcmNoRW5naW5lfSBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgd2F5IG9mIHNlYXJjaGluZyBmb3IgaW5mb3JtYXRpb24KLSAqIHdpdGhvdXQgdGhlIG5lZWQgb2Yga25vd2luZyBob3cgb3Igd2hlcmUgdGhhdCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuIFRoZSByZXN1bHRzCi0gKiByZXR1cm5lZCBieSBhIHNlYXJjaCBjb3VsZCBiZSBzY2F0dGVyZWQgaW4gYSBudW1iZXIgb2YgZmlsZXMgb3Igc3RvcmVkIGluIGFuIGluZGV4LgotICogRXhhbXBsZXMgb2YgdGhlIGluZm9ybWF0aW9uIHlvdSBjYW4gc2VhcmNoIGZvciBpbmNsdWRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZAotICogcmVmZXJlbmNlcywgcmVmZXJlbmNlcyBiZXR3ZWVuIGZpbGVzLCBhbmQgdXNlIG9mIHF1YWxpZmllcnMuCi0gKiA8cD4KLSAqIFRoZSBzZWFyY2ggY2FuIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpZWQgc2VhcmNoIHNjb3BlLCBvciB0aGUgZW50aXJlIHdvcmtzcGFjZSBjYW4KLSAqIGJlIHNlYXJjaGVkLiBTZWFyY2ggbWF0Y2hlcyBhcmUgcmV0dXJuZWQgdG8gdGhlIHNwZWNpZmllZCB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaEVuZ2luZSBpbXBsZW1lbnRzIElTZWFyY2hPcHRpb25zCi17Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBwYXR0ZXJuIHVzaW5nIGEgc3BlY2lmaWVkIHNldCBvZiBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgYW5kIHNlYXJjaCBzY29wZS4gU2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGZhY3RvcnkKLQkgKiBtZXRob2RzIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHNlYXJjaGVkIGZvcgotCSAqIChmb3IgZXhhbXBsZSwgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgYSBzcGVjaWZpZWQgdHlwZSwgaW4gYSBjYXNlIHNlbnNpdGl2ZQotCSAqIG1hbm5lcikuCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWFyY2ggcGFydGljaXBhbnRzIHRoYXQgd2lsbCBjb25kdWN0IHRoZSBzZWFyY2gKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cywgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQkJLyogaW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yICovCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDApOwotCi0gICAgICAgIFNlYXJjaERvY3VtZW50U2V0IHNldCA9IG5ldyBTZWFyY2hEb2N1bWVudFNldEltcGwoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIHJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOwotICAgICAgICAgICAgU2VhcmNoU2NvcGVbXSBzY29wZUFycmF5ID0gbmV3IFNlYXJjaFNjb3BlW3BhcnRpY2lwYW50cy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBwYXJ0aWNpcGFudHMgPT0gbnVsbCA/IDAgOiBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJewotCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCi0JCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0JCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0JCQkJCQk6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCk7Ci0JCQkJaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpZiAoc3ViTW9uaXRvciAhPSBudWxsKQotCQkJCQkJc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLmVuZ2luZV9zZWFyY2hpbmdfbG9jYXRpbmdEb2N1bWVudHMsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXQotCQkJCQkJCQl7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotCQkJCQlwYXJ0aWNpcGFudC5iZWdpblNlYXJjaGluZyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQkJCQkJLy8gcmVxdWVzdG9yLmVudGVyUGFydGljaXBhbnQocGFydGljaXBhbnQpOwotCQkJCQkvLyBwYXJ0aWNpcGFudCBjcmVhdGVzIGl0J3Mgb3duIHNlYXJjaCBzY29wZSAKLQkJCQkJU2VhcmNoU2NvcGUgbmV3U2NvcGUgPQotCQkJCQkJcGFydGljaXBhbnQuc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMocGF0dGVybiwgc2NvcGUsIHNlYXJjaE9wdGlvbnMsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBzY29wZUFycmF5W2ldID0gbmV3U2NvcGU7Ci0JCQkJCS8vIHBhcnRpY2lwYW50IGNyZWF0ZXMgc2VhcmNoIGRvY3VtZW50cyBiYXNlZCBvbiBpdCdzIHNlYXJjaCBzY29wZQotCQkJCQlwYXJ0aWNpcGFudC5jcmVhdGVTZWFyY2hEb2N1bWVudHMoc2V0LCBwYXR0ZXJuLCBuZXdTY29wZSwgc2VhcmNoT3B0aW9ucywgc3ViTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbCA9IHBhcnRpY2lwYW50cyA9PSBudWxsID8gMCA6IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspCi0gICAgICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0gICAgICAgICAgICAgICAgU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3ViTW9uaXRvciAhPSBudWxsICYmIHN1Yk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbG9jYXRlIGluZGV4IG1hdGNoZXMgaWYgYW55IChub3RlIHRoYXQgYWxsIHNlYXJjaCBtYXRjaGVzCi0gICAgICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIGlzc3VlZCBkdXJpbmcgaW5kZXggcXVlcnlpbmcpCi0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotICAgICAgICAgICAgICAgIC8vIGEgc2VhcmNoIGRvY3VtZW50IHNldCBzaG91bGQgY29udGFpbiBlbm91Z2ggaW5mbyB0byByZWR1Y2UgdGhlIHNlYXJjaCBzY29wZSBldmVuIGZ1cnRoZXIgCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGZpbmRpbmcgcHJlY2l6ZSBsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgc2NvcGUgY291bGQgYmUgbnVsbCBpZiB0aGUgcGFydGNpcGFudCBiYXJmZWQgYW5kIGV4ZXB0aW9uIGluIHRoZSBmaXJzdCBsb29wIAotICAgICAgICAgICAgICAgIGlmIChzY29wZUFycmF5W2ldICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5sb2NhdGVNYXRjaGVzKHNldCwgcGF0dGVybiwgc2NvcGVBcnJheVtpXSwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdG9yLmV4aXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7Ci0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5kb25lU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAKLSAgICAgICAgICAgIH0gICAgCi0JCX0gZmluYWxseQotCQl7Ci0gICAgICAgICAgICBzZXQuZGlzcG9zZSgpOwotCQkJLy8gcmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOwotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHBhdHRlcm4uIFNlYXJjaCBwYXR0ZXJucyBjYW4gYmUgY3JlYXRlZAotCSAqIHVzaW5nIGZhY3RvcnkgbWV0aG9kcyBhbmQgZW5jYXBzdWxhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZQotCSAqIHNlYXJjaGVkIGZvciAoZm9yIGV4YW1wbGUsIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIGEgc3BlY2lmaWVkIHR5cGUsIGluIGEgY2FzZQotCSAqIHNlbnNpdGl2ZSBtYW5uZXIpLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHJlcXVlc3RvcgotCSAqICAgICAgICAgICAgQ2FsbGJhY2sgb2JqZWN0IHRvIG5vdGlmeSB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2ggKGVhY2ggbWF0Y2gKLQkgKiAgICAgICAgICAgIGlzIHJlcG9ydGVkIHRvIHtAbGluayBTZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2gpfSkKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9Ci0JCQlnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicGFydGljaXBhbnRzID0gIiArIHBhcnRpY2lwYW50cy5sZW5ndGgpOwotCQlzZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIHRoZSBzZXQgb2YgcGFydGljaXBhbnRzIHRoYXQgc3VwcG9ydCBzZWFyY2hlcyBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIHNlYXJjaCBwYXR0ZXJuIGFuZCBvcHRpb25zLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIG1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHJldHVybiBBcnJheSBvZiBhcHBsaWNhYmxlIHNlYXJjaCBwYXJ0aWNpcGFudHMKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnRbXSBnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCU1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQkJcmV0dXJuIFNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkubG9hZFNlYXJjaFBhcnRpY2lwYW50cyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hNYXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTY5ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBBIHNlYXJjaCBtYXRjaCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzZWFyY2ggcXVlcnkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZSNzZWFyY2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm4sIFNlYXJjaFBhcnRpY2lwYW50W10sIElTZWFyY2hTY29wZSwKLSAqICAgICAgU2VhcmNoUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaE1hdGNoIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotCi0JLyoqCi0JICogT3B0aW9uYWwgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlJRmlsZSBmaWxlOyAvLyByZXNvdXJjZSB3aGVyZSBtYXRjaCBpcyBmb3VuZAotCi0JLyoqCi0JICogVGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICovCi0JaW50IG9mZnNldDsKLQotCS8qKgotCSAqIFRoZSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKi8KLQlpbnQgbGVuZ3RoOwotCi0JLyoqCi0JICogT3B0aW9uYWwgZWxlbWVudCB0aGF0IGVuY2xvc2VzIG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRjaAotCSAqLwotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdGhhdCBlbmNsb3NlcyBvciBjb3JyZXNwb25kcyB0byB0aGUgbWF0Y2gsIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFNlYXJjaE1hdGNoKE9iamVjdCBlbGVtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJRmlsZSByZXNvdXJjZSkKLQl7Ci0JCXRoaXMub2JqZWN0ID0gZWxlbWVudDsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpbGUgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0JewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQl7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpCi0JewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvLyBpc3N1ZSAoY3MvZWIpIGhvbGRpbmcgb2JqZWN0cyBpcyBhIGJpdCBvZGQsIHNpbmNlIGl0IGltcGxpZXMgdGhlIG9iamVjdCdzCi0JLy8gbGlmZSBzcGFuCi0JLy8gaXMgdGhlIHNhbWUgYXMgdGhlIFNlYXJjaE1hdGNoLiBXaGF0IGhhcHBlbnMgd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZD8KLQkvLyBkb2VzIHRoZSBTZWFyY2hNYXRjaCBnZXQgZGVsZXRlZD8gQXJlbid0IGNvb3JkaW5hdGVzIGdvb2QgZW5vdWdoPwotCS8vIGF0IHRoZSB2ZXJ5IGxlYXN0IHdlIHNob3VsZCBkb2N1bWVudCB0aGF0IHVzaW5nIHRoaXMgZmllbGQgaGFzIHNvbWUKLQkvLyBjb25zZXF1ZW5jZXMKLQkvKioKLQkgKiAoZWIpIHNlZSBjb21tZW50cyBmb3Ige0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0JewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIE9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBzb21lIHBhcnQgb2YgdGhlIG1vZGVsIHRoYXQgcmVwcmVzZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGVudCB0aGF0IHdhcyBzZWFyY2hlZC4gSXQgbWF5IHJlcXVpcmUgdG8gY2FsY3VsYXRlCi0JICogICAgICAgICAgICBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgcmVxdWlyZWQgYnkgdGhlIHRvb2xzCi0JICogICAgICAgICAgICB0aHJvdWdoIHtAbGluayAjZ2V0T2JqZWN0KCkpIChlLmcuIFhNTCBub2RlIG5hbWVzcGFjZSwKLQkgKiAgICAgICAgICAgIG5lc3Nlc2FyeSB0byBvYnRhaW4gdGhlIHByZWZpeCBmb3IgdGhlIHJlZmFjdG9yaW5nIHRvb2wpLgotCSAqICAgICAgICAgICAgPHA+Ci0JICogICAgICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZGFuZ2VyIGhlcmUgb2YgcHJldmVudGluZyB0aGUgb2JqZWN0IGZyb20KLQkgKiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWNhdXNlIGluc3RhbmNlcyBvZiB0aGUgc2VhcmNoIG1hdGNoZXMKLQkgKiAgICAgICAgICAgIHN1cHBvc2VkIHRvIGJlIHNob3J0IGxpdmVkLiB7QGxpbmsgU2VhcmNoTWF0Y2h9IGlzIHVzdWFsbHkKLQkgKiAgICAgICAgICAgIGNvbGxlY3RlZCBieSB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfSB3aGljaCBpdHNlbGYgaXMgbGl2ZWQgZm9yCi0JICogICAgICAgICAgICB0aGUgdGltZSBvZiB0aGUgc2VhcmNoIGFuZCB0aGVuIGRpc2NhcmRlZCBvciByZS1pbml0aWFsaXplZC4KLQkgKiAgICAgICAgICAgIFVzdWFsbHkgdGhlIHRvb2wgdGhhdCByZXF1ZXN0ZWQgYSBzZWFyY2ggZXh0cmFjdHMgdGhlCi0JICogICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2xsZWN0ZWQge0BsaW5rIFNlYXJjaE1hdGNofSBhbmQgYWZ0ZXIKLQkgKiAgICAgICAgICAgIHRoYXQge0BsaW5rIFNlYXJjaE1hdGNofSBjb3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgcmVsZWFzaW5nCi0JICogICAgICAgICAgICBvYmplY3QgdGhhdCB0aGV5IGhvbGQgdG8uCi0JICogICAgICAgICAgICA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpCi0JewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpCi0JewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KQotCXsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0JewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7IAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEwNDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIDxwPgotICogQSBzZWFyY2ggcGFydGljaXBhbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBleHRlbnNpb24gdG8gYSBnZW5lcmljIHNlYXJjaAotICogbWVjaGFuaXNtLCBwZXJtaXR0aW5nIGNvbWJpbmVkIHNlYXJjaCBhY3Rpb25zIHdoaWNoIHdpbGwgaW52b2x2ZSBhbGwgcmVxdWlyZWQKLSAqIHBhcnRpY2lwYW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gc2VhcmNoIGEgZG9jdW1lbnQgdGhhdCBoYXMgc29tZSBtaXhlZCBjb250ZW50LCB0aGVuCi0gKiB1c2luZyBhIG9uZSBwYXJ0aWNpcGFudCB3aWxsIG5vdCBiZSBlbm91Z2guIEUuZy4gZm9yIHRoZSBzZWFyY2hpbmcgb2YgdGhlIEpTUAotICogY29udGVudCwgYSBKU1AgcGFydGljaXBhbnQgbmVlZHMgdG8gY3JlYXRlIHtAbGluayBTZWFyY2hEb2N1bWVudH0gdGhhdAotICogY29udGFpbiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgZGVmYXVsdCBKYXZhIHNlYXJjaAotICogcGFydGljaXBhbnQgb2YgdGhlIEphdmEgU2VhcmNoIEVuZ2luZS4gVGhlIHNhbWUgd2l0aCBYTUw6IHdoZW4gdGhlcmUgaXMgYW4KLSAqIFhNTCBjb250ZW50IHRoYXQgZGVmYXVsdCBzZWFyY2ggcGFydGljaXBhbnQgY291bGQgbm90IHByb2Nlc3MsIGJ1dCBpdCBpcwotICogcmVxdWlyZWQgdG8gYmUgc2VhcmNoIG9uLCBhIG5ldyBzZWFyY2ggcGFydGljaXBhbnQgbmVlZHMgdG8gYmUgZGVmaW5lZC4gVGhhdAotICogc2VhcmNoIHBhcnRpY2lwYW50IHdvdWxkIGtub3cgaG93IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBhbmQKLSAqIHRoZW4gaXQgY2FuIGNhbGwgZGVmYXVsdCBYTUwgc2VhcmNoIHBhcnRpY2lwYW50LgotICogPC9wPgotICogPHA+Ci0gKiBQYXNzaW5nIGl0cyBvd24ge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlCi0gKiBtYXRjaCBwb3NpdGlvbnMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kCi0gKiByZXBvcnQgdGhlbSB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGFydGljaXBhbnQgaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucyAKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnQoKQotCXsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxiYWNrIG1ldGhvZCBhbGxvd2luZyBhIHNlYXJjaCBwYXJ0aWNpcGFudCB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IHN1cHBvcnRzCi0JICogdGhlIHNwZWNpZmllZCBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucy4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcGFydGljaXBhbnQgd2lsbCBwYXJ0aWNpcGF0ZSBpbgotCSAqIGZpbmRpbmcgbWF0Y2hlcyBmb3IgdGhlIHNlYXJjaCBkZWZpbmVkIGJ5IHRoZSBzZWFyY2ggcGF0dGVybi4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgdGhlCi0JICogc2VhcmNoIHBhcnRpY2lwYW50OgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNiZWdpblNlYXJjaGluZyhTZWFyY2hQYXR0ZXJuLCBNYXApfQotCSAqIDxsaT57QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBNYXAsIElQcm9ncmVzc01vbml0b3IpfQotCSAqIDxsaT57QGxpbmsgI2NyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIE1hcCwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogPGxpPntAbGluayAjbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIFNlYXJjaFJlcXVlc3RvciwgTWFwLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiA8bGk+e0BsaW5rICNkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4sIE1hcCl9Ci0JICogPC9vbD4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyB3aWxsIGJlCi0JICogY2FsbGVkLCBhbmQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCBjb250cmlidXRlcyBubyBtYXRjaGVzIGZvciB0aGUgc2VhcmNoCi0JICogcmVxdXJlc3QuCi0JICogPHA+Ci0JICogQSBzZWFyY2ggcGFydGljaXBhbnQgc2hvdWxkIG9ubHkgcGFydGljaXBhdGUgaW4gYSBzZWFyY2ggd2hlbiBpbiB1bmRlcnN0YW5kcwotCSAqIHRoZSBzZWFyY2ggcGF0dGVybi4gVW5yZWNvZ25pemVkIHNlYXJjaCBvcHRpb25zLCBob3dldmVyLCBjYW4gYmUgaWdub3JlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LiBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyBtdXN0Ci0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGFydGljaXBhdGUgaW4gYW55IHNlYXJjaGVzLgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB3aWxsIHBhcnRpY2lwYXRlIGluIHRoZQotCSAqICAgICAgICAgc2VhcmNoIHJlcXVlc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQkgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcHBsaWNhYmxlKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbmVlZGVkIGluIGEgc2VhcmNoLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbwotCSAqIHNvbWV0aGluZyB3aGVuIHRoZSBwYXJ0aWNpcGFudCBpcyBuZWVkZWQgaW4gYSBzZWFyY2guCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZG8KLQkgKiBzb21ldGhpbmcgd2hlbiB0aGUgcGFydGljaXBhbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiBhIHNlYXJjaC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgTWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9ucyBhcmUgc3BlY2lmaWVkOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkaXNwbGF5IGEKLQkgKiBtZWFuaW5nZnVsbCBuYW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gIlNlYXJjaCBwYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2VhcmNoIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIGdpdmVuIGRvY3VtZW50IHBhdGggaXMKLQkgKiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGRvY3VtZW50LiBNb3N0IG9mIHRoZSB0aW1lIGl0IGlzIGEKLQkgKiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCwgYnV0IGl0IGNhbiBhbHNvIGJlIGEgZmlsZSBzeXN0ZW0gcGF0aCwgb3IgYSBwYXRoCi0JICogaW5zaWRlIGEgemlwIGZpbGUuCi0JICogPHA+Ci0JICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZWlyIG93bgotCSAqIHN1YmNsYXNzIG9mIHtAbGluayBTZWFyY2hEb2N1bWVudH0gb3IgcmV0dXJuIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIHN1Y2gKLQkgKiBhIHN1YmNsYXNzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIHNlYXJjaCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKTsKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIG1hdGNoZXMgaW4gdGhlIGdpdmVuIGRvY3VtZW50cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZAotCSAqIGJ5IHRoZSBvdGhlciBzZWFyY2ggcGFydGljaXBhbnQgb3Igc2VhcmNoIGNsaWVudCBvbmNlIGl0IGhhcwotCSAqIHByZS1wcm9jZXNzZWQgZG9jdW1lbnRzIGFuZCBkZWxlZ2F0aW5nIHNlYXJjaCB0byB0aGlzIHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKiBAcGFyYW0gZG9jdW1lbnRTZXQKLQkgKiAgICAgICAgICAgIFRoZSBkb2N1bWVudHMgdG8gbG9jYXRlIG1hdGNoZXMgaW4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgU2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyB0byBiZQotCSAqICAgICAgICAgICAgc2VhcmNoZWQKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0b3IgaGFkIHByb2JsZW0gYWNjZXB0aW5nIG9uZSBvZiB0aGUgbWF0Y2hlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgZG9jdW1lbnQgbG9jYXRpb25zIHRvIGNvbnNpZGVyIHdoZW4gcGVyZm9ybWluZwotCSAqIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnkgaW4gdGhlIGdpdmVuIHNjb3BlLiBUaGUgc2VhcmNoIGVuZ2luZSBjYWxscyB0aGlzCi0JICogbWV0aG9kIGJlZm9yZSBsb2NhdGluZyBtYXRjaGVzLgotCSAqIDxwPgotCSAqIEFuIGRvY3VtZW50IGxvY2F0aW9uIHJlcHJlc2VudHMgYSBwYXRoIHdvcmtzcGFjZSB0byB0aGUgZmlsZSB3aXRoIHRoZQotCSAqIGNvbnRlbnQgdGhhdCBoYXMgcG90ZW50aWFsIG1hdGNoZXMKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNjb3BlCi0JICogICAgICAgICAgICBTZWFyY2ggc2NvcGUgdG8gbGltaXQgdGhlIHNvdXJjZSBvZiBzZWFyY2ggY2FuZGlkYXRlczsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIHRvIGJlCi0JICogICAgICAgICAgICBzZWFyY2hlZAotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50IHBhdGhzIHRvIGNvbnNpZGVyCi0JICovCi0JcHVibGljIFNlYXJjaFNjb3BlIHNlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCVNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsJCi0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VhcmNoIHNjb3BlOgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcpfQotCSAqIDxsaT57QGxpbmsgI3BvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQsIFNlYXJjaFBhdHRlcm4pfQotCSAqIDwvb2w+Ci0JICogQHBhcmFtIGRvY3VtZW50U2V0Ci0JICogICAgICAgICAgICBUaGUgZG9jdW1lbnRzIHRvIGxvY2F0ZSBtYXRjaGVzIGluCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIFNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHNlYXJjaGVkCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgd29yayBjb21wbGV0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBwcm9ncmVzcyBuZWVkcyB0byBiZSByZXBvcnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwKLQkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIlRoZSBTZWFyY2hQYXJ0aXBhbnRzIGlkIGhhcyBub3QgYmVlbiBpbml0YWxpemVkIik7Ci0JCUlGaWxlW10gZmlsZXMgPSBzY29wZS5lbmNsb3NpbmdGaWxlcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGxvY2F0aW9uID0gZmlsZXNbaV0uZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudFNldC5nZXRTZWFyY2hEb2N1bWVudChsb2NhdGlvbiwgaWQpOwotCQkJaWYoZG9jdW1lbnQgPT0gbnVsbCAmJiBpZCAhPSBudWxsKXsKLQkJCQlkb2N1bWVudFNldC5wdXRTZWFyY2hEb2N1bWVudChpZCwgZG9jdW1lbnQgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChsb2NhdGlvbikpOwotCQkJfQotCQkJcG9wdWxhdGVTZWFyY2hEb2N1bWVudChkb2N1bWVudCwgcGF0dGVybik7IAotCQkJCi0JCX0KLQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2E5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwuU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucwotewotCi0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5IHNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlYXJjaFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlYXJjaFBsdWdpbigpCi0JewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFBsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5IGdldFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKQotCXsKLQkJaWYgKHNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgPT0gbnVsbCkKLQkJewotCQkJc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSA9IG5ldyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCk7Ci0JCQluZXcgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcihzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KQotCQkJCQkucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnk7Ci0JfQotCi0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIGdldFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudChpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBzZWFyY2ggcGFydGljaXBhbnRzIHRoYXQgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHNlYXJjaAotCSAqIHBhdHRlcm4gYW5kIG9wdGlvbnMsIGxvYWRpbmcgYW5kIGNyZWF0aW5nIHRoZSBzZWFyY2ggcGFydGljaXBhbnRzIGlmIG5lY2Vzc2FyeS4KLQkgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiByZXByZXNlbnRpbmcgYSBzZWFyY2ggcmVxdWVzdAotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHJldHVybiBBcnJheSBvZiBzZWFyY2ggcGFydGljaXBhbnRzIHRoYXQgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHNlYXJjaCByZXF1ZXN0IAotCSAqLwotCVNlYXJjaFBhcnRpY2lwYW50W10gbG9hZFNlYXJjaFBhcnRpY2lwYW50cyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQkJcmV0dXJuIGdldFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKS5nZXRQYXJ0aWNpcGFudHMocGF0dGVybiwgc2VhcmNoT3B0aW9ucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MGI1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyBmcm9tIGEgc2VhcmNoIGVuZ2luZSBxdWVyeS4gQ2xpZW50cyBpbXBsZW1lbnQgYSBzdWJjbGFzcwotICogdG8gcGFzcyB0byA8Y29kZT5TZWFyY2hFbmdpbmUuc2VhcmNoPC9jb2RlPiBhbmQgaW1wbGVtZW50IHRoZQotICoge0BsaW5rICNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhlIHN1YmNsYXNzZXMgb2YgdGhlIFNlYXJjaFJlcXVlc3RvciBjb3VsZCBjb2xsZWN0ZWQgc2VhcmNoIG1hdGNoZXMsIGZpbHRlciwKLSAqIHNvcnQgYW5kIGdyb3VwIHRoZW0uIEl0J3MgdXAgdG8gdGhlIGNsaWVudCB0byBwYXNzIHRoZSByZXF1aXJlZCBleHRlbnNpb24gb2YKLSAqIHRoZSBTZWFyY2hSZXF1ZXN0b3IgdG8gdGhlIHNlYXJjaCBlbmdpbmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUmVxdWVzdG9yCi17Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiBzZWFyY2ggbWF0Y2guCi0JICogCi0JICogQHBhcmFtIG1hdGNoCi0JICogICAgICAgICAgICB0aGUgZm91bmQgbWF0Y2gKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudERlY2xhcmF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MzkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLSAgICBRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLSAgcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0TWV0YU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG1ldGFOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWV0YU5hbWUoUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSkKLSAgewotICAgIHRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudFJlZmVyZW5jZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzMmYyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZUVudHJ5IGV4dGVuZHMgRW50cnkKLXsKLQlRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QxMGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEVudHJ5Ci17Ci0gIFN0cmluZyBrZXk7Ci0gIFN0cmluZyBjYXRlZ29yeTsKLQotCXB1YmxpYyBFbnRyeSgpCi17Ci0Jc3VwZXIoKTsKLQkKLX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKQotCXsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpCi0JewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0JewotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OTUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRmlsZVJlZmVyZW5jZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVSZWZlcmVuY2VFbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JU3RyaW5nIHJlbGF0aXZlRmlsZVBhdGg7Ci0gICAgU3RyaW5nIHJlc29sdmVkVVJJOwotCVN0cmluZyBwdWJsaWNJZGVudGlmaWVyOwotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkZW50aWZpZXIoU3RyaW5nIHB1YmxpY0lkZW50aWZpZXIpCi0JewotCQl0aGlzLnB1YmxpY0lkZW50aWZpZXIgPSBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlUGF0aCgpCi0JewotCQlyZXR1cm4gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZUZpbGVQYXRoKFN0cmluZyByZWxhdGl2ZUZpbGVQYXRoKQotCXsKLQkJdGhpcy5yZWxhdGl2ZUZpbGVQYXRoID0gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvbHZlZFVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZFVSSShTdHJpbmcgcmVzb2x2ZWRVUkkpCi0gIHsKLSAgICB0aGlzLnJlc29sdmVkVVJJID0gcmVzb2x2ZWRVUkk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9TZWFyY2hEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmZjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi0vKioKLSAqIEEgc2VhcmNoIGRvY3VtZW50IGVuY2Fwc3VsYXRlcyBhIGNvbnRlbnQgdG8gYmUgc2VhcmNoZWQgaW4uIEEgc2VhcmNoCi0gKiBwYXJ0aWNpcGFudCBjcmVhdGVzIGEgc2VhcmNoIGRvY3VtZW50IGJhc2VkIG9uIHRoZSBmaWxlIGxvY2F0aW9ucyB0byBsb2NhdGUKLSAqIG1hdGNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogaXNzdWUgKGNzL2ViKSBkb2VzIGEgc2VhcmNoIHBhcnRpY2lwYW50IGFsd2F5cyBjcmVhdGUgYSBTZWFyY2hEb2N1bWVudD8KLSAqIAotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBvciBzZWFyY2ggY2xpZW50IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnRzIGZvciB0aGUgc2VhcmNoCi0gKiBwYXNzIHdoZXJlIHByZWNpc2UgbG9jYXRpb25zIG9mIHRoZSBtYXRjaGVzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbiNsb2NhdGVNYXRjaGVzfQotICogPC9wPgotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBrbm93cyBob3cgdG8gY3JlYXRlIHNlYXJjaCBkb2N1bWVudCB0aGF0IGl0IGNhbiBwcm9jZXNzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgaW50ZW50IG9mIHRoZSBzZXBhcmF0aW9uIG9mIHRoZSB7QGxpbmsgU2VhcmNoRG9jdW1lbnR9IGZyb20gdGhlCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnR9IGlzIHRvIGVuYWJsZSB0aGUgb3RoZXIgc2VhcmNoIHBhcnRpY2lwYW50cyB0bwotICogcHJvY2VzcyBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlLCBpZiBYTUwgZG9jdW1lbnQgaGFzIGEgZnJhZ21lbnQKLSAqIHRoYXQgaXQgY2FuIG5vdCBwcm9jZXNzLCBlLmcuIEphdmEsIHRoZW4gWE1MIHBhcnRpY2lwYW50IHdvdWxkIGNyZWF0ZQotICogU2VhcmNoRG9jdW1lbnQgZm9yIHRoYXQgZnJhZ21lbnQgd2hpY2ggY29udGFpbnMgSmF2YSBjb21waWxhdGlvbiB1bml0LCBhbmQKLSAqIHBhc3MgaXQgdG8gdGhlIEphdmEgc2VhcmNoIHBhcnRpY2lwYW50LiBQYXNzaW5nIGl0cyBvd24KLSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlIG1hdGNoIHBvc2l0aW9ucwotICogYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kIHJlcG9ydCB0aGVtIHRvIHRoZQotICogb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTZWFyY2hQYXJ0aWNpcGFudAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoRG9jdW1lbnQKLXsKLQotCXByaXZhdGUgU3RyaW5nIGRvY3VtZW50UGF0aDsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50OyAKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGRvY3VtZW50LiBUaGUgZ2l2ZW4gZG9jdW1lbnQgcGF0aCBpcyBhIHN0cmluZyB0aGF0Ci0JICogdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnQuIE1vc3Qgb2YgdGhlIHRpbWUgaXQgaXMgYQotCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLCBidXQgaXQgY2FuIGFsc28gYmUgYSBmaWxlIHN5c3RlbSBwYXRoLCBvciBhIHBhdGgKLQkgKiBpbnNpZGUgYSB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpCi0JewotCQl0aGlzLmRvY3VtZW50UGF0aCA9IGRvY3VtZW50UGF0aDsKLQkJdGhpcy5wYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBFbnRyeVtdIGdldEVudHJpZXMoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcga2V5LCBpbnQgbWF0Y2hSdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIG9mIHRoaXMgZG9jdW1lbnQuIE1vZGVsIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBhY3R1YWwKLQkgKiByZXNvdXJjZSBhdCBjb3JyZXNwb25kaW5nIGRvY3VtZW50IHBhdGggZHVlIHRvIHByZXByb2Nlc3NpbmcuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCBvZiB0aGlzIGRvY3VtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRNb2RlbCgpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudDsKLQl9Ci0JCi0JCi0vLwkgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbgotLy8JIHRoYXQgaGFzIGJlZW4gcHJvZHVjZWQgYnkgYSBzZWFyY2ggcGFydGljaXBhbnQKLS8vCSB0eXBpY2FsbHkgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZAotLy8JIGFuIEVudHJ5IGlzIHR5cGljYWxseSBjb3Vyc2UgZ3JhaW5lZCBpbmZvIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSBTZWFyY2hQYXJ0aWNpcGFudHMKLS8vCSBmaXJzdCBzdGVwIC4uLiBhbmQgaXMgdXNlZCB0byBjb21wdXRlIG1vcmUgYWNjdXJhdGUgU2VhcmNoTWF0Y2hlcyBkdXJpbmcgYSBTZWFyY2hQYXJ0aWNpcGFudHMgMm5kIHN0ZXAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50UGF0aDsKLQl9IAotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEVudHJ5KEVudHJ5IGVudHJ5KTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7ICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50U2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmYjM0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi0vKioKLSAqIFRoZSBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSBhIHNldCBvZiBzZWFyY2ggZG9jdW1lbnRzCi0gKiB0aGF0IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBieSB2YXJpb3VzIHBhcnRpY2lwYW50cwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaERvY3VtZW50U2V0Ci17Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgcmVzb3VyY2VQYXRoLCBTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBfdGVtcEdldFNlYXJjaERvY3VtZXRuKFN0cmluZyByZXNvdXJjZVBhdGgpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxZTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vLyBpc3N1ZSAoY3MpIGlzIHRoaXMgYSBVSSBpc3N1ZT8gIHdoZXJlIGRvZXMgdGhlIGZyYW1ld29yayBuZWVkIHRvIGV4cG9zZSBzdGluZ3M/Ci1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfc2VhcmNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5naW5lX3NlYXJjaGluZ19sb2NhdGluZ0RvY3VtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZ2luZV9zZWFyY2hpbmdfbWF0Y2hpbmc7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXN0YXRpYwotCXsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmNmMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoRG9jdW1lbnRTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50U2V0OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoRG9jdW1lbnRTZXRJbXBsIGV4dGVuZHMgU2VhcmNoRG9jdW1lbnRTZXQKLXsKLSAgICBwdWJsaWMgTWFwIGRvY3VtZW50UGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vcGF0aCAtLT4gZG9jdW1ldG4KLQlNYXAgZG9jdW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOyAgLy8gcGFydGljaXBhbnRJZCAtID4gbGlzdCAoZG9jdW1lbnQpCi0JCi0JcHVibGljIFNlYXJjaERvY3VtZW50U2V0SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgX3RlbXBHZXRTZWFyY2hEb2N1bWV0bihTdHJpbmcgcmVzb3VyY2VQYXRoKQotICAgIHsgICAgICAKLSAgICAgICByZXR1cm4gKFNlYXJjaERvY3VtZW50KWRvY3VtZW50UGF0aE1hcC5nZXQocmVzb3VyY2VQYXRoKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyByZXNvdXJjZVBhdGgsIFN0cmluZyBwYXJ0aWNpcGFudElkKQotCXsKLQkJaWYocmVzb3VyY2VQYXRoID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU2VhcmNoRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBnZXRTZWFyY2hEb2N1bWVudHMocGFydGljaXBhbnRJZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1tpXTsKLQkJCWlmKHJlc291cmNlUGF0aC5lcXVhbHMoZG9jdW1lbnQuZ2V0UGF0aCgpKSl7Ci0JCQkJcmV0dXJuIGRvY3VtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCkKLQl7Ci0JCQotCQlPYmplY3Qgb2JqZWN0ID0gZG9jdW1lbnRNYXAuZ2V0KHBhcnRpY2lwYW50SWQpOwotCQlMaXN0IGRvY3VtZW50TGlzdCA9IG51bGw7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpewotCQkJZG9jdW1lbnRMaXN0ID0gKExpc3Qpb2JqZWN0OwotCQl9Ci0JCWVsc2V7Ci0JCQlkb2N1bWVudE1hcC5wdXQocGFydGljaXBhbnRJZCwgZG9jdW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCQlyZXR1cm4gKFNlYXJjaERvY3VtZW50W10pIGRvY3VtZW50TGlzdC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtkb2N1bWVudExpc3Quc2l6ZSgpXSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCkKLQl7Ci0JCU9iamVjdCBvYmplY3QgPSBkb2N1bWVudE1hcC5nZXQocGFydGljaXBhbnRJZCk7Ci0JCUxpc3QgZG9jdW1lbnRMaXN0ID0gbnVsbDsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQlkb2N1bWVudExpc3QgPSAoTGlzdClvYmplY3Q7Ci0JCX0KLQkJZWxzZXsKLQkJCWRvY3VtZW50TWFwLnB1dChwYXJ0aWNpcGFudElkLCBkb2N1bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCkpOwotCQl9Ci0JCWRvY3VtZW50TGlzdC5hZGQoZG9jdW1lbnQpOwotICAgICAgICBkb2N1bWVudFBhdGhNYXAucHV0KGRvY3VtZW50LmdldFBhdGgoKSwgZG9jdW1lbnQpOwotCX0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZG9jdW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICB7ICAKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSAoKExpc3QpbykuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbzIgPSBqLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvMiBpbnN0YW5jZW9mIFNlYXJjaERvY3VtZW50KQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICBTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCA9IChTZWFyY2hEb2N1bWVudClvMjsKLSAgICAgICAgICAgICAgIHNlYXJjaERvY3VtZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgIAotICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM5ZTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uVGFnTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsgCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yCi17Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudDsKLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQ7Ci0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JCWlmIChwYXJ0aWNpcGFudCA9PSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlwYXJ0aWNpcGFudCA9IChTZWFyY2hQYXJ0aWNpcGFudCkgZkVsZW1lbnQKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJ0aWNpcGFudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBmRWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQXNzZXJ0LmlzVHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMSk7Ci0JCUV4cHJlc3Npb24gZXhwID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbGVtZW50c1swXSk7Ci0JCXJldHVybiBjb252ZXJ0KGV4cC5ldmFsdWF0ZShjb250ZXh0KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnQoRXZhbHVhdGlvblJlc3VsdCBldmFsKQotCXsKLQkJaWYgKGV2YWwgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gcmVwbGFjZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCkKLQl7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkU3VwcG9ydGVkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkKLQl7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKCl7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2OWU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkKLXsKLQotCXByb3RlY3RlZCBNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBtYXBzIHNlYXJjaFBhcnRpY2lwYW50IGlkIHRvIGEKLQkJCQkJCQkJCQkJLy8gc2VhcmNoUGFydGljaXBhbnQgZGVzY3JpcHRvcgotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRTZWFyY2hQYXJ0aWNpcGFudChTdHJpbmcgaWQsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3Igc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKQotCXsKLQkJaWRNYXAucHV0KGlkLCBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZWFyY2hQYXJ0aWNpcGFudElkcygpCi0JewotCQlTZXQgaWRzID0gaWRNYXAua2V5U2V0KCk7Ci0JCXJldHVybiAoU3RyaW5nW10pIGlkcy50b0FycmF5KG5ldyBTdHJpbmdbaWRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlYXJjaFBhcnRpY2lwYW50cygpCi0JewotCQlyZXR1cm4gaWRNYXAudmFsdWVzKCk7Ci0JfQotCi0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoU3RyaW5nIGlkKQotCXsKLQkJU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yIHNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChpZCAhPSBudWxsKQotCQl7Ci0JCQlzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgPSAoU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKSBpZE1hcAotCQkJCQkuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yICE9IG51bGwgPyBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IKLQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKQotCQkJCTogbnVsbDsKLQotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFtdIGdldFBhcnRpY2lwYW50cyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQotCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IGNyZWF0ZUV2YWx1YXRpb25Db250ZXh0KHBhdHRlcm4pOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VhcmNoUGFydGljaXBhbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChkZXNjcmlwdG9yLm1hdGNoZXMoZXZhbENvbnRleHQpKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZGVzY3JpcHRvcgotCQkJCQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKTsKLQkJCQkJCWlmICghU2VhcmNoUGFydGljaXBhbnQuY2xhc3MuaXNJbnN0YW5jZShwYXJ0aWNpcGFudCkpCi0JCQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwotCQkJCQkJaWYgKHBhcnRpY2lwYW50LmlzQXBwbGljYWJsZShwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXN1bHQuYWRkKHBhcnRpY2lwYW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gKFNlYXJjaFBhcnRpY2lwYW50W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBTZWFyY2hQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZhbHVhdGlvbkNvbnRleHQgY3JlYXRlRXZhbHVhdGlvbkNvbnRleHQoCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlFdmFsdWF0aW9uQ29udGV4dCByZXN1bHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcGF0dGVybik7Ci0JCXJlc3VsdC5hZGRWYXJpYWJsZSgicGF0dGVybiIsIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1N2NlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJzZWFyY2hQYXJ0aWNpcGFudHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJzZWFyY2hQYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSByZWdpc3RyeTsKLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLQl7Ci0JCVN0cmluZyBidW5kbGVpZCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKQotCQl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQlTdHJpbmcgY29udHJpYnV0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9yQ2xhc3MgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCVNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcigKLQkJCQkJCQllbGVtZW50KTsKLQkJCQkJcmVnaXN0cnkucHV0U2VhcmNoUGFydGljaXBhbnQoaWQsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTAxYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgU2VhcmNoIG1lc3NhZ2VzLgotCi1lbmdpbmVfc2VhcmNoaW5nID0gU2VhcmNoaW5nLi4uCi1lbmdpbmVfc2VhcmNoaW5nX2xvY2F0aW5nRG9jdW1lbnRzID0gezB9OiBsb2NhdGUgc2VhcmNoIGRvY3VtZW50cy4uLgotZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZyA9IHswfTogbG9jYXRlIG1hdGNoZXMuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjNmZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBuYW1lLAotCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXN1cGVyKG51bGwsIG5hbWUsIG1ldGFOYW1lLCBtYXRjaFJ1bGUpOwotCi0JfQotCi0JcHVibGljIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIG5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotCXsKLQkJc3VwZXIobnVsbCwgbmFtZSwgbWV0YU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFlMTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MWExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGdlbmVyaWMgY29tcG9uZW50IHBhdHRlcm4uIFVzdWFsbHkgdGhlcmUgYXJlIHR3byB0eXBlcyBvZgotICogY29tcG9uZW50IHNlYXJjaCBwYXR0ZXJuczogcGF0dGVybiBmb3IgY29tcG9uZW50IGRlY2xhcmF0aW9uIGFuZCBmb3IKLSAqIGNvbXBvbmVudCBkZWZpbml0aW9uLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4KLXsKLQotCVF1YWxpZmllZE5hbWUgbmFtZTsKLQotCVF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0KLQlJRmlsZSBmaWxlOyAvLyAob3B0aW9uYWwpIGxvY2F0aW9uIHdoZXJlIGNvbXBvbmVudCBpcyBkZWZpbmVkCi0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJbmFtZSA9IGVsZW1lbnRRTmFtZTsKLQkJbWV0YU5hbWUgPSB0eXBlUU5hbWU7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKQotCXsKLQotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQluYW1lID0gZWxlbWVudFFOYW1lOwotCQltZXRhTmFtZSA9IHR5cGVRTmFtZTsKLQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLQl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE1ldGFOYW1lKCkKLQl7Ci0JCXJldHVybiBtZXRhTmFtZTsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0ZpbGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzExNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuCi17Ci0KLQlJRmlsZSBmaWxlOwotCi0JcHVibGljIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBGaWxlUmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3YWIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9RdWFsaWZpZWROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotLyoqCi0gKiBUaGlzIGRhdGEgY2xhc3MgcmVwcmVzZW50cyBhIHF1YWxpZmllZCBuYW1lLCBjb25zaXN0aW5nIG9mIGEgbG9jYWwgbmFtZSBhbmQgYQotICogcXVhbGlmaWVyCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLS8vIGlzc3VlIChjcykgc2hvdWxkIHRoaXMgZ28gaW4gdGhlICdtYXRjaGluZycgcGFja2FnZSAoQlRXLi4uIHJlbmFtZQotLy8gbWF0Y2hpbmctPnBhdHRlcm4pCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZQotewotCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19ERUxJTV8xID0gInsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfREVMSU1fMiA9ICJ9IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgQ3JlYXRlcyBhIHF1YWxpZmllZCBuYW1lIGZyb20gYSBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZQotCSAqIEBwYXJhbSBsb2NhbE5hbWUKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMucXVhbGlmaWVyID0gbmFtZXNwYWNlOwotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXRoaXMucXVhbGlmaWVyID0gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5xdWFsaWZpZXIgIT0gbnVsbCAmJiB0aGlzLnF1YWxpZmllci5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQl0aGlzLnF1YWxpZmllciA9IG51bGw7Ci0JCX0KLQotCQl0aGlzLm5hbWUgPSBsb2NhbE5hbWU7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdGhpcy5uYW1lID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZXNwYWNlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQl7Ci0JCXJldHVybiB0aGlzLnF1YWxpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBuYW1lIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbG9jYWwgbmFtZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpCi0JewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLQl7Ci0JCWJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotCQlpZiAodGhpcyA9PSBvYmopCi0JCXsKLQkJICBpc0VxdWFsID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsJCi0JCSAgaWYgKG9iaiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0JCSAgewotCQkJUXVhbGlmaWVkTmFtZSB0aGF0ID0gKFF1YWxpZmllZE5hbWUpIG9iajsKLQkJICAgIGlzRXF1YWwgPSBpc01hdGNoKHRoaXMuZ2V0TmFtZXNwYWNlKCksIHRoYXQuZ2V0TmFtZXNwYWNlKCkpICYmCi0JCSAgICAgICAgICAgICAgaXNNYXRjaCh0aGlzLmdldExvY2FsTmFtZSgpLCB0aGF0LmdldExvY2FsTmFtZSgpKTsJCi0JCSAgfSAgCi0JCX0KLQkJcmV0dXJuIGlzRXF1YWw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2goU3RyaW5nIGEsIFN0cmluZyBiKQotCXsKLQkgIHJldHVybiBhICE9IG51bGwgPyBhLmVxdWFscyhiKSA6IGEgPT0gYjsKLQl9CQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKLQl7Ci0JCWludCBoYXNoID0gMDsKLQkJaWYgKHRoaXMucXVhbGlmaWVyICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5xdWFsaWZpZXIuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5uYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVhbGlmaWVkIG5hbWUsIG9mIHRoZSBmb3JtOgotCSAqIHtuYW1lc3BhY2V9bG9jYWxuYW1lLiBJZiBubyBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCB0aGUgc3RyaW5nIGhhcyB0aGUKLQkgKiBmb3JtOiB7fWxvY2FsbmFtZS4gTm90ZSB0aGF0IHRoZSBzdHJpbmcgZm9ybWF0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0KLQkJcmV0dXJuIGFwcGVuZFN0cmluZ3MobmV3IFN0cmluZ1tdCi0JCXsgTlNfREVMSU1fMSwgLy8gewotCQkJCXRoaXMucXVhbGlmaWVyLCBOU19ERUxJTV8yLCAvLyB9Ci0JCQkJdGhpcy5uYW1lIH0pOwotCi0JfQotCi0JLyoqCi0JICogRmFjdG9yeS1saWtlIG1ldGhvZCB0byBjcmVhdGUgYSBRTmFtZSBvYmplY3QgZnJvbSB0aGUgc3RyaW5nIGZvcm0gb2YgYQotCSAqIFFOYW1lLiBUaGUgc3RyaW5nIG11c3QgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKLQkgKiBRTmFtZS50b1N0cmluZygpLgotCSAqIAotCSAqIEBwYXJhbSBxbmFtZVN0cmluZyAtCi0JICogICAgICAgICAgICBTdHJpbmcgZm9ybSBvZiBhIFFOYW1lCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBRTmFtZSBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIE1pc3NpbmcgbmFtZXNwYWNlIGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFF1YWxpZmllZE5hbWUgdmFsdWVPZihTdHJpbmcgcW5hbWVTdHJpbmcpCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JewotCi0JCVN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKLQkJaWYgKHFuYW1lU3RyaW5nID09IG51bGwgfHwgcW5hbWVTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJLy8gQm90aCBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUgYXJlIG51bGwuCi0JCX0gZWxzZSBpZiAocW5hbWVTdHJpbmcuc3RhcnRzV2l0aChOU19ERUxJTV8xKSkKLQkJewotCQkJLy8gVGhlIFFOYW1lIGhhcyB0aGUgbm90YXRpb24gc3BlY2lmeWluZyBhIG5hbWVzcGFjZS4KLQkJCWludCBpbmRleCA9IHFuYW1lU3RyaW5nLmluZGV4T2YoTlNfREVMSU1fMik7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gVGhlIGVuZCBkZWxpbWl0ZXIgZm9yIHRoZSBuYW1lc3BhY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIFFOYW1lCi0JCQkJLy8gc3RyaW5nCi0JCQkJLy8gaXMgbWFsZm9ybWVkLgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkicW5hbWVTdHJpbmcgPSAiICsgcW5hbWVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lc3BhY2UgPSBxbmFtZVN0cmluZy5zdWJzdHJpbmcoMSwgaW5kZXgpOwotCQkJbG9jYWxOYW1lID0gcW5hbWVTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0gZWxzZQotCQl7Ci0JCQkvLyBBc3N1bWUgbm8gbmFtZXNwYWNlIGlzIHNwZWNpZmllZCBhbmQgdGhlIHN0cmluZyBpcyBhIGxvY2FsIG5hbWUuCi0JCQlsb2NhbE5hbWUgPSBxbmFtZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBzdHJpbmcgYnkgYXBwZW5kaW5nIHRvZ2V0aGVyIGFuIGFycmF5IG9mIHN0cmluZ3MsCi0JICogc2tpcHBpbmcgbnVsbCBzdHJpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdzIC0KLQkgKiAgICAgICAgICAgIFN0cmluZ3MgdG8gYmUgYXBwZW5kZWQgdG9nZXRoZXIKLQkgKiBAcmV0dXJuIFJlc3VsdGluZyBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTdHJpbmdzKFN0cmluZ1tdIHN0cmluZ3MpCi0JewotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5ncyAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmdCdWZmZXIgdG9rZW5CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgbWF4Q291bnQgPSBzdHJpbmdzLmxlbmd0aDsKLQkJCVN0cmluZyBzdHJpbmc7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENvdW50OyBpKyspCi0JCQl7Ci0JCQkJc3RyaW5nID0gc3RyaW5nc1tpXTsKLQkJCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQkJCX0vLyBpZgotCQkJfS8vIGZvcgotCQkJcmVzdWx0ID0gdG9rZW5CdWZmZXIudG9TdHJpbmcoKTsKLQkJfS8vIGlmCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ly8gYXBwZW5kU3RyaW5ncygpCi0KLX0vLyBjbGFzcyBRTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhYWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1NlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQSBzZWFyY2ggZGVmaW5lcyBob3cgc2VhcmNoIHJlc3VsdHMgYXJlIGZvdW5kLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaFBhdHRlcm4gaW1wbGVtZW50cyBJQWRhcHRhYmxlCi17Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5IGlmIGNhc2VzCi0JICogYXJlIHRoZSBzYW1lLiBDYW4gYmUgY29tYmluZWQgdG8gcHJldmlvdXMgcnVsZXMsIGUuZy4KLQkgKiB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfQ0FTRV9TRU5TSVRJVkUgPSA4OwotCi0JLy8gUnVsZXMgZm9yIHBhdHRlcm4gbWF0Y2hpbmc6IChleGFjdCwgcHJlZml4LCBwYXR0ZXJuKSBbIHwgY2FzZSBzZW5zaXRpdmVdCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgc2VhcmNoIHJlc3VsdCwgdGhhdAotCSAqIGlzLCB0aGUgc291cmNlIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGVxdWFscyB0aGUgc2VhcmNoIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9FWEFDVF9NQVRDSCA9IDA7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonKQotCSAqIHdoZXJlIGEgd2lsZC1jYXJkIGNhbiByZXBsYWNlIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUEFUVEVSTl9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gaXMgYSBwcmVmaXggb2YgdGhlIHNlYXJjaCByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9QUkVGSVhfTUFUQ0ggPSAxOwotCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUkVHRVhQX01BVENIID0gNDsKLQotCXByaXZhdGUgaW50IG1hdGNoUnVsZTsKLQotCXB1YmxpYyBTZWFyY2hQYXR0ZXJuKCkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gUl9FWEFDVF9NQVRDSCB8IFJfQ0FTRV9TRU5TSVRJVkU7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhdHRlcm4oaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gbWF0Y2hSdWxlOwotCi0JfQotCi0JcHVibGljIGZpbmFsIGludCBnZXRNYXRjaFJ1bGUoKQotCXsKLQkJcmV0dXJuIHRoaXMubWF0Y2hSdWxlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotCXsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvQ29udGVudFR5cGVTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdhZjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIFNjb3BlIHRoYXQgaGFzIGZpbHRlcmVycyBmaWxlcyBiYXNlZCBvbiBjb250ZW50IHR5cGVzLiBJdCBjYW4gbGltaXQgb3RoZXIKLSAqIHNjb3BlcyB3aXRoIHRoZSBnaXZlbiBmaWxlIGNvbnRlbnQgdHlwZXMuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcml2YXRlIExpc3QgdmFsaWRDb250ZW50SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoU2VhcmNoU2NvcGUgc2NvcGUsIFN0cmluZ1tdIHZhbGlkQ29udGVudFR5cGVzKQotCXsKLQkJaWYgKHZhbGlkQ29udGVudFR5cGVzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJdGhpcy52YWxpZENvbnRlbnRJZHMuYWRkKHZhbGlkQ29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoc2NvcGUuZW5jbG9zaW5nRmlsZXMoKSAhPSBudWxsKQotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCkubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgc2NvcGUuZW5jbG9zaW5nRmlsZXMoKVtpXTsKLQkJCQlhY2NlcHRGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGaWxlKElGaWxlIGZpbGUpCi0JewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCXsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCS8vIFRPRE8gdXNlIElDb250ZW50VHlwZS5pc0tpbmRPZgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsaWRDb250ZW50SWRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnRJZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCQkJSUNvbnRlbnRUeXBlIHN1cHBvcnRlZENvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRJZCk7Ci0JCQkJCQkJaWYgKHN1cHBvcnRlZENvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2Yoc3VwcG9ydGVkQ29udGVudFR5cGUpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkJCQlwcm9qZWN0cy5hZGQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIGlnbm9yZSB0aGUgZmlsZQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhY2U3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvUHJvamVjdFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2NvcGUgdGhhdCBlY2xvc2VzIHdvcmtzcGFjZSBwYXRoIGFuZCBlY2xvc2luZyBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggLQotCSAqICAgICAgICAgICAgcGF0aCB0byB0aGUgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZSwgZS5nLgotCSAqICAgICAgICAgICAgL015UHJvamVjdC9NeUZpbGUueG1sCi0JICovCi0JcHVibGljIFByb2plY3RTZWFyY2hTY29wZShJUGF0aCB3b3Jrc3BhY2VQYXRoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSh3b3Jrc3BhY2VQYXRoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSVBhdGggd29ya3NwYWNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcih3b3Jrc3BhY2VQYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQl0cmF2ZXJzZUNvbnRhaW5lcihwcm9qZWN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2VmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQSA8Y29kZT5TZWFyY2hTY29wZTwvY29kZT4gZGVmaW5lcyB3aGVyZSBzZWFyY2ggcmVzdWx0IHNob3VsZCBiZSBmb3VuZCBieSBhCi0gKiA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IChlLmcuIHByb2plY3QsIHdvcmtzcGFjZSkuCi0gKiAKLSAqIENsaWVudHMgbXVzdCBwYXNzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gdGhlIDxjb2RlPnNlYXJjaCguLi4pPC9jb2RlPgotICogbWV0aG9kcy4gU3VjaCBhbiBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZhY3RvcnkgbWV0aG9kcwotICogb24gPGNvZGU+U2VhcmNoU2NvcGU8L2NvZGU+OiA8Y29kZT5uZXdTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L2NvZGU+LAotICogPGNvZGU+bmV3V29ya3NwYWNlU2NvcGUoKTwvY29kZT4KLSAqIAotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgc2VhcmNoIHNjb3BlIGhhcyBubyBmaWx0ZXIsIGFuZCBhdCBjcmVhdGlvbgotICogZG9lcyBub3QgY29udGFpbiBhbnkgZmlsZXMsIEl0IGNvdWxkIGFjY2VwdCBhbnkgd29ya3NwYWNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hTY29wZQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCk7Ci0KLQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNGM2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTY29wZUltcGwgZXh0ZW5kcyBTZWFyY2hTY29wZQotewotCi0JcHJvdGVjdGVkIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgU2VhcmNoU2NvcGVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGJlbG9uZ3MgdG8gdGhpcyBzY29wZS4KLQkgKiBSZXNvdXJjZSBwYXRoIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzY29wZSwgaWYgc2NvcGUgY29uZGl0aW9ucyBhcmUgbWV0LgotCSAqIGlmIHtAbGluayBJU2VhcmNoU2NvcGUuZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCl9IHJldHVybnMgZmFsc2UgYW5kCi0JICogdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYW5kIHJldHVybnMgdHJ1ZSwgbmV4dCBjYWxsIHRvCi0JICoge0BsaW5rIElTZWFyY2hTY29wZS5lY2xpcHNlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKX0gc2hvdWxkIHJldHVybiB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSBmaWxlCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmlsZShJRmlsZSBmaWxlKQotCXsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbGVzLmFkZChmaWxlKTsKLQkJcHJvamVjdHMuYWRkKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaXMgZW5jbG9zZWQgYnkgdGhpcyBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcihyZXNvdXJjZVBhdGgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChmaWxlcy5jb250YWlucyhyZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCkKLQl7Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzIGZvciB0aGlzIHNlYXJjaCBzY29wZS4gKHNlZQotCSAqIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLCAvTXlQcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzLgotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdFtdIGVuY2xvc2luZ1Byb2plY3RzKCkKLQl7Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZUNvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcikKLQl7Ci0KLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpCi0JCQl7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJYWNjZXB0RmlsZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJdHJ5Ci0JCXsKLQkJCWNvbnRhaW5lci5hY2NlcHQodmlzaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gaWdub3JlIHJlc291cmNlCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWxlY3Rpb25TZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmNkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25TZWFyY2hTY29wZSBleHRlbmRzIFNlYXJjaFNjb3BlSW1wbAotewotCi0JcHJvdGVjdGVkIElSZXNvdXJjZVtdIHJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uU2VhcmNoU2NvcGUoSVJlc291cmNlW10gcmVzb3VyY2VzKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCWluaXRpYWxpemUoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotCXsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVzb3VyY2VzLmxlbmd0aDsgaW5kZXgrKykKLQkJewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2luZGV4XTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQl7Ci0JCQkJCXRyYXZlcnNlQ29udGFpbmVyKChJRm9sZGVyKSByZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJewotCQkJCQlhY2NlcHRGaWxlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMWExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvV29ya2luZ1NldFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gd3JhcCB0aGUgY29udGVudCBvZiBhbiBJV29ya2luZ1NldC4KLSAqIFdlIGNhbid0IHVzZSBJV29ya2luZ1NldCBkaXJlY3RseSBiZWNhdXNlIGl0J3MgcGFydCBvZiBhbiBlY2xpcHNlLnVpCi0gKiBjb21wb25lbnQuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QgYXMgYSBzdXJyb2dhdGUuCi0gKiA8YnI+Ci0gKiBVc2FnZTogV2UgZ2V0IHRoZSBhcnJheSBJQWRhcHRhYmxlW10gb2YgdGhlIElXb3JraW5nU2V0IG9iamVjdCBhbmQgdXNlIHRoaXMKLSAqIGFycmF5IGFzIGFyZ3VtZW50IGZvciBhbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluY2x1ZGluZyB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nU2V0U2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGx7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBzY29wZSB3aGVuIG5vIHJlc291cmNlcyBpcyBnaXZlbi4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKCl7Ci0JCXN1cGVyKCk7Ci0JfQotICAKLQkvKioKLQkgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggYW4gSVdvcmtpbmdTZXQKLQkgKiA8YnI+Ci0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBJV29ya2luZ1NldCBvbmVXb3JraW5nU2V0OwotCSAqIC4uLgotCSAqIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IG9uZVdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLQkgKiBXb3JraW5nU2V0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya2luZ1NldFNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cykKLQl7Ci0JCXN1cGVyKCk7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogSW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIGFuIElXb3JraW5nU2V0Ci0JICogPGJyPgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+Ci0JICogV29ya2luZ1NldFNlYXJjaFNjb3BlIHNjb3BlID0gLi47IAotCSAqIC4uLgotCSAqIElXb3JraW5nU2V0IGFub3RoZXJXb3JraW5nU2V0OyAKLQkgKiBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSBhbm90aGVyV29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotCSAqIHNjb3BlLmFkZEFXb3JraW5nU2V0VG9TY29wZShlbGVtZW50cyk7Ci0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQVdvcmtpbmdTZXRUb1Njb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJQ29udGFpbmVyLmNsYXNzKTsKLQkJCWlmICggY29udGFpbmVyICE9IG51bGwgKXsKLQkJCQl0cmF2ZXJzZUNvbnRhaW5lcihjb250YWluZXIpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQkJaWYgKCBhRmlsZSAhPSBudWxsKQotCQkJCQlhY2NlcHRGaWxlKGFGaWxlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3Jrc3BhY2VTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWMyMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlU2VhcmNoU2NvcGUoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpCi0JewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJdHJhdmVyc2VDb250YWluZXIocm9vdCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyN2Y5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvdXRpbC9Db2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQ29sbGVjdHMgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgYSA8Y29kZT5JU2VhcmNoRW5naW5lPC9jb2RlPi4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotLy8gaXNzdWUgc2hvdWxkIHlvdSBtb3ZlIHRoaXMgdG8gYSB1dGlsIHBhY2thZ2U/IHdoYXQgZG9lcyBqZHQgZG8/Ci1wdWJsaWMgY2xhc3MgQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvcgotewotCXByaXZhdGUgQXJyYXlMaXN0IGZGb3VuZDsKLQotCXB1YmxpYyBDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yKCkKLQl7Ci0JCWZGb3VuZCA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiB7QGxpbmsgU2VhcmNoTWF0Y2h9ZXMgKG5vdCBzb3J0ZWQpCi0JICovCi0JcHVibGljIExpc3QvKiA8U2VhcmNoTWF0Y2g+ICovZ2V0UmVzdWx0cygpCi0JewotCQlyZXR1cm4gZkZvdW5kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoTWF0Y2gpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmRm91bmQuYWRkKG1hdGNoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMDJkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBlbWYvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ1OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZl8xLjAuMC56aXAKLXNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVmMGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc0MThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6MDY6MDIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ODg3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM3Y2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHd0cGVtZi8sXAotICAgICAgICAgICB3b3JrYmVuY2gvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBkMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzgzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYWNrYWdlVVJJTWFwPVBhY2thZ2VVUklNYXAKLXBsdWdpbk5hbWU9RU1GIFV0aWxpdGllcwotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTZhZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icGFja2FnZVVSSU1hcCIgbmFtZT0iJVBhY2thZ2VVUklNYXAiIHNjaGVtYT0ic2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZCIvPgotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBuYW1lPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QiLz4KLQotPCEtLSBOZWVkIHRvIHJlZ2lzdGVyIHRoZSBFY29yZSBzcGVjaWZpYyBwYWNrYWdlIG1hcHBpbmdzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLnBhY2thZ2VVUklNYXAiPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgICAgICAgICAgcHJlZml4PSJlY29yZSI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJtYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotPCEtLSBUcmljayB0byBnZXQgTWFwcGluZy54bWkgZm9yIE1PRjUgc2VyaWFsaXphdGlvbiAtLT4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJNYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAga2V5PSJyZW5kZXJlckZhY3RvcnkiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlckZhY3RvcnkiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA3NjA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5lbWYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS93dHBlbWYiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS93dHBlbWYiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS9wYWNrYWdlVVJJTWFwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS9wYWNrYWdlVVJJTWFwLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWQ5NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgaWQ9InBhY2thZ2VVUklNYXAiIG5hbWU9IiVQYWNrYWdlVVJJTWFwIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgcGFja2FnZSBtYXBwaW5ncy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE5NjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGlkPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBuYW1lPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBjb250cmlidXRlIGNoaWxkIHRyYW5zbGF0b3JzIHRvIHRoZSBkZWZhdWx0IHRyYW5zbGF0b3JzIGluIEVNRjJET01BZGFwdGVySW1wbC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idHJhbnNsYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0cmFuc2xhdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGNoaWxkIHRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM0YzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7Ci0KLQotCi0vKioKLSAqIFRoZSBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgbG9hZGluZwotICogb2YgRU1GIHJlc291cmNlcy4gVGhpcyBpcyB0aGUgRWNsaXBzZSB2ZXJzaW9uIG9mIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciwKLSAqIGFuZCB1c2VzIHRoZSBFY2xpcHNlIElMb2NrIHRlY2hub2xvZ3kgdG8gYWNxdWlyZSBhIHNlbWFwaG9yZSB1bnRpbCB0aGUKLSAqIFJlc291cmNlIGlzIGxvYWRlZC4gdGhlIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIG1ldGhvZCB3aWxsIHBhdXNlIHVudGlsCi0gKiBlaXRoZXIgKGEpIHRoZSBSZXNvdXJjZSBoYXMgbG9hZGVkLCB0aGUgQWRhcHRlciBpcyBub3RpZmllZCwgYW5kIHRoZQotICogc2VtYXBob3JlIGlzIHJlbGVhc2VkIG9yIChiKSB0aGUgREVMQVkgdGltZW91dCBpcyBleGNlZWRlZCwgd2hpY2ggcHJldmVudHMKLSAqIGZ1bGwgZGVhZGxvY2suCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyIGV4dGVuZHMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgZmluYWwgSUxvY2sgbG9hZGluZ0xvY2s7Ci0KLQkvKioKLQkgKiBUaGUgZGVsYXkgaXMgZGVmYXVsdCB0byA1IG1pbnV0ZXMuIFRoaXMgaXMgdGhlIHVwd2FyZCB0aHJlc2hob2xkLiBUaGUKLQkgKiBsb2NrIHdpbGwgd2FpdCB1cCB0byBERUxBWSBtaWxsaXNlY29uZHMgdG8gYWNxdWlyZSB0aGUgbG9jaywgYW5kIGJhaWwKLQkgKiBpZiBub3QuIEl0IGRvZXMgbm90IG1lYW4gdGhhdCBpdCB3aWxsIHdhaXQgREVMQVkgbWlsbGlzZWNvbmRzIGFsd2F5cy4KLQkgKiBJbiBnZW5lcmFsLCB0aGUgd2FpdCBzaG91bGQgYmUgYWxtb3N0IGluc3RhbnRlb3VzIC0tIGp1c3QgYXMgbG9uZyBhcwotCSAqIGRvY3VtZW50IGxvYWRpbmcgcmVtYWlucyBzcGVlZHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUxBWSA9IDMwMDAwMDsKLQotCXB1YmxpYyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIoKSB7Ci0JCWxvYWRpbmdMb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCi0JCQlsb2FkaW5nTG9jay5hY3F1aXJlKCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI3dhaXRGb3JSZXNvdXJjZVRvTG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0JCWlmIChsb2FkaW5nTG9jayA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gbG9ja0FjcXVpcmVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCkKLQkJCQlpZiAoIShsb2NrQWNxdWlyZWQgPSBsb2FkaW5nTG9jay5hY3F1aXJlKERFTEFZKSkpCi0JCQkJCWxvZ1dhcm5pbmcoKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBqdXN0IGNvbnRpbnVlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobG9ja0FjcXVpcmVkKQotCQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nV2FybmluZygpIHsKLQkJTm90aWZpZXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIFJlc291cmNlKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRhcmdldDsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiW1dBUk5JTkddIENvdWxkIG5vdCBhY3F1aXJlIFNlbWFwaG9yZSBMb2NrIGZvciBSZXNvdXJjZTogXCIiICsgcmVzb3VyY2UuZ2V0VVJJKCkgKyAiXCIgaW4gIiArIGdldENsYXNzKCkpOwotCQl9Ci0KLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0KLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpICE9IG51bGwpIHsKLQkJCS8vIGxpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0JCQlpZiAoaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKSB7Ci0JCQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCi0JCQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQkJCQlyZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIjZm9yY2VSZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZVJlbGVhc2UoKSB7Ci0JCWlmIChsb2FkaW5nTG9jayAhPSBudWxsICYmIGxvYWRpbmdMb2NrLmdldERlcHRoKCkgPiAwKQotCQkJbG9hZGluZ0xvY2sucmVsZWFzZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTkwZThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsgCi0gICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vRWNvcmVVdGlsaXRpZXNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyNGMwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vRWNvcmVVdGlsaXRpZXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYuUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVjb3JlVXRpbGl0aWVzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0xBVE9SX0VYVEVOU1RJT05fUE9JTlQgPSAidHJhbnNsYXRvckV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEVjb3JlVXRpbGl0aWVzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRIYW5kbGVyKFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLklOU1RBTkNFKTsKLQkJUGFja2FnZVVSSU1hcFJlYWRlciByZWFkZXIgPSBuZXcgUGFja2FnZVVSSU1hcFJlYWRlcigpOwotCQlyZWFkZXIucHJvY2Vzc0V4dGVuc2lvbnMoKTsKLQkJLy91c2UgYSBzeW5jaHJvbml6ZWQgbG9hZGluZyBhZGFwdGVyIGZhY3RvcnkKLQkJUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSA9IG5ldyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QYWNrYWdlVVJJTWFwUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzM5YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnk7Ci0KLS8qKgotICogVGhpcyByZWFkZXIgd2lsbCByZWFkIHRoZSBwYWNrYWdlVVJJTWFwIGV4dGVuc2lvbiBwb2ludCBhbmQgcG9wdWxhdGUgdGhlCi0gKiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS4KLSAqIAotICogVGhlIHBhY2thZ2VVUklNYXAgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBlbGVtZW50LgotICogCi0gKiA8bWFwIHByZWZpeD0ic29tZVBhY2thZ2VQcmVmaXgiIHVyaT0ic29tZVBhY2thZ2VVUkkiLz4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VVUklNYXBSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfQVRUX05BTUUgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQVRUX05BTUUgPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJwYWNrYWdlVVJJTWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBQYWNrYWdlVVJJTWFwUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGdldEV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChFY29yZVV0aWxpdGllc1BsdWdpbi5JRCwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCX0KLQotCS8qKgotCSAqIENhbGwgdGhpcyBtZXRob2QgdG8gcmVhZCBhbmQgcHJvY2VzcyBhbGwgb2YgdGhlIHBhY2thZ2VVUklNYXAgZXh0ZW5zaW9ucy4gKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NFeHRlbnNpb25zKCkgewotCQlDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcgPSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRTsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25Qb2ludCgpLmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJcHJvY2Vzc0V4dGVuc2lvbihleHRlbnNpb25zW2ldLCByZWcpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3MgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykKLQkJCXByb2Nlc3NDb25maWd1cmF0aW9uKGNvbmZpZ3NbaV0sIHJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ3VyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZykgewotCQlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUFJFRklYX0FUVF9OQU1FKTsKLQkJU3RyaW5nIHVyaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFVSSV9BVFRfTkFNRSk7Ci0JCXJlZy5yZWdpc3RlclByZWZpeFRvUGFja2FnZVVSSShwcmVmaXgsIHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4MDc1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBleHRlbmRzIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7Ci0KLQlzdGF0aWMgZmluYWwgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9QT0lOVF9OQU1FID0gInJlbmRlcmVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyI2dldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJUmVuZGVyZXJGYWN0b3J5IGFGYWN0b3J5ID0gKFJlbmRlcmVyRmFjdG9yeSkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShFWFRfUE9JTlRfTkFNRSk7Ci0JCXJldHVybiBhRmFjdG9yeSA9PSBudWxsID8gc3VwZXIuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIDogYUZhY3Rvcnk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0Fic3RyYWN0UmVuZGVyZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY4M2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0Fic3RyYWN0UmVuZGVyZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcmVySW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyIHsKLQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIGludCB2ZXJzaW9uSWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0UmVuZGVyZXJJbXBsLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlbmRlcmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UgPSBhUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2dldFJlc291cmNlKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSWQoKSB7Ci0JCXJldHVybiB0aGlzLnZlcnNpb25JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoaW50IHZlcnNpb25JZCkgewotCQl0aGlzLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgewotCQlyZXR1cm4gdmFsaWRhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiBiKSB7Ci0JCXZhbGlkYXRpbmcgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNhY2Nlc3NGb3JSZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNhY2Nlc3NGb3JXcml0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2lzTW9kaWZpZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjaXNTaGFyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2lzU2hhcmVkRm9yV3JpdGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlRGVsZXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZVVubG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNyZWxlYXNlRnJvbVJlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcmVsZWFzZUZyb21Xcml0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjc2V0QmF0Y2hNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZVN0cmVhbXNGb3JJTygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDA4NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIgZXh0ZW5kcyBUcmFuc2xhdG9yRmlsdGVyIHsKLQotCXB1YmxpYyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKCkgewotCQlzdXBlcihudWxsLCAtMSk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIoVHJhbnNsYXRvciB0cmFucywgaW50IHZlcnNpb24pIHsKLQkJc3VwZXIodHJhbnMsIHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KSB7Ci0JCWludCBmb3VuZCA9IHN0YXJ0ICsgMTsKLQkJZm9yICg7IGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2ZvdW5kKSB7Ci0JCQlpZiAoY2hpbGRyZW5bZm91bmRdLmlzRE9NQXR0cmlidXRlKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZm91bmQgPSAoZm91bmQgPCBjaGlsZHJlbi5sZW5ndGgpID8gZm91bmQgOiAtMTsKLQkJcmV0dXJuIGZvdW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50Tm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3NTgzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLQotLyoqCi0gKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBzdG9yZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBTQVggRXZlbnRzLiBUaGlzIGluZm9ybWF0aW9uIGNhbiB0aGVuIGJlCi0gKiB1c2VkIG9uY2UgYWxsIG5lY2Vzc2FyeSBTQVggRXZlbnRzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgdG8gY3JlYXRlIGFuZC9vciBzZXQgdmFsdWVzIG9uIEVNRiBtb2RlbAotICogb2JqZWN0cy4KLSAqIAotICogQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgaGF2ZSBhIHNpbXBsZSBsaWZlY3ljbGU6IGluaXRpYWxpemUsIGNvbGxlY3QgZGF0YSwgY29tbWl0LCBkaXNjYXJkLiBXaGVuCi0gKiBpbml0aWFsaXplZCwgQ0VOT3Mgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0b3IgZm9yIGEgZ2l2ZW4gWE1MIGVsZW1lbnQgbmFtZSwKLSAqIGFuZCBhbHNvIGNyZWF0ZS9zZXQgYW55IG5lY2Vzc2FyeSBFTUYgbW9kZWwgdmFsdWVzLiBEYXRhIGlzIGNvbGxlY3RlZCBhcyBTQVggY2hhcmFjdGVyKCkgZXZlbnRzCi0gKiBhcmUgZ2VuZXJhdGVkLiBPbiB0aGUgU0FYIGVuZEVsZW1lbnQgZXZlbnQsIHRoZSBDRU5PIGlzIGNvbW1pdHRlZCgpLCB3aGljaCBpcyB3aGVyZSBpdCB3aWxsCi0gKiBjb21wbGV0ZSBpdHMgcHJvY2Vzc2luZyB0byBjcmVhdGUgRU1GIG1vZGVsIGZlYXR1cmVzLiBJbiB0aG9zZSBjYXNlcyB3aGVyZSBpdCBjYW5ub3QgY29tcGxldGUgaXRzCi0gKiBwcm9jZXNzaW5nLCBpdCB3aWxsIGRlZmVyIGl0cyBwcm9jZXNzaW5nIHRvIHRoZSB1cGRhdGVFTUYoKSBtZXRob2Qgb2YgaXRzIHBhcmVudC4gRGVmZXJlZAotICogcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIEVNRiBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgcmVhZCBhaGVhZCBjdWVzIGZyb20gdGhlIFhNTC4gQ0VOT3MKLSAqIHdpbGwgYWRkIHRoZW1zZWx2ZXMgdG8gdGhlaXIgcGFyZW50cyBhcyBjaGlsZHJlbiBpbiBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gYW4gQ0VOTwotICogZGV0ZXJtaW5lcyBpdCBpcyB0aGUgZ29sZGVuIHBpZWNlIG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbnRpYXRlIGl0cyBwYXJlbnQgZmVhdHVyZSwgaXQKLSAqIHdpbGwgdHJpZ2dlciBpdHMgcGFyZW50IENFTk8gdG8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgY2FjaGVkIENFTk8gdHJlZS4gQXMgbWVudGlvbmVkLCB0aGUKLSAqIGJ1aWxkaW5nIG9mIGEgQ0VOTyB0cmVlIHdpbGwgb25seSBvY2N1ciBmb3Igbm9kZXMgd2l0aCByZWFkIGFoZWFkIGN1ZXMuCi0gKiAKLSAqIGRpc2NhcmQoKSBpcyBpbnZva2VkIGJ5IGluaXQoKSB0byBlbnN1cmUgdGhhdCBubyBqdW5rIHN0YXRlIGlzIGxlZnQgZnJvbSBhIHByZXZpb3VzIHVzZSBvZiB0aGUKLSAqIENFTk8uIGNvbW1pdCgpIHdpbGwgY2FsbCBkaXNjYXJkIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiB0aGUgdXNlIG9mIGRpc2NhcmQsIENFTk9zIGNhbiBiZSBwb29sZWQKLSAqIGFuZCByZXVzZWQuIElmIGEgQ0VOTyBkZXRlcm1pbmVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGEgcG9vbCwgaXQgd2lsbCBtYW5hZ2UgaXRzIG93biByZWxlYXNlCi0gKiBmcm9tIHRoYXQgcG9vbC4gU2VsZi0gbWFuYWdlbWVudCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgd2F5IGluIHdoaWNoIENFTk9zIG1pZ2h0IGNhY2hlCi0gKiBjZXJ0YWluIGNoaWxkcmVuIHdoaWxlIHdhaXRpbmcgdG8gY3JlYXRlIHRoZSBwYXJlbnQgRU1GIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFdmVudE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9OT0RFID0gIkVNRl9ST09UX05PREUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBub2RlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgTm90aWZpZXIgZW1mT3duZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQlwcml2YXRlIGludCB2ZXJzaW9uSUQ7Ci0KLQkvKgotCSAqIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBhdHRyaWJ1dGVzIGlzIGEgU3RyaW5nW10uIFRoZSBjaG9pY2Ugd2FzIG1hZGUKLQkgKiB0byB1c2UgYW4gYXJyYXkgdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGFub3RoZXIgb2JqZWN0IChwcm9iYWJseSBhIEhhc2h0YWJsZSkgYW5kIHRvIGV4cGxvaXQKLQkgKiBhcnJheS1hY2Nlc3MgdGltZXMgdG8gZ2V0IHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlcyAob3Bwb3NlZCB0byBmdWxsIGZsZWRnZWQKLQkgKiBtZXRob2QgaW52b2NhdGlvbnMpLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByaXZhdGUgQ2FjaGVFdmVudE5vZGUgcGFyZW50ID0gbnVsbDsKLQlwcml2YXRlIENhY2hlRXZlbnRQb29sIGNvbnRhaW5pbmdQb29sID0gbnVsbDsKLQlwcml2YXRlIEJvb2xlYW4gaWdub3JhYmxlID0gbnVsbDsKLQotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZShDYWNoZUV2ZW50UG9vbCBjb250YWluaW5nUG9vbCkgewotCQl0aGlzLmNvbnRhaW5pbmdQb29sID0gY29udGFpbmluZ1Bvb2w7Ci0JfQotCi0JLyoqCi0JICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChUcmFuc2xhdG9yUmVzb3VyY2UpIHdpbGwgY29uZmlndXJlIHRoaXMgQWRhcHRlciBhcyBhIFJPT1Qgbm9kZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMuZGlzY2FyZCgpOwotCQl0aGlzLnNldEVtZk93bmVyKHJlc291cmNlKTsKLQkJdGhpcy5zZXRUcmFuc2xhdG9yKHJlc291cmNlLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCQl0aGlzLnNldFZlcnNpb25JRChyZXNvdXJjZS5nZXRWZXJzaW9uSUQoKSk7Ci0JCXRoaXMubm9kZU5hbWUgPSBDYWNoZUV2ZW50Tm9kZS5ST09UX05PREU7Ci0JfQotCi0JLyoqCi0JICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChDYWNoZUV2ZW50Tm9kZSwgU3RyaW5nLCBBdHRyaWJ1dGVzKSB3aWxsIGNvbmZpZ3VyZSB0aGlzIEFkYXB0ZXIgdG8gYmUKLQkgKiBhIG5vbi1ST09UIG5vZGUgb2YgdGhlIEFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50QXJnLCBTdHJpbmcgbm9kZU5hbWVBcmcsIEF0dHJpYnV0ZXMgYXR0cmlidXRlc0FyZykgewotCQl0aGlzLmRpc2NhcmQoKTsKLQkJdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lQXJnOwotCQlpbml0KHBhcmVudEFyZywgYXR0cmlidXRlc0FyZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50UmVjb3JkLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNBcmcpIHsKLQkJc2V0UGFyZW50KHBhcmVudFJlY29yZCk7Ci0KLQkJc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzQXJnKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkvKiBJIGFtIG5vdCB0aGUgcm9vdCAqLwotCi0JCQkvKgotCQkJICogSWYgdGhlIHBhcmVudCBpcyBwYXJ0IG9mIHRoZSBET00gUGF0aCwgdGhlbiB3ZSBpZ25vcmUgaXQgYW5kIGludGVyYWN0IHdpdGggdGhlIGdyYW5kCi0JCQkgKiBwYXJlbnQKLQkJCSAqLwotCQkJaWYgKHBhcmVudC50cmFuc2xhdG9yICE9IG51bGwgJiYgcGFyZW50LmlzSW5ET01QYXRoKCkpIHsKLQkJCQlzZXRQYXJlbnQocGFyZW50LmdldFBhcmVudCgpKTsKLQkJCX0KLQotCQkJc2V0VmVyc2lvbklEKHBhcmVudC5nZXRWZXJzaW9uSUQoKSk7Ci0JCQlpZiAocGFyZW50LmdldEVtZk93bmVyKCkgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKLQotCQkJCS8qIE15IHBhcmVudCBoYWQgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGVtc2VsZiAqLwotCi0JCQkJaWYgKHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJCXNldFRyYW5zbGF0b3IocGFyZW50LmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQobm9kZU5hbWUsIHBhcmVudC5nZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSkpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0VHJhbnNsYXRvcihwYXJlbnQuZ2V0VHJhbnNsYXRvcigpKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy50cmFuc2xhdG9yID09IG51bGwpIHsKLQkJCQkJLyogT3VyIHRyYW5zbGF0b3IgaXMgbnVsbCEgQWhoISBSdW4hICovCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmVudCBUcmFuc2xhdG9yICgiICsgcGFyZW50LmdldFRyYW5zbGF0b3IoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIikgZGlkIG5vdCBmaW5kIGEgQ2hpbGQgVHJhbnNsYXRvciBmb3IgXCIiICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJbm9kZU5hbWUgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy50cmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihub2RlTmFtZSkgPT0gbnVsbCAmJiAhdGhpcy50cmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkJLyoKLQkJCQkJICogSSBkbyBub3QgcmVxdWlyZSBhIHJlYWQgYWhlYWQgY3VlLCBhbmQgSSBhbSBub3QgbWFuYWdlZCBieSBteSBwYXJlbnQgc28gSSBjYW4KLQkJCQkJICogY3JlYXRlIGFuIGluc3RhbmNlIG9mIG15IEVNRiBvYmplY3QKLQkJCQkJICovCi0KLQkJCQkJTm90aWZpZXIgbXlFbWZPd25lciA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0Tm9kZU5hbWUoKSwgbnVsbCk7Ci0JCQkJCXNldEVtZk93bmVyKG15RW1mT3duZXIpOwotCQkJCQl0aGlzLnRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUocGFyZW50LmdldEVtZk93bmVyKCksIG15RW1mT3duZXIpOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEVsc2UgSSByZXF1aXJlIGEgcmVhZCBhaGVhZCB2YWx1ZSBvciBJIGFtIGJlaW5nIG1hbmFnZWQgYnkgbXkgcGFyZW50LCBzbyBJIGhhdmUKLQkJCQkgKiBubyBuZWVkIHRvIGNyZWF0ZSBhbiBFTUYgb2JqZWN0Ci0JCQkJICovCi0JCQl9Ci0JCQkvKgotCQkJICogRWxzZSBJIGFtIG5vdCBtYXBwZWQgdG8gdGhlIEVNRiBzdGFjayAoWE1MIEVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01QYXRoIGFyZSBpZ25vcmVkKQotCQkJICovCi0JCX0KLQkJLyogcHJvY2Vzc0F0dHJpYnV0ZXMgaXMgZ3VhcmRlZCBhbmQgd2lsbCBub3QgZXhlY3V0ZSB1bmxlc3MgcmVhZHkgKi8KLQkJcHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIGNvbW1pdCgpIGlzIGludm9rZWQgb25seSBpZiB0aGUgQ2FjaGVFdmVudE5vZGUgKENFTk8pIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRoZXkgbmVlZCBhbmQKLQkgKiBzaG91bGQgYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0byBkbyB0byB0aGUgRU1GIGZlYXR1cmUuCi0JICogCi0JICogVGhlIGNvbW1pdCgpIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgd2hlbiBpdCBoYXMgY29tcGxldGVkIGl0cyB0YXNrcywgaWYgbmVlZGVkLiBUaHVzLAotCSAqIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgQ0VOTyBtYXkgaGF2ZSBubyBtZWFuaW5nZnVsIHN0YXRlLiBJZiBkaXNjYXJkKCkgaXMgaW52b2tlZCwKLQkgKiBhbGwgcHJldmlvdXNseSBoZWxkIHJlZmVyZW5jZSB3aWxsIGJlIHJlbGVhc2VkIGluIG9yZGVyIHRvIGJlIG1hZGUgZWxpZ2libGUgZm9yIEdhcmJhZ2UKLQkgKiBDb2xsZWN0aW9uLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHRoaXMuaXNJZ25vcmFibGUoKSkgewotCQkJZGlzY2FyZCgpOwotCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVhZEFoZWFkSGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgYWN0aXZlVHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKTsKLQkJVHJhbnNsYXRvciBwYXJlbnRUcmFuc2xhdG9yID0gZ2V0UGFyZW50KCkuZ2V0VHJhbnNsYXRvcigpOwotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0RW1mT3duZXIoKSA9PSBudWxsKSB7Ci0KLQkJCS8qCi0JCQkgKiBOb3QgZW5vdWdoIGluZm9ybWF0aW9uIHlldCwgYWRkIHRoZSBDYWNoZUV2ZW50Tm9kZSB0byB0aGUgRE9NIENhY2hlIHRyZWUKLQkJCSAqLwotCi0JCQlwYXJlbnQuYXBwZW5kVG9CdWZmZXIodGhpcyk7Ci0JCQlpZiAoKGhlbHBlciA9IGdldFBhcmVudCgpLmdldFJlYWRBaGVhZEhlbHBlcigpKSAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGUgcGFyZW50UmVjb3JkJ3MgZW1mT3duZXIgaXMgbnVsbCwgdGhlbiBpdCBtdXN0IG5vdCBiZSBpbml0aWFsaXplZCB0aGVyZWZvcmUKLQkJCQkgKiBpdCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBtdXN0IHJlcXVpcmUgcmVhZCBhaGVhZCBjbHVlcwotCQkJCSAqIAotCQkJCSAqIFRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGNoZWNrcyBpZiB0aGUgcGFyZW50IGlzIHRoZSBub2RlIHdhaXRpbmcgZm9yIGEKLQkJCQkgKiByZWFkQWhlYWQgY3VlCi0JCQkJICovCi0JCQkJRU9iamVjdCBwYXJlbnRPd25lciA9IG51bGw7Ci0JCQkJaWYgKGhlbHBlci5ub2RlVmFsdWVJc1JlYWRBaGVhZE5hbWUoZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJLyogVGhlIHJlYWRBaGVhZE5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSBxTmFtZSBjaGlsZCBub2RlICovCi0KLQkJCQkJLyogV2UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBFbWZPd25lciBpbiB0aGUgcGFyZW50ISAqLwotCQkJCQlwYXJlbnRPd25lciA9IHBhcmVudFRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldFBhcmVudCgpLmdldE5vZGVOYW1lKCksIGdldEJ1ZmZlcigpKTsKLQotCQkJCQkvKgotCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQotCQkJCQkgKiBwYXJlbnQKLQkJCQkJICovCi0JCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7Ci0KLQkJCQl9IGVsc2UgaWYgKGhlbHBlci5ub2RlTmFtZUlzUmVhZEFoZWFkTmFtZShnZXROb2RlTmFtZSgpKSkgewotCQkJCQkvKiBUaGUgcmVhZEFoZWFkTmFtZSBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNoaWxkIG5vZGUgKHFOYW1lKSAqLwotCi0JCQkJCS8qIFdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgRW1mT3duZXIgaW4gdGhlIHBhcmVudCEgKi8KLQkJCQkJcGFyZW50T3duZXIgPSBwYXJlbnRUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXRQYXJlbnQoKS5nZXROb2RlTmFtZSgpLCBnZXROb2RlTmFtZSgpKTsKLQotCQkJCQkvKgotCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQotCQkJCQkgKiBwYXJlbnQKLQkJCQkJICovCi0JCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7Ci0JCQkJfQotCi0JCQl9IC8qIEVsc2UgYW4gYW5jZXN0b3Igb2YgdGhlIHBhcmVudCBpcyB3YWl0aW5nICovCi0KLQkJfSBlbHNlIHsKLQkJCWlmIChhY3RpdmVUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0aXZlVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0KLQkJCQkJT2JqZWN0IHZhbHVlID0gYWN0aXZlVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShnZXROb2RlTmFtZSgpLCBudWxsLCBnZXRCdWZmZXIoKSwgZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSk7Ci0JCQkJCWFjdGl2ZVRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSwgdmFsdWUpOwotCQkJCQlwcm9jZXNzQXR0cmlidXRlcygpOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJYWN0aXZlVHJhbnNsYXRvci5zZXRUZXh0VmFsdWVJZk5lY2Vzc2FyeShnZXRCdWZmZXIoKSwgZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpOwotCQkJCX0KLQotCQkJfQotCQkJZGlzY2FyZCgpOwotCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3QgdGhlIENhY2hlRXZlbnROb2RlIHRvIGRpc2NhcmQgYWxsIHJlZmVyZW5jZXMgdG8gbWFrZSBldmVyeXRoaW5nIGVsaWdpYmxlIGZvciBnYXJiYWdlCi0JICogY29sbGVjdGlvbi4gVGhpcyBzaG91bGQgT05MWSBiZSBjYWxsZWQgYWZ0ZXIgY29tbWl0IGhhcyBzdWNjZWVkZWQuIEluIHRoZSBjYXNlIG9mIEVNRgotCSAqIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSBhIHJlYWRBaGVhZE5hbWUsIHByb2Nlc3Mgbm90IGJlIGNvbXBsZXRlZCBpbiBjb21taXQoKSwgYnV0IHJhdGhlciB3aWxsCi0JICogYmUgZGVmZXJlZCB0byB0aGUgdXBkYXRlRU1GKCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcml2YXRlIHNwZWNpZmljYWxseSBiZWNhdXNlIGl0Ci0JICogY291bGQgZXJhc2UgYWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgQ2FjaGVFdmVudE5vZGUgYmVmb3JlIGl0IGhhcyBiZWVuIHByb2Nlc3NlZC4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2NhcmQoKSB7Ci0JCXRyYW5zbGF0b3IgPSBudWxsOwotCQllbWZPd25lciA9IG51bGw7Ci0JCWJ1ZmZlciA9IG51bGw7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKQotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJY2hpbGRyZW4gPSBudWxsOwotCQlhdHRyaWJ1dGVzID0gbnVsbDsKLQkJcGFyZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpIHsKLQkJaWYgKGNvbnRhaW5pbmdQb29sICE9IG51bGwpCi0JCQljb250YWluaW5nUG9vbC5yZWxlYXNlTm9kZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZSgpIHsKLQkJaWYgKGlnbm9yYWJsZSA9PSBudWxsKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMudHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGRvbVBhdGggPSB0aGlzLnRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOwotCQkJCQlyZXN1bHQgPSAoZG9tUGF0aCAhPSBudWxsKSA/IGRvbVBhdGguaW5kZXhPZih0aGlzLm5vZGVOYW1lKSA+PSAwIDogZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWdub3JhYmxlID0gcmVzdWx0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gaWdub3JhYmxlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYSBnaXZlbiBjaGlsZCBoYXMgYSB0cmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE5vZGVOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBYTUwgY2hpbGQgbm9kZQotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjaGlsZE5vZGVOYW1lIGNhbiBiZSBpZ25vcmVkIChlLmcuIGl0IGlzIHBhcnQgb2YgdGhlIERPTSBQYXRoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRJZ25vcmFibGUoU3RyaW5nIGNoaWxkTm9kZU5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlUcmFuc2xhdG9yIGNoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCWlmICh0aGlzLmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7Ci0JCQljaGlsZFRyYW5zbGF0b3IgPSB0aGlzLmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQoY2hpbGROb2RlTmFtZSwgdGhpcy5nZXRFbWZPd25lcigpLCB0aGlzLmdldFZlcnNpb25JRCgpKTsKLQotCQkJaWYgKGNoaWxkVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkVHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIHRlbXAgPSBudWxsOwotCQkJCQlyZXN1bHQgPSAoKHRlbXAgPSBjaGlsZFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpKSAhPSBudWxsKSA/IHRlbXAuaW5kZXhPZihjaGlsZE5vZGVOYW1lKSA+PSAwIDogZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luRE9NUGF0aCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAodGhpcy5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgewotCi0JCQlyZXN1bHQgPSB0aGlzLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRoaXMuZ2V0VHJhbnNsYXRvcigpLmdldERPTVBhdGgoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJDYWNoZUV2ZW50Tm9kZVsiKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQoIm5vZGVOYW1lPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZChub2RlTmFtZSk7Ci0JCW91dHB1dC5hcHBlbmQoIjsgdHJhbnNsYXRvcj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQodHJhbnNsYXRvcik7Ci0JCW91dHB1dC5hcHBlbmQoIjsgZW1mT3duZXI9Iik7Ly8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJb3V0cHV0LmFwcGVuZChlbWZPd25lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCW91dHB1dC5hcHBlbmQoIkNvdWxkIG5vdCByZW5kZXIgYXMgc3RyaW5nISIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlvdXRwdXQuYXBwZW5kKCI7IGJ1ZmZlcj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQodGhpcy5idWZmZXIpOwotCQlvdXRwdXQuYXBwZW5kKCI7IGhhc0NoaWxkcmVuPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCgoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQlvdXRwdXQuYXBwZW5kKCJcblx0Y2hpbGRyZW4oIik7Ly8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC5hcHBlbmQoaSk7Ci0JCQkJb3V0cHV0LmFwcGVuZCgiKTogIik7Ly8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC5hcHBlbmQodGhpcy5jaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCW91dHB1dC5hcHBlbmQoIl0iKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBFTUYgbW9kZWwgYnkgY3JlYXRpbmcgRU1GIEZlYXR1cmVzIGFzIG5lY2Vzc2FyeSBmcm9tIHRoZSBET00gVHJlZSBDYWNoZQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRihFT2JqZWN0IG93bmVyKSB7Ci0JCXRoaXMuc2V0RW1mT3duZXIob3duZXIpOwotCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy50cmFuc2xhdG9yLnNldE1PRlZhbHVlKChFT2JqZWN0KSB0aGlzLnBhcmVudC5nZXRFbWZPd25lcigpLCBvd25lcik7Ci0JCQl0aGlzLnByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQotCQl0aGlzLnVwZGF0ZUVNRigpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0cmFuc2xhdG9yIGFuZCB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBDRU5PIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBzaG91bGQgYmUgbm9ubnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRigpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjaGlsZCA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgY2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKHRoaXMuZ2V0RW1mT3duZXIoKSAhPSBudWxsKSB7Ci0JCQlOb3RpZmllciBwYXJlbnRPd25lciA9IHRoaXMuZ2V0RW1mT3duZXIoKTsKLQkJCVRyYW5zbGF0b3IgcGFyZW50VHJhbnNsYXRvciA9IHRoaXMuZ2V0VHJhbnNsYXRvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQljaGlsZCA9IChDYWNoZUV2ZW50Tm9kZSkgdGhpcy5jaGlsZHJlbi5nZXQoaSk7IC8qIENyZWF0ZSB0aGUgRU1GIGZlYXR1cmUgKi8KLQkJCQlpZiAodGhpcy5pc0NoaWxkSWdub3JhYmxlKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCXRoaXMuYWRkQ2hpbGRyZW4oY2hpbGQuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hpbGRUcmFuc2xhdG9yID0gcGFyZW50VHJhbnNsYXRvci5maW5kQ2hpbGQoY2hpbGQuZ2V0Tm9kZU5hbWUoKSwgcGFyZW50T3duZXIsIGNoaWxkLmdldFZlcnNpb25JRCgpKTsKLQkJCQkJY2hpbGQuc2V0VHJhbnNsYXRvcihjaGlsZFRyYW5zbGF0b3IpOwotCi0JCQkJCXZhbHVlID0gY2hpbGRUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNoaWxkLmdldE5vZGVOYW1lKCksIG51bGwsIGNoaWxkLmdldEJ1ZmZlcigpLCBwYXJlbnRPd25lcik7Ci0JCQkJCWNoaWxkVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShwYXJlbnRPd25lciwgdmFsdWUpOwotCi0JCQkJCWlmIChjaGlsZFRyYW5zbGF0b3IuaXNPYmplY3RNYXAoKSkgewotCQkJCQkJY2hpbGQuc2V0RW1mT3duZXIoKE5vdGlmaWVyKSB2YWx1ZSk7Ci0JCQkJCQljaGlsZFRyYW5zbGF0b3Iuc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoY2hpbGQuZ2V0QnVmZmVyKCksIGNoaWxkLmdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKTsKLQkJCQkJfQotCi0JCQkJCWNoaWxkLnByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCQkJCWNoaWxkLnVwZGF0ZUVNRigpOyAvKiB1cGRhdGUgdGhlIEVNRiBvZiB0aGUgY2hpbGQgKi8KLQotCQkJCX0KLQkJCQljaGlsZC5kaXNjYXJkKCk7Ci0JCQkJY2hpbGQucmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChDYWNoZUV2ZW50Tm9kZSBjaGlsZCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbihMaXN0IGNoaWxkcmVuQXJnKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJdGhpcy5jaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW5BcmcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNoaWxkKENhY2hlRXZlbnROb2RlIGNoaWxkKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgUmVhZEFoZWFkSGVscGVyIGdldFJlYWRBaGVhZEhlbHBlcigpIHsKLQkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsICYmIHRoaXMudHJhbnNsYXRvci5oYXNSZWFkQWhlYWROYW1lcygpKSB7Ci0JCQlyZXR1cm4gdHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIobm9kZU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXR0cmlidXRlcyBmaWVsZCBmb3IgaW5mbyBvbiBob3cgaXQgaXMgc3RydWN0dXJlZCAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyKSB7Ci0KLQkJLyoKLQkJICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgZnJvbSB0aGUgcGFyc2VyIG1heSBiZSBzdG9yZWQgYnkgcmVmZXJlbmNlLCBzbyB3ZSBtdXN0IGNvcHkgdGhlbQotCQkgKiBvdmVyIHRvIGEgbG9jYWwgZGF0YSBzdG9yZQotCQkgKi8KLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmdldExlbmd0aCgpID4gMCkgewotCi0JCQlpZiAodGhpcy5hdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nW2F0dHIuZ2V0TGVuZ3RoKCkgKiAyXTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ci5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzW2ldID0gYXR0ci5nZXRRTmFtZShpKTsKLQkJCQl0aGlzLmF0dHJpYnV0ZXNbaSArIGF0dHIuZ2V0TGVuZ3RoKCldID0gYXR0ci5nZXRWYWx1ZShpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJvY2Vzc0F0dHJpYnV0ZXMgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMuIEl0IGlzIGNvbmZpZ3VyZWQgdG8gb25seSBjYXJyeSBvdXQgdGhlCi0JICogcHJvY2Vzc2luZyBvbmUgdGltZS4gQWZ0ZXIgaXQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlcyB0aGUgY29uc3RydWN0aW9uIG9mIFRyYW5zbGF0b3JzIGFuZAotCSAqIHZhbHVlcyBpdCB3aWxsIGRpc2NhcmQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGJ5IHNldHRpbmcgaXQgdG8gbnVsbC4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMgZmllbGQgZm9yIGluZm8gb24gaG93IGl0IGlzIHN0cnVjdHVyZWQgKi8KLQkJaWYgKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsICYmIHRoaXMuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7Ci0KLQkJCWlmICh0aGlzLmVtZk93bmVyICE9IG51bGwgJiYgdGhpcy50cmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlUcmFuc2xhdG9yIGF0dHJUcmFuc2xhdG9yID0gbnVsbDsKLQkJCQlmaW5hbCBpbnQgbGltaXQgPSB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoIC8gMjsKLQkJCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewotCi0JCQkJCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSB0cmFuc2xhdG9yIGJ5IHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSAoYXR0cmlidXRlc1tpXSkgKi8KLQkJCQkJYXR0clRyYW5zbGF0b3IgPSB0aGlzLnRyYW5zbGF0b3IuZmluZENoaWxkKHRoaXMuYXR0cmlidXRlc1tpXSwgdGhpcy5lbWZPd25lciwgdGhpcy52ZXJzaW9uSUQpOwotCi0JCQkJCWlmIChhdHRyVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZSAoYXR0cmlidXRlc1tpK2xpbWl0XSkKLQkJCQkJCSAqIHRvIGEgbWVhbmluZ2Z1bCB2YWx1ZQotCQkJCQkJICovCi0JCQkJCQl2YWx1ZSA9IGF0dHJUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRoaXMuYXR0cmlidXRlc1tpICsgbGltaXRdLCAoRU9iamVjdCkgdGhpcy5lbWZPd25lcik7Ci0JCQkJCQlhdHRyVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdGhpcy5lbWZPd25lciwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyogRm9yZ2V0IHRoZSBhdHRyaWJ1dGVzIHNvIHdlIGRvIG5vdCBwcm9jZXNzIHRoZW0gYWdhaW4gKi8KLQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kcyBkYXRhIHRvIHRoZSBidWZmZXIgc3RvcmVkIGJ5IHRoaXMgQ0VOTy4gVGV4dCB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBkYXRhIGFycmF5Ci0JICogYmVnaW5pbmcgYXQgcG9zaXRpb25nIDxpPnN0YXJ0IDwvaT4gYW5kIGVuZGluZyBhdCBwb3NpdGlvbiA8aT5zdGFydCtsZW5ndGggPC9pPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YQotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUb0J1ZmZlcihjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHRoaXMuaXNJZ25vcmFibGUoKSkgewotCQkJcGFyZW50LmFwcGVuZFRvQnVmZmVyKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIGFjdHMgYXMgYSBtb3JlIGVmZmljaWVudCBmb3JtIG9mICJhcHBlbmQiLiBVc2luZyB0aGlzIG1ldGhvZCBhdm9pZHMgdGhlIG5lZWQgdG8gY29weSB0aGUKLQkJICogZGF0YSBpbnRvIGl0cyBvd24gZGF0YSBzdHJ1Y3R1cmUgKGUuZy4gU3RyaW5nKSBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGJ1ZmZlcgotCQkgKi8KLQkJdGhpcy5idWZmZXIuaW5zZXJ0KGJ1ZmZlci5sZW5ndGgoKSwgZGF0YSwgc3RhcnQsIGxlbmd0aCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGdpdmVuIENFTk8gYXMgYSBjaGlsZCBvZiB0aGlzIENFTk8uCi0JICogCi0JICogQHBhcmFtIHJlY29yZAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRvQnVmZmVyKENhY2hlRXZlbnROb2RlIHJlY29yZCkgewotCi0JCXRoaXMuYWRkQ2hpbGQocmVjb3JkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlcigpIHsKLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBOb3RpZmllciBnZXRFbWZPd25lcigpIHsKLQkJcmV0dXJuIGVtZk93bmVyOwotCX0KLQotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudChDYWNoZUV2ZW50Tm9kZSByZWNvcmQpIHsKLQkJdGhpcy5wYXJlbnQgPSByZWNvcmQ7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNsYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbWZPd25lcihOb3RpZmllciBub3RpZmllcikgewotCi0JCXRoaXMuZW1mT3duZXIgPSBub3RpZmllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChUcmFuc2xhdG9yUmVzb3VyY2UpIHRoaXMuZ2V0RW1mT3duZXIoKSkuZ2V0VmVyc2lvbklEKCk7Ci0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy52ZXJzaW9uSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7Ci0JCXZlcnNpb25JRCA9IGk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3OTllMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogUHJvdmlkZXMgYW4gaW5zdGFuY2UgcG9vbCBvZiByZXVzYWJsZSBDYWNoZUV2ZW50Tm9kZXMuIFRoZSBwb29sIHdpbGwgZGVmYXVsdCB0byAxMCBsaXZlCi0gKiBpbnN0YW5jZXMuIFdoZW4gaXRzIGF2YWlsYWJsZSBpbnN0YW5jZXMgcmVhY2ggZml2ZSB0aW1lcyBpdHMgaW5pdGlhbCBjYXBhY2l0eSwgaXQgd2lsbCBzaHJpbmsKLSAqIGl0c2VsZiBkb3duIHRvIHRoZSBpbml0aWFsIGNhcGFjaXR5LgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnRQb29sIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSAxMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZX0lOQ1JFTUVOVCA9IDI1OwotCi0JcHJpdmF0ZSBpbnQgcG9vbENhcGFjaXR5ID0gREVGQVVMVF9DQVBBQ0lUWTsKLQlwcml2YXRlIENhY2hlRXZlbnRTdGFjayBhdmFpbGFibGVQb29sID0gbnVsbDsKLQlwcml2YXRlIENvbGxlY3Rpb24gaW51c2VQb29sID0gbnVsbDsKLQotCXB1YmxpYyBDYWNoZUV2ZW50UG9vbCgpIHsKLQkJdGhpcyhERUZBVUxUX0NBUEFDSVRZKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBDYWNoZUV2ZW50UE9vbCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5Ci0JICogCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW5zdGFuY2VzIHRvIGNyZWF0ZS4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudFBvb2woaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQlwb29sQ2FwYWNpdHkgPSAoaW5pdGlhbENhcGFjaXR5ID4gMCkgPyBpbml0aWFsQ2FwYWNpdHkgOiBERUZBVUxUX0NBUEFDSVRZOwotCQlhdmFpbGFibGVQb29sID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOwotCQlpbnVzZVBvb2wgPSBuZXcgQXJyYXlMaXN0KHBvb2xDYXBhY2l0eSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ2FjaGVFdmVudE5vZGUgKENFTk8pIGluaXRpYWxpemVkIHRvIHVzZSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXMgaXRzIEVNRiBPd25lci4KLQkgKiAKLQkgKiBUSElTIE1FVEhPRCBTSE9VTEQgT05MWSBCRSBVU0VEIFRPIENSRUFURSBST09UIE5PREVTLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQKLQkgKiBAcmV0dXJuIGEgQ2FjaGVFdmVudE5vZGUgdG8gc2VydmUgYXMgdGhlIHJvb3QuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIGNyZWF0ZUNhY2hlRXZlbnROb2RlKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQlDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyID0gZmV0Y2hGcmVlTm9kZSgpOwotCQlhZGFwdGVyLmluaXQocmVzb3VyY2UpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY2hpbGQgQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgdGhhdCB3aWxsIGJyYW5jaCBmcm9tIHRoZSBnaXZlbiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgQ0VOTwotCSAqIEBwYXJhbSBub2RlTmFtZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGdpdmVuIFhNTCBlbGVtZW50Ci0JICogQHJldHVybiBBIENFTk8gdGhhdCBoYXMgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgY3JlYXRlQ2FjaGVFdmVudE5vZGUoQ2FjaGVFdmVudE5vZGUgcGFyZW50LCBTdHJpbmcgbm9kZU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyID0gZmV0Y2hGcmVlTm9kZSgpOwotCQlhZGFwdGVyLmluaXQocGFyZW50LCBub2RlTmFtZSwgYXR0cmlidXRlcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIENhY2hlRXZlbnROb2RlIENFTk8gYmFjayB0byB0aGUgcG9vbCBvZiBhdmFpbGFiZSBpbnN0YW5jZXMuIFRoaXMgbWV0aG9kIHNob3VsZAotCSAqIG5vdCBiZSBpbnZva2VkIGRpcmVjdGx5LiBDRU5PcyB3aGljaCBhcmUgYWNxdWlyZWQgZnJvbSBhIGdpdmVuIHBvb2wgd2lsbCBhdXRvbWF0aWNhbGx5Ci0JICogcmVsZWFzZSB0aGVtc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZU5vZGUoQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgewotCQlmcmVlTm9kZShhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBmcmVlemVQb29sKCkgc2hvdWxkIGJlIGludm9rZWQgdG8gZnJlZSBhbnkgdW51c2VkIHJlc291cmNlcy4gQWZ0ZXIgZnJlZXplUG9vbCBoYXMgYmVlbgotCSAqIGludm9rZWQsIHdhcm1Qb29sKCkgd2lsbCBuZWVkIHRvIGJlIGludm9rZWQgYmVmb3JlIHRoZSBwb29sIGNhbiBiZSB1c2VkIGFnYWluLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmcmVlemVQb29sKCkgewotCQlhdmFpbGFibGVQb29sLmNsZWFyKCk7Ci0JCWF2YWlsYWJsZVBvb2wgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHdhcm1Qb29sKCkgbXVzdCBiZSBpbnZva2VkIHRvIG5vdGlmeSB0aGUgcG9vbCBpdCBpcyBhYm91dCB0byBiZSB1c2VkLiBUaGlzIHNob3VsZCBvY2N1ciBvbmx5Ci0JICogb25jZSBwZXIgZG9jdW1lbnQgcmVuZGVyaW5nLiBVbnRpbCB0aGUgcG9vbCBpcyBpbiB1c2UsIGl0IGNvbnRhaW5zIG5vIGF2YWlsYWJsZQotCSAqIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIGluIG9yZGVyIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBpbi1tZW1vcnkgZm9vdHByaW50IG9mIHRoZQotCSAqIEVNRjJTQVhXcml0ZXIuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm1Qb29sKCkgewotCQllbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlRXZlbnROb2RlIGZldGNoRnJlZU5vZGUoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGF2YWlsYWJsZVBvb2wgPT0gbnVsbCB8fCBhdmFpbGFibGVQb29sLmlzRW1wdHkoKSkKLQkJCXdhcm1Qb29sKCk7Ci0KLQkJcmVzdWx0ID0gYXZhaWxhYmxlUG9vbC5wb3AoKTsKLQkJaW51c2VQb29sLmFkZChyZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZyZWVOb2RlKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKLQkJaWYgKGludXNlUG9vbC5yZW1vdmUoYWRhcHRlcikpCi0JCQlhdmFpbGFibGVQb29sLnB1c2goYWRhcHRlcik7Ci0JCS8vZWxzZQotCQkvLwl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBZGFwdGVyIG5vdCBjb250YWluZWQgaW4gcG9vbCEiKTsKLQkJaWYgKGF2YWlsYWJsZVBvb2wuc2l6ZSgpID4gKDUgKiBwb29sQ2FwYWNpdHkpKSB7Ci0JCQlhdmFpbGFibGVQb29sLmNsZWFyKCk7Ci0JCQllbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKSB7Ci0JCWlmIChhdmFpbGFibGVQb29sID09IG51bGwpIHsKLQkJCWF2YWlsYWJsZVBvb2wgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7Ci0JCX0KLQkJaWYgKGF2YWlsYWJsZVBvb2wuc2l6ZSgpIDwgcG9vbENhcGFjaXR5KSB7Ci0JCQlmaW5hbCBpbnQgbWluaW11bUNhcGFjaXR5ID0gcG9vbENhcGFjaXR5IC0gYXZhaWxhYmxlUG9vbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbmltdW1DYXBhY2l0eTsgaSsrKQotCQkJCWF2YWlsYWJsZVBvb2wucHVzaChuZXcgQ2FjaGVFdmVudE5vZGUodGhpcykpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNDE5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI0LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiB1bnN5bmNocm9uaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBhIFN0YWNrIChMSUZPKSBkYXRhIHN0cnVjdHVyZS4gTm8gY2FzdGluZyBpcyByZXF1aXJlZCB3aGVuCi0gKiB1c2luZyB0aGlzIGRhdGEgc3RydWN0dXJlLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnRTdGFjayBleHRlbmRzIEFycmF5TGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgcGVlaygpIHsKLQkJaWYgKHNpemUoKSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gKENhY2hlRXZlbnROb2RlKSBnZXQoc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmVtb3ZpbmcgaXQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgcG9wKCkgewotCQlpZiAoc2l6ZSgpID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCi0JCXJldHVybiAoQ2FjaGVFdmVudE5vZGUpIHJlbW92ZShzaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgQSBDRU5PIHRvIHB1c2ggb250byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2goQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgewotCQlhZGQoYWRhcHRlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzY3YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBhIHBhY2thZ2UgcHJlZml4IHRvIGl0cyBjdXJyZW50IG5hbWVzcGFjZSBVUkkuIEFsc28sCi0gKiB0aGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gbWFwIHRoZSBwYWNrYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSB7Ci0JcHVibGljIHN0YXRpYyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpOwotCXByaXZhdGUgTWFwIHByZWZpeFRvUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpIHsKLQkJcmV0dXJuIHByZWZpeFRvUGFja2FnZVVSSXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQcmVmaXhUb1BhY2thZ2VVUkkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgdXJpICE9IG51bGwpIHsKLQkJCXByZWZpeFRvUGFja2FnZVVSSXMucHV0KHByZWZpeCwgdXJpKTsKLQkJCXBhY2thZ2VVUklzVG9QcmVmaXhlcy5wdXQodXJpLCBwcmVmaXgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODI0ZGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBwcmVmaXhUb1BhY2thZ2VVUklzOwotCi0JcHJvdGVjdGVkIE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0KLQlwdWJsaWMgTWFwIGdldFByZWZpeFRvUGFja2FnZVVSSSgpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFByZWZpeFRvUGFja2FnZVVSSXMoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZmZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyIGV4dGVuZHMgU0FYWE1JSGFuZGxlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlVMTF9BVFRSSUIgPSBYTUxSZXNvdXJjZS5YU0lfTlMgKyAiOm51bGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0geG1pUmVzb3VyY2UKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIoWE1MUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFhNTEhlbHBlciBoZWxwZXIsIE1hcCBvcHRpb25zKSB7Ci0JCXN1cGVyKHhtaVJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhhbmRsZXIjaXNOdWxsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwoKSB7Ci0JCWJvb2xlYW4gaXNudWxsID0gc3VwZXIuaXNOdWxsKCk7Ci0JCWlmICghaXNudWxsKQotCQkJaXNudWxsID0gYXR0cmlicy5nZXRWYWx1ZShOVUxMX0FUVFJJQikgIT0gbnVsbDsKLQkJcmV0dXJuIGlzbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTM1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKLQlVUkkgZGVOb3JtYWxpemUoVVJJIHVyaSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE3YTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMzAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5TQVhXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlMb2FkSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5WE1JTG9hZEltcGwgZXh0ZW5kcyBYTUlMb2FkSW1wbCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGwjbWFrZURlZmF1bHRIYW5kbGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IFNBWFdyYXBwZXIobmV3IENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyKHJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU0ZjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIGV4dGVuZHMgWE1JUmVzb3VyY2UgewotCWludCBGT1JNQVRfRU1GMSA9IDA7Ci0JLyoqCi0JICogZm9ybWF0IGZvciBNT0Y1IGNvbXBhdGliaWxpdHk7IG5vdGUgdGhhdCB0aGlzIGNhbiBOT1QgYmUgdXNlZCB3aXRoIHJlc291cmNlcyB1c2luZ3MgdGhlCi0JICogInBsYXRmb3JtOi9wbHVnaW4iIHByb3RvY29sIgotCSAqLwotCWludCBGT1JNQVRfTU9GNSA9IDE7Ci0KLQl2b2lkIGFkZE9yaWdpbmFsUGFja2FnZVVSSShTdHJpbmcgcGFja2FnZVVyaSwgU3RyaW5nIG9yaWdpbmFsVXJpKTsKLQotCWludCBnZXRGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuIEJ5IGRlZmF1bHQgaXQgaXMgRk9STUFUX0VNRjEuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjRk9STUFUX0VNRjEKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNGT1JNQVRfTU9GNQotCSAqLwotCXZvaWQgc2V0Rm9ybWF0KGludCBmb3JtYXQpOwotCi0JYm9vbGVhbiB1c2VzRGVmYXVsdEZvcm1hdCgpOwotCi0JLyoqCi0JICogQHBhcmFtIHJvb3RPYmplY3QKLQkgKi8KLQl2b2lkIHJlbW92ZVByZXNlcnZpbmdJZHMoRU9iamVjdCByb290T2JqZWN0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwYjA5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGludCBmb3JtYXQgPSBGT1JNQVRfRU1GMTsKLQlwcm90ZWN0ZWQgTWFwIG9yaWdpbmFsUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUlEcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QTFVHSU4gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hcHBhYmxlWE1JUmVzb3VyY2VJbXBsLgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTEhlbHBlcigpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCU1hcHBlZFhNSUhlbHBlciBoZWxwZXIgPSBkb0NyZWF0ZVhNTEhlbHBlcigpOwotCQloZWxwZXIuc2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpKTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGVkWE1JSGVscGVyIGRvQ3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBlZFhNSUhlbHBlcih0aGlzLCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRPcmlnaW5hbFBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VVcmksIFN0cmluZyBvcmlnaW5hbFVyaSkgewotCQlvcmlnaW5hbFBhY2thZ2VVUklzLnB1dChwYWNrYWdlVXJpLCBvcmlnaW5hbFVyaSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRGb3JtYXQoKSB7Ci0JCXJldHVybiBmb3JtYXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0KGludCBmb3JtYXQpIHsKLQkJaWYgKCFpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSkKLQkJCXRoaXMuZm9ybWF0ID0gZm9ybWF0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSB7Ci0JCVVSSSBhVVJJID0gZ2V0VVJJKCk7Ci0KLQkJcmV0dXJuIGFVUkkgIT0gbnVsbCAmJiBQTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBQTEFURk9STV9QTFVHSU4uZXF1YWxzKHVyaS5zZWdtZW50KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRVUklGcmFnbWVudChFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmICh1c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOwotCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQoZU9iamVjdCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc0RlZmF1bHRGb3JtYXQoKSB7Ci0JCXJldHVybiBmb3JtYXQgPT0gQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9FTUYxOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxTYXZlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlpZiAodXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9TYXZlKE91dHB1dFN0cmVhbSwgTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9TYXZlKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXREZWZhdWx0T3B0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCWdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgewotCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGlkVG9FT2JqZWN0TWFwLmdldChpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyB1bmxvYWRlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHtAbGluayBJbnRlcm5hbEVPYmplY3QjZVNldFByb3h5VVJJIHNldHN9dGhlIG9iamVjdCB0byBiZSBhIHByb3h5IGFuZCBjbGVhcnMgdGhlCi0JICoge0BsaW5rICNlQWRhcHRlcnMgYWRhcHRlcnN9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QpIHsKLQkJLy9vdmVycmlkZGVuIGZyb20gdGhlIHN1cGVyIGNsYXNzOyBjYWxsIHN1cGVyLmdldFVSSUZyYWdtZW50IGluc3RlYWQgb2YgdGhlIGltcGxlbWVudGF0aW9uCi0JCS8vYXQgdGhpcyBsZXZlbCwgdG8gYXZvaWQgSUQgZ2VuZXJhdGlvbiBkdXJpbmcgdW5sb2FkCi0JCS8vaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoZ2V0VVJJRnJhZ21lbnQoaW50ZXJuYWxFT2JqZWN0KSkpOwotCQlpbnRlcm5hbEVPYmplY3QuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChzdXBlci5nZXRVUklGcmFnbWVudChpbnRlcm5hbEVPYmplY3QpKSk7Ci0JCWludGVybmFsRU9iamVjdC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb0xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYmFzaWNEb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2RvTG9hZChJbnB1dFN0cmVhbSwgTWFwKX0gaW5zdGVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY0RvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5WE1JTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI3JlbW92ZVByZXNlcnZpbmdJZHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJlc2VydmluZ0lkcyhFT2JqZWN0IHJvb3RPYmplY3QpIHsKLQkJc2V0UHJlc2VydmVJRHModHJ1ZSk7Ci0JCWdldENvbnRlbnRzKCkucmVtb3ZlKHJvb3RPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlc2VydmVJRHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZUlEcygpIHsKLQkJcmV0dXJuIHByZXNlcnZlSURzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcmVzZXJ2ZUlEcwotCSAqICAgICAgICAgICAgVGhlIHByZXNlcnZlSURzIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlEcyhib29sZWFuIHByZXNlcnZlSURzKSB7Ci0JCXRoaXMucHJlc2VydmVJRHMgPSBwcmVzZXJ2ZUlEczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZGV0YWNoZWRIZWxwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWNoZWRIZWxwZXIoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJZU9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKTsKLQkJfQotCi0JCWlmICh1c2VVVUlEcygpKSB7Ci0JCQlERVRBQ0hFRF9FT0JKRUNUX1RPX0lEX01BUC5wdXQoZU9iamVjdCwgZ2V0SUQoZU9iamVjdCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ByZXNlcnZlSURzKCkgJiYgaWRUb0VPYmplY3RNYXAgIT0gbnVsbCAmJiBlT2JqZWN0VG9JRE1hcCAhPSBudWxsKSB7Ci0JCQlpZFRvRU9iamVjdE1hcC5yZW1vdmUoZU9iamVjdFRvSURNYXAucmVtb3ZlKGVPYmplY3QpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGlzTG9hZGVkKSB7Ci0gICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsICYmICFpc0xvYWRlZCkgCi0gICAgICAgICAgICAgICAgYWRkU3luY2hyb25pemF0aW9uTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZihhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIubG9hZChvcHRpb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgICAgICB9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgfSBjYXRjaChFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCQotCSAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCkgewotICAgICAgICBpZiAoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgICAgICBlQWRhcHRlcnMoKS5hZGQoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRhcHRlci5mb3JjZVJlbGVhc2UoKTsKLSAgICAgICAgICAgIGVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhc2UgMTogTE9BRCBSRVNPVVJDRSBGUk9NIERJU0sgdGhpcy5pc0xvYWRlZCA9PSBmYWxzZSBBTkQgaXNMb2FkZWQgPT0KLSAgICAgKiB0cnVlICh3aGljaCBtZWFucyB3ZSBlbnRlcmVkIHRoZSBsb2FkKCkgbWV0aG9kLCBidXQgaGF2ZSBub3QgY29tcGxldGVkCi0gICAgICogdGhlIGxvYWQpLCBhbmQgd2UncmUgbG9hZGluZyBmcm9tIGEgcmVzb3VyY2Ugb24gZGlzaywgdGhlbiB3ZSBhZGQgdGhlCi0gICAgICogYWRhcHRlciBDYXNlIDI6IFJFU09VUkNFIENSRUFUSU9OIChOT1QgQSBMT0FEKSBDYXNlIDQ6IFJFU09VUkNFIENSRUFUSU9OLAotICAgICAqIFVOTE9BREVELCBORVcgQ09OVEVOVFMgKE5PVCBBIExPQUQpIFJlc291cmNlIGlzIGNyZWF0ZWQgYnV0IG5vdCBmcm9tIGEKLSAgICAgKiByZXNvdXJjZSBvbiBkaXNrLCBzbyBjb250ZW50cyBpcyBudWxsIEFORCBub3QgZW1wdHksIHNvIG5vIGFkYXB0ZXI6IFRISVMKLSAgICAgKiBJUyBOT1QgQSBMT0FEIENhc2UgMzogUkVTT1VSQ0UgSEFTIEJFRU4gVU5MT0FERUQsIEJFSU5HIFJFTE9BREVEIEZST00KLSAgICAgKiBESVNLIENvbnRlbnRzIGlzIE5PVCBudWxsLCBidXQgaXQgaXMgRW1wdHkgYW5kIHRoZSByZXNvdXJjZSBpcyBiZWluZwotICAgICAqIGxvYWRlZCBmcm9tIGRpc2suIFdlIG11c3QgYWRkIHRoZSBhZGFwdGVyLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VCZWluZ0xvYWRlZChib29sZWFuIGlzTG9hZGVkKSB7Ci0gICAgICAgIHJldHVybiAoIXRoaXMuaXNMb2FkZWQgJiYgaXNMb2FkZWQpICYmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0Q29udGVudHMoKQotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLSAgICAgICAgd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjaXNMb2FkZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgewotICAgICAgICB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNMb2FkZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpIHsKLSAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGxvYWRpbmdBZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICBpZiAobG9hZGluZ0FkYXB0ZXIgIT0gbnVsbCkgbG9hZGluZ0FkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhN2JmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwgZXh0ZW5kcyBYTUlTYXZlSW1wbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLgotCSAqIAotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLgotCSAqIAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoTWFwIG9wdGlvbnMsIFhNTEhlbHBlciBoZWxwZXIsIFN0cmluZyBlbmNvZGluZykgewotCQlzdXBlcihvcHRpb25zLCBoZWxwZXIsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNpbml0KFhNTFJlc291cmNlLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChYTUxSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpIHsKLQkJc3VwZXIuaW5pdChyZXNvdXJjZSwgb3B0aW9ucyk7Ci0JCXhtaVR5cGUgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2FkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgewotCQlkb2MuYWRkQXR0cmlidXRlKFhNSV9WRVJfTlMsIFhNSVJlc291cmNlLlZFUlNJT05fVkFMVUUpOwotCQlkb2MuYWRkQXR0cmlidXRlKFhNSV9YTUxOUywgWE1JUmVzb3VyY2UuWE1JX1VSSSk7Ci0JCUVQYWNrYWdlW10gcGFja2FnZXMgPSBoZWxwZXIucGFja2FnZXMoKTsKLQkJU3RyaW5nQnVmZmVyIHhzaVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKGRlY2xhcmVTY2hlbWFMb2NhdGlvbikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gcGFja2FnZXNbaV07Ci0KLQkJCQlFT2JqZWN0IHJvb3QgPSBFY29yZVV0aWwuZ2V0Um9vdENvbnRhaW5lcihlUGFja2FnZSk7Ci0JCQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBFUGFja2FnZSkgewotCQkJCQlFUGFja2FnZSByb290RVBhY2thZ2UgPSAoRVBhY2thZ2UpIHJvb3Q7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcm9vdEVQYWNrYWdlLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROc1VSSSA9IHJvb3RFUGFja2FnZS5nZXROc1VSSSgpOwotCQkJCQkJaWYgKHVyaSA9PSBudWxsID8gcm9vdE5zVVJJICE9IG51bGwgOiAhdXJpLnRvU3RyaW5nKCkuZXF1YWxzKHJvb3ROc1VSSSkpIHsKLQkJCQkJCQlkZWNsYXJlWFNJID0gdHJ1ZTsKLQkJCQkJCQlpZiAoeHNpU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoJyAnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJeHNpU2NoZW1hTG9jYXRpb24uYXBwZW5kKHJvb3ROc1VSSSk7Ci0JCQkJCQkJeHNpU2NoZW1hTG9jYXRpb24uYXBwZW5kKCcgJyk7Ci0JCQkJCQkJeHNpU2NoZW1hTG9jYXRpb24uYXBwZW5kKGhlbHBlci5nZXRIUkVGKHJvb3RFUGFja2FnZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlY2xhcmVYU0kpIHsKLQkJCWRvYy5hZGRBdHRyaWJ1dGUoWFNJX1hNTE5TLCBYTUxSZXNvdXJjZS5YU0lfVVJJKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gcGFja2FnZXNbaV07Ci0JCQkvL01vZGlmaWVkIGZyb20gc3VwZXJjbGFzcyAtIGRpc3BhdGNoIGJhY2sgdG8gaGVscGVyIGZvciBjb21wYXRpYmlsaXR5Ci0JCQkvL1N0cmluZyBuc1VSSSA9IGVQYWNrYWdlLmdldE5zVVJJKCk7Ci0JCQkvL1N0cmluZyBuc1ByZWZpeCA9IGVQYWNrYWdlLmdldE5zUHJlZml4KCk7Ci0JCQlTdHJpbmdbXSBuc0luZm8gPSAoKE1hcHBlZFhNSUhlbHBlcikgaGVscGVyKS5nZXROU0luZm8oZVBhY2thZ2UpOwotCQkJZG9jLmFkZEF0dHJpYnV0ZU5TKFhNTFJlc291cmNlLlhNTF9OUywgbnNJbmZvWzBdLCBuc0luZm9bMV0pOwotCQl9Ci0KLQkJaWYgKHhzaVNjaGVtYUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWRvYy5hZGRBdHRyaWJ1dGUoWFNJX1NDSEVNQV9MT0NBVElPTiwgeHNpU2NoZW1hTG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlSHJlZihFT2JqZWN0IHJlbW90ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJU3RyaW5nIG5hbWUgPSBoZWxwZXIuZ2V0UU5hbWUoZik7Ci0JCVN0cmluZyBocmVmID0gaGVscGVyLmdldEhSRUYocmVtb3RlKTsKLQkJaWYgKGhyZWYgIT0gbnVsbCkgewotCQkJZG9jLnN0YXJ0RWxlbWVudChuYW1lKTsKLQkJCUVDbGFzcyBlQ2xhc3MgPSByZW1vdGUuZUNsYXNzKCk7Ci0KLQkJCUVDbGFzcyBleHBlY3RlZFR5cGUgPSAoRUNsYXNzKSBmLmdldEVUeXBlKCk7Ci0JCQkvL0NoYW5nZWQgbmV4dCBsaW5lIHRvIGFsd2F5cyB3cml0ZSB0eXBlIGlmIGV4cGVjdGVkVHlwZQotCQkJLy9pcyBkaWZmZXJlbnQgZnJvbSBlQ2xhc3MKLQkJCWlmIChlQ2xhc3MgIT0gZXhwZWN0ZWRUeXBlKSB7Ci0JCQkJc2F2ZVR5cGVBdHRyaWJ1dGUoZUNsYXNzKTsKLQkJCX0KLQotCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCWRvYy5lbmRFbXB0eUVsZW1lbnQoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmYxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBudWxsLCBET01fQVRUUklCVVRFKTsKLQkJdGhpcy5hdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFiY2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkgaW1wbGVtZW50cyBWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkoKTsKLQotCXB1YmxpYyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNhY2NlcHRzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0cyhTdHJpbmcgZG9tTmFtZSkgewotCQlyZXR1cm4gZG9tTmFtZSAhPSBudWxsICYmIGRvbU5hbWUuc3RhcnRzV2l0aChYTUxOUyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNhY2NlcHRzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE5vdGlmaWNhdGlvbiBub3RpZikgewotCQlyZXR1cm4gbm90aWYuZ2V0RmVhdHVyZSgpID09IE5hbWVzcGFjZUFkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkU7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZShTdHJpbmcgZG9tTmFtZSkgewotCQlyZXR1cm4gbmV3IE5hbWVzcGFjZVRyYW5zbGF0b3IoZG9tTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlKE5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFT2JqZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IG5hbWVzcGFjZXMgPSBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZXMoKEVPYmplY3QpIHRhcmdldCk7Ci0JCWlmIChuYW1lc3BhY2VzID09IG51bGwgfHwgbmFtZXNwYWNlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG5hbWVzcGFjZXMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkKGNyZWF0ZSgoTmFtZXNwYWNlKSBuYW1lc3BhY2VzLmdldChpKSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZShOb3RpZmljYXRpb24gbm90aWYpIHsKLQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgbm90aWYuZ2V0TmV3VmFsdWUoKTsKLQkJcmV0dXJuIGNyZWF0ZShucyk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZShOYW1lc3BhY2UgbnMpIHsKLQkJcmV0dXJuIG5ldyBOYW1lc3BhY2VUcmFuc2xhdG9yKFhNTE5TICsgbnMuZ2V0UHJlZml4KCkpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZXBlbmRlbmN5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2QxYzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgYURlcGVuZGVudEZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQkJZGVwZW5kZW5jeUZlYXR1cmUgPSBhRGVwZW5kZW50RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDaGlsZChFT2JqZWN0IHBhcmVudCkgewotCQlFT2JqZWN0IGNoaWxkID0gYmFzaWNHZXREZXBlbmRlbmN5T2JqZWN0KHBhcmVudCk7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZUNoaWxkKHBhcmVudCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUNoaWxkKEVPYmplY3QgcGFyZW50KSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBjcmVhdGVFTUZPYmplY3QoZGVwZW5kZW5jeUZlYXR1cmUpOwotCQlwYXJlbnQuZVNldChkZXBlbmRlbmN5RmVhdHVyZSwgY2hpbGQpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJLy9yZXR1cm4gc3VwZXIuZ2V0TU9GQ2hpbGRyZW4oZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JCXJldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1PRlZhbHVlKGdldENoaWxkKG1vZk9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJLy9zdXBlci5zZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpLCB2YWx1ZSk7Ci0JCXN1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlLCAtMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCXN1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlLCBuZXdJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5yZW1vdmVNT0ZWYWx1ZShnZXRDaGlsZCgoRU9iamVjdCkgb3duZXIpLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuaXNTZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXN1cGVyLnVuU2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lDaGlsZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZmVhdHVyZUV4aXN0cyhnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckxpc3QoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJc3VwZXIuY2xlYXJMaXN0KGdldENoaWxkKG1vZk9iamVjdCkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODJlYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBFTUYyRE9NQWRhcHRlciBleHRlbmRzIEFkYXB0ZXIgewotCi0KLQlDbGFzcyBBREFQVEVSX0NMQVNTID0gRU1GMkRPTUFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERPTSBub2RlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGFkYXB0ZXIgbWFwcyB0by4gSWYgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IG1hcHMgdG8KLQkgKiBtb3JlIHRoYW4gb25lIERPTSBub2RlLCB0aGlzIG5vZGUgaXMgdGhlIHRvcC1tb3N0IG5vZGUuCi0JICovCi0JTm9kZSBnZXROb2RlKCk7Ci0KLQl2b2lkIHNldE5vZGUoTm9kZSBhTm9kZSk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCWJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBET00gdHJlZSBmb3IgdGhpcyBhZGFwdGVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBNT0YgT2JqZWN0LiBUaGlzIG1ldGhvZAotCSAqIHVwZGF0ZXMgQUxMIHRoZSBET00gbm9kZXMgZnJvbSBhbGwgdGhlIE1PRiBhdHRyaWJ1dGVzLgotCSAqLwotCXZvaWQgdXBkYXRlRE9NKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBNT0YgT2JqZWN0IGZyb20gdGhlIERPTSB0cmVlLiBBbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBET00gdHJlZSBhcmUgdXBkYXRlZCBpbnRvCi0JICogdGhlIE1PRiBvYmplY3QuCi0JICovCi0Jdm9pZCB1cGRhdGVNT0YoKTsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpOwotCi0JcHVibGljIHZvaWQgdXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCk7Ci0KLQlFT2JqZWN0IGdldEVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIE1PRiBvYmplY3QgaXMgYSBwcm94eS4KLQkgKi8KLQlib29sZWFuIGlzTU9GUHJveHkoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIGFkYXB0ZXJzIGZyb20gdGhlIG5vZGUgQU5EIGFsbCBpdHMgY2hpbGQgbm9kZXMsIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXZvaWQgcmVtb3ZlQWRhcHRlcnMoTm9kZSBub2RlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZkODE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuVHJhbnNsYXRvclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLldGVFV0aWxzUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBFTUYyRE9NQWRhcHRlciB7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZkRlYnVnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmTm9kZTsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCi0JcHJvdGVjdGVkIEVNRjJET01SZW5kZXJlciBmUmVuZGVyZXI7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkVHJhbnNsYXRvcnM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3QgPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0gPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU1JVTk5JTkcgPSAiaXNSdW5uaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwgewotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIkVNRjJET01EZXBlbmRlbmN5QWRhcHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCUVNRjJET01BZGFwdGVySW1wbC50aGlzLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gS0VZLmVxdWFscyh0eXBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciByb290IGFkYXB0ZXJzLgotCSAqLwotCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBEb2N1bWVudCBkb2N1bWVudCwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcygoTm90aWZpZXIpIHJlc291cmNlLCAoTm9kZSkgZG9jdW1lbnQsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQkJaXNSb290ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gQWRhcHRlciBnaXZlbiBhbiBFT2JqZWN0IGFuZCBhIG5vZGUKLQkgKi8KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vdGlmaWVyIG9iamVjdCwgTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcigpOwotCQlzZXRUYXJnZXQob2JqZWN0KTsKLQkJZk5vZGUgPSBub2RlOwotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlhZGRFTUZBZGFwdGVyKCk7Ci0JCWFkZERPTUFkYXB0ZXIoKTsKLQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZyb20gYSBET00gTm9kZS4gVGhlIEVPYmplY3Qgd2lsbCBiZSBjcmVhdGVkCi0JICovCi0JcHVibGljIEVNRjJET01BZGFwdGVySW1wbChOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZlJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JCWZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJc2V0VGFyZ2V0RnJvbU5vZGUoKTsKLQkJaW5pdENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJYWRkRU1GQWRhcHRlcigpOwotCQlhZGRET01BZGFwdGVyKCk7Ci0JCWFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKSB7Ci0JCWlmICghZlRyYW5zbGF0b3IuaXNEZXBlbmRlbmN5UGFyZW50KCkpCi0JCQlyZXR1cm47Ci0JCUVPYmplY3QgY2hpbGQgPSBmVHJhbnNsYXRvci5iYXNpY0dldERlcGVuZGVuY3lPYmplY3QoZ2V0RU9iamVjdCgpKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlhZGREZXBlbmRlbmN5QWRhcHRlcihjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENoaWxkVHJhbnNsYXRvcnMoKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gaXNSdW5uaW5nID0gZmFsc2U7IC8vaXMgdGhlIE9TR0kgcGxhdGZvcm0gcnVubmluZyA/Ci0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgUGxhdGZvcm0gY2xhc3MgY2FuIGJlIGZvdW5kLCB0aGVuIGNvbnRpbnVlIHRvIGNoZWNrIGlmIHRoZSBPU0dJIHBsYXRmb3JtIGlzIHJ1bm5pbmcKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShQTEFURk9STSk7Ci0JCQlNZXRob2QgbSA9IGNsYXp6LmdldE1ldGhvZChJU1JVTk5JTkcsIG51bGwpOwotCQkJaXNSdW5uaW5nID0gKChCb29sZWFuKW0uaW52b2tlKGNsYXp6LCBudWxsKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkgICAgIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfQkKLQkJLy9DaGVjayBmb3IgZXh0ZW5kZWQgY2hpbGQgdHJhbnNsYXRvcnMgYmVjYXVzZSB3ZSBhcmUgaW4gT1NHSSBtb2RlCi0JCWlmIChpc1J1bm5pbmcpIHsKLQkJCVRyYW5zbGF0b3JbXSBleHRlbmRlZENoaWxkcmVuID0gVHJhbnNsYXRvclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRUcmFuc2xhdG9ycygpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAJaWYgKGV4dGVuZGVkQ2hpbGRyZW5baV0gIT0gbnVsbCkKLQkgICAgICAgICAgICAJY2hpbGRyZW4uYWRkKGV4dGVuZGVkQ2hpbGRyZW5baV0pOwotCSAgICAgICAgfQotCQl9Ci0JCQotCQkKLQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3QoZlRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4oZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSkpKTsKLQotCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBmVHJhbnNsYXRvci5nZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBkb21OYW1lID0gbnVsbDsKLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlOb2RlIGF0dHJOb2RlID0gbWFwLml0ZW0oaSk7Ci0JCQkJCWRvbU5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQkvL0hhbmRsZSB2YXJpYWJsZSB0cmFuc2xhdG9ycwotCQkJCQlUcmFuc2xhdG9yIHQgPSBmVHJhbnNsYXRvci5maW5kQ2hpbGQoZG9tTmFtZSwgZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCWlmICh0ICE9IG51bGwgJiYgIWNoaWxkcmVuLmNvbnRhaW5zKHQpKQotCQkJCQkJY2hpbGRyZW4uYWRkKHQpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgY2hpbGRyZW5Gcm9tRU1GID0gZmFjdG9yeS5jcmVhdGUoZ2V0VGFyZ2V0KCkpOwotCQkJaWYgKGNoaWxkcmVuRnJvbUVNRiAhPSBudWxsKQotCQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbkZyb21FTUYpOwotCQl9Ci0KLQkJY2hpbGRUcmFuc2xhdG9ycyA9IChUcmFuc2xhdG9yW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IFRyYW5zbGF0b3JbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRvIGZhbHNlIGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIG9iamVjdCB3aWxsIGJlCi0JICogaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBmTm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJZk5vdGlmaWNhdGlvbkVuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyA9PSB0eXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVNRkFkYXB0ZXIoKSB7Ci0JCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoc2hvcnRDbGFzc05hbWUodGhpcykpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGdldE5vZGUoKS5nZXROb2RlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcsJyk7Ci0JCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZShnZXRUYXJnZXQoKSkpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydENsYXNzTmFtZShPYmplY3QgbykgewotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY24gPSBvLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOwotCQkJcmV0dXJuIGNuLnN1YnN0cmluZyhpICsgMSwgY24ubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUHJpbnRzIG91dCBhIE1PRiBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlYnVnTU9GTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJU3RyaW5nIG5vdGlmVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJBREQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERF9NQU5ZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkVfTUFOWSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDogewotCQkJCQlpZiAobXNnLmdldFBvc2l0aW9uKCkgPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKQotCQkJCQkJbm90aWZUeXBlID0gIlJFUExBQ0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCW5vdGlmVHlwZSA9ICJTRVQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJVTlNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIk1PRiBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG5vdGlmaWVyICAgICAgOiAiICsgbXNnLmdldE5vdGlmaWVyKCkpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGNoYW5nZWRGZWF0dXJlOiAiICsgbXNnLmdldEZlYXR1cmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0b2xkVmFsdWUgICAgICA6ICIgKyBtc2cuZ2V0T2xkVmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bmV3VmFsdWUgICAgICA6ICIgKyBtc2cuZ2V0TmV3VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBmZWF0dXJlIG1hcHMgZm9yIHRoZSBhZGFwdGVyLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIGNoaWxkVHJhbnNsYXRvcnM7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgZmluZFRyYW5zbGF0b3IoTm90aWZpY2F0aW9uIG5vdCkgewotCQlpZiAobm90LmdldEZlYXR1cmUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXBzW2ldLmlzTWFwRm9yKG5vdC5nZXRGZWF0dXJlKCksIG5vdC5nZXRPbGRWYWx1ZSgpLCBub3QuZ2V0TmV3VmFsdWUoKSkpCi0JCQkJcmV0dXJuIG1hcHNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIExpc3QgbW9mQ2hpbGRyZW4sIExpc3QgZG9tQ2hpbGRyZW4sIE5vdGlmaWVyIG93bmVyKSB7Ci0KLQkJLy9Vc2VkIGZvciBpbnNlcnRpbmcgcHJpbWl0aXZlcwotCQlMaXN0IGlub3JkZXJET01DaGlsZHJlbiA9IG51bGw7Ci0JCWlmICghbWFwLmlzT2JqZWN0TWFwKCkgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCWlub3JkZXJET01DaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlub3JkZXJET01DaGlsZHJlbi5hZGRBbGwoZG9tQ2hpbGRyZW4pOwotCQl9Ci0JCU5vZGUgcGFyZW50ID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7Ci0KLQkJLy8gR28gdGhvdWdoIHRoZSBNT0YgY2hpbGRyZW4gY2hlY2tpbmcgdG8gc2VlIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0JCS8vIE1PRiBBZGFwdGVyIGNoaWxkcmVuIGV4aXN0cy4gSWYgbm90LCBjcmVhdGUgdGhlIGFkYXB0ZXIuCi0JCS8vIEFsc28gaGFuZGxlcyByZW9yZGVyaW5nIGNoaWxkcmVuIHRoYXQgaGF2ZSBtb3ZlZC4KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBtb2ZDaGlsZHJlbi5nZXQoaSk7Ci0JCQlFT2JqZWN0IG1vZkNoaWxkID0gbnVsbDsKLQotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0KLQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hpbGQgaXMgYSBNT0YgT2JqZWN0LgotCQkJaWYgKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQltb2ZDaGlsZCA9IChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSk7Ci0JCQkJYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihtb2ZDaGlsZCk7Ci0JCQl9Ci0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgPT0gYWRhcHRlci5nZXROb2RlKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKGRvbUNoaWxkcmVuLmlzRW1wdHkoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gQSBub2RlIGhhcyBiZWVuIHJlb3JkZXJlZCBpbiB0aGUgbGlzdAotCQkJCU5vZGUgcmVvcmRlck5vZGUgPSBhZGFwdGVyLmdldE5vZGUoKTsKLQkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSByZW9yZGVyTm9kZTsKLQkJCQlpZiAoaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgIT0gcmVvcmRlck5vZGUpIHsKLQkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IChOb2RlKSBkb21DaGlsZHJlbi5nZXQoaSk7Ci0JCQkJfQotCQkJCWRvbUNoaWxkcmVuLnJlbW92ZShyZW9yZGVyTm9kZSk7Ci0JCQkJZG9tQ2hpbGRyZW4uYWRkKGksIHJlb3JkZXJOb2RlKTsKLQkJCQlpZiAocmVvcmRlck5vZGUgIT0gaW5zZXJ0QmVmb3JlTm9kZSkgewotCQkJCQlyZW9yZGVyRE9NQ2hpbGQocGFyZW50LCByZW9yZGVyTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEEgbmV3IG5vZGUgaGFzIGJlZW4gYWRkZWQsIGNyZWF0ZSBpdAotCQkJCXBhcmVudCA9IGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCQlpZiAobW9mQ2hpbGQgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZDaGlsZCwgbWFwKTsKLQkJCQkJTm9kZSBuZXdOb2RlID0gYWRhcHRlci5nZXROb2RlKCk7Ci0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgZG9tQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJZG9tQ2hpbGRyZW4uYWRkKGksIG5ld05vZGUpOwotCQkJCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBhZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQl0cnkgewotCQkJCQkJaW5kZW50KG5ld05vZGUsIG1hcCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCQkJCX0KLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUaGUgbW9mIGZlYXR1cmUgaXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZXMuCi0JCQkJCS8vIGNyZWF0ZSBhIG5ldyBkb20gbm9kZSBhbmQgbGlzdGVuIHRvIGl0LgotCQkJCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG51bGwsIG1hcCk7Ci0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgaW5vcmRlckRPTUNoaWxkcmVuKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JCQkJCWluZGVudChuZXdOb2RlLCBtYXApOwotCQkJCQlhZGRET01BZGFwdGVyKG5ld05vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycwotCQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgbmV3Tm9kZSk7Ci0JCQkJCWlub3JkZXJET01DaGlsZHJlbi5hZGQobmV3Tm9kZSk7Ci0JCQkJCVRleHQgbmV3VGV4dCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGNoaWxkLCAoRU9iamVjdCkgb3duZXIpKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobmV3Tm9kZSwgbmV3VGV4dCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCi0JCWZvciAoOyBpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgKEVsZW1lbnQpIGRvbUNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gTU9GIGNoaWxkcmVuLCByZW1vdmUgYW55IHVubmVjZXNzYXJ5IERPTSBub2RlIHBhdGhzCi0JCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPT0gMCAmJiBtYXAuaGFzRE9NUGF0aCgpKSB7Ci0JCQlpZiAobWFwLnNob3VsZFJlbmRlckVtcHR5RE9NUGF0aCgoRU9iamVjdCkgb3duZXIpKQotCQkJCWNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBMaXN0IG1vZkNoaWxkcmVuLCBMaXN0IGRvbUNoaWxyZW4pIHsKLQotCQlIYXNodGFibGUgbm9kZVRvQWRhcHRlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlub2RlVG9BZGFwdGVyLnB1dChhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7Ci0JCX0KLQotCQkvLyBHbyB0aG91Z2ggdGhlIERPTSBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgotCQlpbnQgaSA9IDA7Ci0JCWludCBtb2ZJbmRleCA9IDA7Ci0JCUxpc3QgYWRhcHRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICg7IGkgPCBkb21DaGlscmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IGNoaWxkTm9kZSA9IChFbGVtZW50KSBkb21DaGlscmVuLmdldChpKTsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpID8gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpIDogbnVsbDsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgIWFkYXB0ZXIuaXNNT0ZQcm94eSgpICYmIGFkYXB0ZXIuZ2V0Tm9kZSgpID09IGNoaWxkTm9kZSkgewotCQkJCS8vIEJlY2F1c2UgdGhlIGFkYXB0ZXIgaXMgcHJvY2Vzc2luZyBTVFJVQ1RVUkVfQ0hBTkdFRCBmcm9tIHRoZQotCQkJCS8vIERPTSwgd2UKLQkJCQkvLyBtdXN0IHVwZGF0ZSBhbGwgdGhlIHdheSBkb3duIHRoZSB0cmVlIHNpbmNlIGFueXRoaW5nIHVuZGVyCi0JCQkJLy8gdGhlIG5vdGlmeWluZwotCQkJCS8vIERPTSBub2RlIGNvdWxkIGhhdmUgY2hhbmdlZC4KLQkJCQlhZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCW1vZkluZGV4Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIG5vZGVUb0FkYXB0ZXIuZ2V0KGNoaWxkTm9kZSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmVvcmRlcklmTmVjZXNzYXJ5KChFTGlzdCkgbW9mQ2hpbGRyZW4sIGFkYXB0ZXIuZ2V0RU9iamVjdCgpLCBtb2ZJbmRleCk7Ci0JCQkJbW9mSW5kZXgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoY2hpbGROb2RlLCBtYXApOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vV2UgZG9uJ3Qgd2FudCB0byBwdXNoIGFueXRoaW5nIGJhY2sgdG8gdGhlIGNoaWxkIGRvbQotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShnZXRUYXJnZXQoKSwgYWRhcHRlci5nZXRUYXJnZXQoKSwgbW9mSW5kZXgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJYWRhcHRlcnNUb1VwZGF0ZS5hZGQoYWRhcHRlcik7Ci0JCQkJCW1vZkluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCi0JCS8vbWFrZSBhIGNvcHkgc28gd2UgcmVtb3ZlIGFsbCBpdGVtcyAtIGJ1ZyAxOTI0NjggCi0JCQkJT2JqZWN0W10gY2hpbGRyZW5BcnJheSA9IG1vZkNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlmb3IgKDsgaSA8IGNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIGNoaWxkcmVuQXJyYXlbaV0sIG1hcCk7Ci0JCSAJCX0KLQotCQkvLyBUaGUgYWRhcHRlcnMgY2Fubm90IGJlIHVwZGF0ZWQgYXMgdGhleSBjcmVhdGVkLiBXZSBtdXN0IHdhaXQgdW50aWwKLQkJLy8gYWxsIG9mIHRoZSBhZGFwdGVycyBhcmUgY3JlYXRlZCBhbmQgcmVtb3ZlZCBiZWZvcmUgdXBkYXRpbmcsCi0JCS8vIG90aGVyd2lzZQotCQkvLyB3ZSBjYW4gZ2V0IGluIGEgc3RhdGUgd2hlcmUgdGhlcmUgYXJlIGFkYXB0ZXJzIGZpZ2h0aW5nIHdpdGgKLQkJLy8gZWFjaG90aGVyCi0JCS8vIChvbmUgZm9yIHRoZSBvbGQgbm9kZSBhbmQgb25lIGZvciB0aGUgbmV3IG5vZGUpLgotCQlmb3IgKGludCBqID0gMDsgaiA8IGFkYXB0ZXJzVG9VcGRhdGUuc2l6ZSgpOyBqKyspIHsKLQkJCSgoRU1GMkRPTUFkYXB0ZXIpIGFkYXB0ZXJzVG9VcGRhdGUuZ2V0KGopKS51cGRhdGVNT0YoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmZWF0dXJlJ3MgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNoaWxkQWRhcHRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5FTUYyRE9NQWRhcHRlciBUaGUgY2hpbGQgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vZkF0dHJpYnV0ZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgbW9mQXR0cmlidXRlIHRvIHJlbW92ZSB0aGUgY2hpbGQgZnJvbS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNT0ZWYWx1ZShFT2JqZWN0IHZhbHVlLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYgKHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoYWRhcHRlci5nZXROb2RlKCkpID09IG51bGwpIAotCQkJCXJldHVybjsKLQkJCS8vIFJlbW92ZSB0aGUgYWRhcHRlciBmcm9tIEJPVEggdGhlIE1PRiBPYmplY3QgYW5kIHRoZSBET00gTm9kZXMKLQkJCXZhbHVlLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQkJCXJlbW92ZUFkYXB0ZXJzKGFkYXB0ZXIuZ2V0Tm9kZSgpKTsKLQkJfQotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gdHJhbnNsYXRvci5nZXRGZWF0dXJlKCk7Ci0JCWJvb2xlYW4gZG9VbmxvYWQgPSBmZWF0dXJlID09IG51bGwgfHwgKHRyYW5zbGF0b3IuaXNPYmplY3RNYXAoKSAmJiAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSk7Ci0KLQkJLy8gdHJhbnNsYXRvci5yZW1vdmVNT0ZWYWx1ZSgpIHdhcyBoZXJlIG9yaWdpbmFsbHkKLQotCQkvLyBVbmxvYWQgdGhlIG9iamVjdHMuCi0JCWlmIChkb1VubG9hZCkKLQkJCUV4dGVuZGVkRWNvcmVVdGlsLnVubG9hZCh2YWx1ZSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBNT0YgdmFsdWUKLQkJdHJhbnNsYXRvci5yZW1vdmVNT0ZWYWx1ZShnZXRUYXJnZXQoKSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlb3JkZXJJZk5lY2Vzc2FyeShFTGlzdCBlbWZDaGlsZHJlbiwgRU9iamVjdCBlT2JqLCBpbnQgZW1mSW5kZXgpIHsKLQkJaW50IGN1cnJJbmRleCA9IGVtZkNoaWxkcmVuLmluZGV4T2YoZU9iaik7Ci0JCWlmIChjdXJySW5kZXggPiAtMSAmJiBjdXJySW5kZXggIT0gZW1mSW5kZXgpCi0JCQllbWZDaGlsZHJlbi5tb3ZlKGVtZkluZGV4LCBlT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmc7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50KE5vZGUgbmV3Tm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQotCX0KLQotCXByb3RlY3RlZCBOb2RlIGZpbmRJbnNlcnRCZWZvcmVOb2RlKE5vZGUgcGFyZW50Tm9kZSwgVHJhbnNsYXRvciBtYXAsIExpc3QgbW9mTGlzdCwgaW50IG1vZklueCwgTGlzdCBkb21MaXN0KSB7Ci0JCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IG51bGw7Ci0KLQkJLy8gSWYgdGhlcmUgYXJlIG5vIGN1cnJlbnQgZG9tIGNoaWxkcmVuIGZvciB0aGlzIG1hcCwgZmluZCB0aGUgaW5pdGlhbAotCQkvLyBpbnNlcnQgcG9zLgotCQlpZiAoZG9tTGlzdC5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBmaW5kSW5pdGlhbEluc2VydEJlZm9yZU5vZGUocGFyZW50Tm9kZSwgbWFwKTsKLQotCQkvLyBJZiBzb21lIGRvbSBub2RlcyB0aGVuIGZpbmQgdGhlIGNvcnJlY3Qgb25lIHRvIGluc2VydCBiZWZvcmUuCi0JCWludCBpID0gbW9mSW54ICsgMTsKLQkJd2hpbGUgKGkgPCBtb2ZMaXN0LnNpemUoKSAmJiBpbnNlcnRCZWZvcmVOb2RlID09IG51bGwpIHsKLQkJCS8vIFN0YXJ0IGF0IHRoZSBtb2ZJbnggcGFzc2VkIGluIGFuZCBsb29rIGZvcndhcmQgZm9yIHRoZSBmaXJzdAotCQkJLy8gYWRhcHRlZAotCQkJLy8gTU9GIG9iamVjdC4gVXNlIHRoYXQgbm9kZSBhcyB0aGUgaW5zZXJ0IGJlZm9yZSBub2RlLgotCQkJT2JqZWN0IG8gPSBtb2ZMaXN0LmdldChpKTsKLQkJCWlmICghbWFwLmlzT2JqZWN0TWFwKCkgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpCi0JCQkJYnJlYWs7Ci0JCQlFT2JqZWN0IHRNT0ZPYmplY3QgPSAoRU9iamVjdCkgbzsKLQkJCUVNRjJET01BZGFwdGVyIHRBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHRNT0ZPYmplY3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQkJaWYgKHRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlpbnNlcnRCZWZvcmVOb2RlID0gdEFkYXB0ZXIuZ2V0Tm9kZSgpOwotCQkJfQotCQkJaSsrOwotCQl9Ci0KLQkJLy8gSGFuZGxlIGluc2VydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCWlmIChpbnNlcnRCZWZvcmVOb2RlID09IG51bGwpCi0JCQlpbnNlcnRCZWZvcmVOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5leHROb2RlU2libGluZygoTm9kZSkgZG9tTGlzdC5nZXQoZG9tTGlzdC5zaXplKCkgLSAxKSk7Ci0JCWlmIChpbnNlcnRCZWZvcmVOb2RlID09IG51bGwpCi0JCQlpbnNlcnRCZWZvcmVOb2RlID0gKChOb2RlKSBkb21MaXN0LmdldChkb21MaXN0LnNpemUoKSAtIDEpKS5nZXROZXh0U2libGluZygpOwotCi0JCXJldHVybiBpbnNlcnRCZWZvcmVOb2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudE5vZGUsIFRyYW5zbGF0b3IgbWFwTm9kZSkgewotCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQotCQkvLyBGaXJzdCwgc2tpcCBwYXN0IGFsbCB0aGUgbWFwcyBpbiB0aGUgb3JkZXJlZCBjb2xsZWN0aW9uCi0JCS8vIG9mIG1hcHMuIFdlIHdhbnQgdG8gYmVnaW4gdGhlIHNlYXJjaCB3aXRoIHRoaXMgbm9kZS4KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXBzW2ldID09IG1hcE5vZGUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBOb3cgc2VhcmNoIGdvIHRocm91Z2ggZWFjaCBtYXAgbm9kZSB1bnRpbCBhIGNoaWxkIG5vZGUgbWF0Y2hpbmcKLQkJLy8gaXRzIERPTSBuYW1lIGlzIGZvdW5kLgotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCQlmb3IgKGludCBqID0gaTsgaiA8IG1hcHMubGVuZ3RoICYmIGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbDsgaisrKSB7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlUcmFuc2xhdG9yIG5vZGVUb0ZpbmRNYXAgPSBtYXBzW2pdOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oayk7Ci0JCQkJaWYgKG5vZGVUb0ZpbmRNYXAuaXNNYXBGb3Iobm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQlpbnNlcnRCZWZvcmVOb2RlID0gbm9kZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnNlcnRCZWZvcmVOb2RlOwotCX0KLQotCS8qCi0JICogVHJhdmVyc2VzIHRoZSBwYXRoIHRoYXQgPG1hcD4gc3BlY2lmaWVzLiBSZXR1cm5zIHRoZSBsYXN0IG5vZGUgb2YgdGhlIHBhdGggdGhhdCB3YXMgYWJsZSB0bwotCSAqIGJlIHRyYXZlcnNlZCBvciBudWxsIGlmIHRoZSBwYXRoIGNvdWxkIG5vdCBiZSB0cmF2ZXJzZWQuIFRoZSA8YWRkQWRhcHRlcnM+IGJvb2xlYW4gaXMgdXNlZCB0bwotCSAqIGRldGVybWluZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYWRkZWQgYXMgYW4gYWRhcHRlciB0byBldmVyeSBub2RlIGZvdW5kIG9uIHRoZSBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmRET01QYXRoKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgYm9vbGVhbiBhZGRBZGFwdGVycykgewotCi0JCVN0cmluZyBwYXRoID0gbWFwLmdldERPTVBhdGgoKTsKLQkJTm9kZSBjdXJOb2RlID0gcGFyZW50OwotCQlJdGVyYXRvciBpdGVyID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihwYXRoKTsKLQotCQl3aGlsZSAoY3VyTm9kZSAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWN1ck5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGN1ck5vZGUsIG5vZGVOYW1lKTsKLQkJCWlmIChhZGRBZGFwdGVycyAmJiBjdXJOb2RlICE9IG51bGwpIHsKLQkJCQlhZGRET01BZGFwdGVyKGN1ck5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjdXJOb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBET00gbm9kZSBjaGlsZHJlbiB0aGF0IGN1cnJlbnRseSBleGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRET01DaGlsZHJlbihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCU5vZGUgcGFyZW50ID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCB0cnVlKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGRyZW4ocGFyZW50LCBtYXAuZ2V0RE9NTmFtZXMoKSk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IHJlZk9iamVjdCkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJlZk9iamVjdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKLQkJCXJlZk9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlyZW1vdmVET01BZGFwdGVyKGFkYXB0ZXIuZ2V0Tm9kZSgpLCBhZGFwdGVyKTsKLQkJCWFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGRET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQlmUmVuZGVyZXIucmVnaXN0ZXJET01BZGFwdGVyKGFOb2RlLCBhbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKE5vZGUgYU5vZGUpIHsKLQkJcmV0dXJuIGZSZW5kZXJlci5nZXRFeGlzdGluZ0RPTUFkYXB0ZXIoYU5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCWZSZW5kZXJlci5yZW1vdmVET01BZGFwdGVyKGFOb2RlLCBhbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERPTUFkYXB0ZXIoTm9kZSBjaGlsZE5vZGUpIHsKLQotCQkvLyBPbmx5IGFkZCB0aGUgYWRhcHRlciBpZiB0aGlzIGlzIGFuIGNoaWxkIG5vZGUgdGhhdCB3aWxsIG5vdCBiZQotCQkvLyBhZGFwdGVkLiBGb3IgaW5zdGFuY2UgYSBzdWJ0cmVlIHRoYXQgbWFwcyB0byBhIE1PRiBhdHRyaWJ1dGUKLQkJLy8gc2V0dGluZy4KLQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhdHRyQWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoY2hpbGROb2RlKTsKLQotCQkJaWYgKGF0dHJBZGFwdGVyID09IG51bGwgfHwgYXR0ckFkYXB0ZXIuZ2V0Tm9kZSgpICE9IGdldE5vZGUoKSkgewotCQkJCS8vIElmIHRoZSBub2RlIGlzIGFkYXB0ZWQsIGJ1dCBub3QgYnkgdGhpcyBhZGFwdGVyIHRoZW4gcmVtb3ZlCi0JCQkJLy8gaXQuIFRoaXMgaGFwcGVucyB0byBub24tb2JqZWN0IGNoaWxkcmVuIHdoZW4gdGhlIHBhcmVudCB0YWcKLQkJCQkvLyBuYW1lIGlzIGNoYW5nZWQuCi0JCQkJcmVtb3ZlRE9NQWRhcHRlcihjaGlsZE5vZGUsIGF0dHJBZGFwdGVyKTsKLQotCQkJCWlmIChmRGVidWcpIHsKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRDSElMRDogQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRcdHRvOiAiICsgY2hpbGROb2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcmltQWRkRE9NQWRhcHRlcihjaGlsZE5vZGUsIHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVvcmRlciBhIGNoaWxkIGJlZm9yZSBhIGdpdmVuIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVyRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgTm9kZSBpbnNlcnRCZWZvcmVOb2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQl0cnkgewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3bGluZVN0cmluZyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBET01VdGlsaXRpZXMuZ2V0SW5kZW50U3RyaW5nKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoaWxkIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlKSB7Ci0JCXJlbW92ZURPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY2hpbGQgbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIGJvb2xlYW4gcmVtb3ZlQWRhcHRlcikgewotCQl0cnkgewotCQkJaWYgKGNoaWxkTm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vIExvb2sgZm9yIGFueSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcgdGhlIG5vZGUgYmVpbmcKLQkJCS8vIHJlbW92ZWQgYW5kIHJlbW92ZSBpdCBhcyB3ZWxsLgotCQkJVGV4dCBwcmV2VGV4dCA9IERPTVV0aWxpdGllcy5nZXRQcmV2aW91c1RleHRTaWJsaW5nKGNoaWxkTm9kZSk7Ci0JCQlpZiAocHJldlRleHQgIT0gbnVsbCAmJiBET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKHByZXZUZXh0KSkgewotCQkJCXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJldlRleHQpOwotCQkJfQotCQkJLy8gUmVtb3ZlIHRoZSBub2RlLgotCQkJaWYgKHJlbW92ZUFkYXB0ZXIpCi0JCQkJcmVtb3ZlQWRhcHRlcnMoY2hpbGROb2RlKTsKLQkJCXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBET00gYWRhcHRlcnMgZnJvbSB0aGUgbm9kZSBBTkQgYWxsIGl0cyBjaGlsZCBub2RlcywgcmVjdXJzaXZlbHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcnMoTm9kZSBub2RlKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBPYmplY3QuCi0JCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJaWYgKGFkYXB0ZXIuZ2V0Tm9kZSgpID09IG5vZGUpIHsKLQkJCQlOb3RpZmllciBsb2NhbFRhcmdldCA9IGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGxvY2FsVGFyZ2V0ICE9IG51bGwpCi0JCQkJCWxvY2FsVGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQkJCX0KLQkJfQotCi0JCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gbmwuaXRlbShpKTsKLQkJCXJlbW92ZUFkYXB0ZXJzKG4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgPG1hcD51bmRlciA8bm9kZT4uIE9ubHkgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggdGhhdCBkb2VzIG5vdAotCSAqIGV4aXN0IChpZiBhbnkpIGlzIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVBhdGgoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlJdGVyYXRvciBpID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihtYXAuZ2V0RE9NUGF0aCgpKTsKLQkJTm9kZSBjdXJOb2RlID0gbm9kZTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWN1ck5vZGUgPSBmaW5kT3JDcmVhdGVOb2RlKG5vZGUsIG1hcCwgbm9kZU5hbWUpOwotCQl9Ci0JCXJldHVybiBjdXJOb2RlOwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IGZpbmRPckNyZWF0ZU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgc2VnbWVudCkgewotCQlOb2RlIG5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKHBhcmVudCwgc2VnbWVudCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCS8vIFRoZSBub2RlIGRpZCBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgotCQkJRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChzZWdtZW50KTsKLQkJCWlmIChtYXAuaXNFbXB0eVRhZygpKQotCQkJCXNldEVtcHR5VGFnKChFbGVtZW50KSBub2RlKTsKLQotCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwKTsKLQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQkJaW5kZW50KG5vZGUsIG1hcCk7Ci0JCQlhZGRET01BZGFwdGVyKG5vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycwotCQl9Ci0JCXJldHVybiAoRWxlbWVudCkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5vZGUgcGFzc2VkIGluIGlmIGl0IGhhcyBvbmx5IHdoaXRlc3BhY2Ugbm9kZXMgYXMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlmRW1wdHkoTm9kZSBub2RlKSB7Ci0JCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBub2RlcyBjaGlsZHJlbi4gSWYgYSBub24td2hpdGVzcGFjZSBub2RlCi0JCS8vIHBpcyBmb3VuZCwgYmFpbC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoIURPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UoY2hpbGROb2RlKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGFyZSBubyBub24td2hpdGVzcGFjZSBjaGFycywgc28KLQkJLy8gc2ltcGx5IHJlbW92ZSB0aGUgbm9kZS4KLQkJcmVtb3ZlRE9NQ2hpbGQobm9kZS5nZXRQYXJlbnROb2RlKCksIG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+ZnJvbSA8bm9kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJTm9kZSBjaGlsZE5vZGUgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKLQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsICYmIGNoaWxkTm9kZSAhPSBub2RlKSB7Ci0JCQlyZW1vdmVJZkVtcHR5KGNoaWxkTm9kZSk7Ci0JCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCS8vCUFzc2VydC5pc05vdE51bGwoY2hpbGRNYXAuZ2V0Q2hpbGRBZGFwdGVyQ2xhc3MoKSk7Ci0JCUFzc2VydC5pc05vdE51bGwobW9mT2JqZWN0KTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihtb2ZPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKLQkJCW1vZk9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlyZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJRWxlbWVudCBuZXdOb2RlID0gY3JlYXRlTmV3Tm9kZShtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobW9mT2JqZWN0LCBuZXdOb2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01BZGFwdGVySW1wbChub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzTU9GUHJveHkoKSB8fCBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJCWlmIChhZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJfQotCQkJCWFkYXB0ZXIgPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG5vZGUsIGNoaWxkTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVOZXdOb2RlKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJRG9jdW1lbnQgZG9jID0gKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChjaGlsZE1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCQlpZiAoY2hpbGRNYXAuaXNFbXB0eVRhZygpKQotCQkJc2V0RW1wdHlUYWcoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW1wdHlUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJldmlzaXQudG9EbygpOwotCQkvL05lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gdGhpcyB3aXRoIHB1cmUgRE9NIGFwaXMsIGlmIGl0IGlzCi0JCS8vIHBvc3NpYmxlCi0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBNT0Ygb2JqZWN0IGlzIGEgcHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNT0ZQcm94eSgpIHsKLQkJaWYgKGlzUm9vdCB8fCB0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQpLmVJc1Byb3h5KCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJaWYgKGlzUm9vdCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERPTSBub2RlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGFkYXB0ZXIgbWFwcyB0by4gSWYgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IG1hcHMgdG8KLQkgKiBtb3JlIHRoYW4gb25lIERPTSBub2RlLCB0aGlzIG5vZGUgaXMgdGhlIHRvcC1tb3N0IG5vZGUuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBhTm9kZSkgewotCQlmTm9kZSA9IGFOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTSgpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJcHJpbVVwZGF0ZURPTSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRigpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJcHJpbVVwZGF0ZU1PRigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET00oKSB7Ci0JCWlmIChpc1Jvb3QpCi0JCQl1cGRhdGVET01Sb290RmVhdHVyZSgpOwotCQllbHNlIHsKLQkJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdXBkYXRlRE9NRmVhdHVyZShtYXBzW2ldLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltVXBkYXRlTU9GKCkgewotCQlpZiAoaXNSb290KQotCQkJdXBkYXRlTU9GUm9vdEZlYXR1cmUoKTsKLQkJZWxzZSB7Ci0JCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCXVwZGF0ZU1PRkZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NUm9vdEZlYXR1cmUoKSB7Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpLCBudWxsKTsKLQkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRlJvb3RGZWF0dXJlKCkgewotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJdXBkYXRlTU9GRG9jdW1lbnRUeXBlKCk7Ci0JCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJcmV0dXJuICgoRG9jdW1lbnQpIGZOb2RlKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUcmFuc2xhdG9yUmVzb3VyY2UpIGdldFRhcmdldCgpOwotCX0KLQotCXByb3RlY3RlZCBFTGlzdCBnZXRSZXNvdXJjZUNvbnRlbnRzKCkgewotCQlpZiAoIWlzUm9vdCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuICgoUmVzb3VyY2UpIGdldFRhcmdldCgpKS5nZXRDb250ZW50cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTURvY3VtZW50VHlwZSgpIHsKLQotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGwsIG9sZFB1YmxpY0lkLCBvbGRTeXN0ZW1JZDsKLQkJb2xkUHVibGljSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQlvbGRTeXN0ZW1JZCA9IGRvY1R5cGUgPT0gbnVsbCA/IG51bGwgOiBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCVRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlwdWJsaWNJZCA9IHJlc291cmNlLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9IHJlc291cmNlLmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJaWYgKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIG9sZFB1YmxpY0lkKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChzeXN0ZW1JZCwgb2xkU3lzdGVtSWQpKSkKLQkJCWZSZW5kZXJlci5yZXBsYWNlRG9jdW1lbnRUeXBlKHJlc291cmNlLmdldERvY3R5cGUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBUcmFuc2xhdG9yUmVzb3VyY2UuRE9DX1RZUEVfRkVBVFVSRSkKLQkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpIHsKLQotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGw7Ci0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0KLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlpZiAoKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIHJlc291cmNlLmdldFB1YmxpY0lkKCkpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkpIHx8IAotCQkJCSgocmVzb3VyY2UuZ2V0UHVibGljSWQoKSA9PSBudWxsKSB8fCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpKQotCQkJcmVzb3VyY2Uuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JCWlmIChpc1Jvb3QpIHsKLQkJCW5vdGlmeUNoYW5nZWRGb3JSb290KG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGlzRGVwZW5kZW5jeUZlYXR1cmUobXNnKSkKLQkJCWhhbmRsZURlcGVuZGVuY3lGZWF0dXJlKG1zZyk7Ci0KLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlkZWJ1Z01PRk5vdGlmeShtc2cpOwotCi0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKLQkJCQlUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBmaW5kVHJhbnNsYXRvcihtc2cpOwotCQkJCWlmICh0cmFuc2xhdG9yID09IG51bGwpCi0JCQkJCXRyYW5zbGF0b3IgPSBhZGRWYXJpYWJsZVRyYW5zbGF0b3JJZk5lY2Vzc2FyeShtc2cpOwotCQkJCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCi0JCQkJCXVwZGF0ZURPTUZlYXR1cmUodHJhbnNsYXRvciwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclJvb3QoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnTU9GTm90aWZ5KG1zZyk7Ci0KLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJCXByaW1VcGRhdGVET00oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQkJdXBkYXRlRE9NRG9jdW1lbnRUeXBlKG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV0b29sc0NvcHlTZXNzaW9uLlJFU09VUkNFX0NPUElFRCA6Ci0JCQkJdXBkYXRlRE9NKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbmN5QWRhcHRlcihFT2JqZWN0IGNoaWxkKSB7Ci0JCUFkYXB0ZXIgZXhpc3RpbmcgPSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkLCBEZXBlbmRlbmN5QWRhcHRlci5LRVkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRGVwZW5kZW5jeUFkYXB0ZXIgZm9yd2FyZGVyID0gbmV3IERlcGVuZGVuY3lBZGFwdGVyKCk7Ci0JCWNoaWxkLmVBZGFwdGVycygpLmFkZChmb3J3YXJkZXIpOwotCQlmb3J3YXJkZXIuc2V0VGFyZ2V0KGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKCkgewotCi0JCXByaW1BZGRET01BZGFwdGVyKGZOb2RlLCB0aGlzKTsKLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0dG86ICIgKyBmTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEdvIHRocm91Z2ggdGhlIG1hcHMuIEFsbCBvZiB0aGUgRE9NIG5vZGVzIHRoYXQgYXJlIG5vdCBsaXN0ZW5lZAotCQkvLyB0byBieSBhbm90aGVyIERPTSBOb2RlIGFkYXB0ZXIsIG11c3QgYmUgbGlzdGVuZWQgdG8gYnkgdGhpcyBhZGFwdGVyLgotCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gZk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaik7Ci0JCQlpbnQgbm9kZVR5cGUgPSBjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICghRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUoY2hpbGROb2RlKSAmJiBub2RlVHlwZSAhPSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hpbGROb2RlLmdldE5vZGVOYW1lKCksIGZhbHNlKTsKLQkJCQlpZiAobWFwICE9IG51bGwgJiYgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpCi0JCQkJCWFkZERPTUFkYXB0ZXIoY2hpbGROb2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGFkZFZhcmlhYmxlVHJhbnNsYXRvcklmTmVjZXNzYXJ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0ID0gZlRyYW5zbGF0b3IuZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOwotCQlUcmFuc2xhdG9yIHRyYW5zID0gbnVsbDsKLQkJaWYgKGZhY3QgIT0gbnVsbCAmJiBmYWN0LmFjY2VwdHMobXNnKSkgewotCQkJdHJhbnMgPSBmYWN0LmNyZWF0ZShtc2cpOwotCQkJaWYgKHRyYW5zICE9IG51bGwpCi0JCQkJY2hpbGRUcmFuc2xhdG9ycyA9IChUcmFuc2xhdG9yW10pIFRyYW5zbGF0b3IuY29uY2F0KGNoaWxkVHJhbnNsYXRvcnMsIHRyYW5zKTsKLQkJfQotCQlyZXR1cm4gdHJhbnM7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dE5vZGUoRG9jdW1lbnQgZG9jLCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIG5vbm51bGx0ZXh0ID0gKHRleHQgIT0gbnVsbCkgPyB0ZXh0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1hcC5pc0NEQVRBQ29udGVudCgpID8gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihub25udWxsdGV4dCkgOiBkb2MuY3JlYXRlVGV4dE5vZGUobm9ubnVsbHRleHQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFJlYWRBaGVhZE5hbWUoKSB7Ci0JCWlmICghZlRyYW5zbGF0b3IuaGFzUmVhZEFoZWFkTmFtZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVhZEFoZWFkTmFtZSA9IG51bGw7Ci0KLQkJUmVhZEFoZWFkSGVscGVyIGhlbHBlciA9IGZUcmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihmTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBjaGlsZCA9IG51bGw7Ci0JCVN0cmluZ1tdIG5hbWVzID0gaGVscGVyLmdldFZhbHVlcygpOwotCQlpZiAoaGVscGVyLmdldENoaWxkRE9NTmFtZSgpID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljaGlsZCA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoZk5vZGUsIG5hbWVzW2ldKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlyZWFkQWhlYWROYW1lID0gbmFtZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNoaWxkID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChmTm9kZSwgaGVscGVyLmdldENoaWxkRE9NTmFtZSgpKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCXJlYWRBaGVhZE5hbWUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0KGNoaWxkKTsKLQkJfQotCQlpZiAocmVhZEFoZWFkTmFtZSA9PSBudWxsKQotCQkJcmVhZEFoZWFkTmFtZSA9IG5hbWVzWzBdOwotCQlyZXR1cm4gcmVhZEFoZWFkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgdGV4dCBmcm9tIDxub2RlPmFuZCBjb252ZXJ0cyBpdCB0byBhbiBvYmplY3Qgc3VpdGFibGUgZm9yIHNldHRpbmcgaW50byA8ZmVhdHVyZT4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGV4dHJhY3RWYWx1ZShOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwLCBFT2JqZWN0IGVtZk9iamVjdCkgewotCi0JCS8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIHRleHQgY2hpbGQKLQkJTm9kZSB0ZXh0Tm9kZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHROb2RlKG5vZGUpOwotCQlTdHJpbmcgdHJpbW1lZFZhbHVlID0gbnVsbDsKLQkJaWYgKHRleHROb2RlICE9IG51bGwpCi0JCQl0cmltbWVkVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYXAuY29udmVydFN0cmluZ1RvVmFsdWUodHJpbW1lZFZhbHVlLCBlbWZPYmplY3QpOwotCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCWhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJdGhyb3cgZXg7Ci0KLQl9Ci0KLQkvKgotCSAqIEZpbmRzIHRoZSBjaGlsZCBub2RlIHRoYXQgPG1hcD4gc3BlY2lmaWVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoaWxkIHRoYXQgc2F0aXNmaWVzCi0JICogPG1hcD4gdGhlbiB0aGUgZmlyc3Qgb25lIGlzIHJldHVybmVkLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHRyYXZlcnNlcyBwYXN0IHRoZSBkb21QYXRoIGlmIG9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmRET01Ob2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCkgewotCQlyZXR1cm4gZmluZERPTU5vZGUocGFyZW50LCBtYXAsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEZpbmRzIHRoZSBjaGlsZCBub2RlIHRoYXQgPG1hcD4gc3BlY2lmaWVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoaWxkIHRoYXQgc2F0aXNmaWVzCi0JICogPG1hcD4gdGhlbiB0aGUgZmlyc3Qgb25lIGlzIHJldHVybmVkLiBUaGUgPGFkZEFkYXB0ZXJzPiBib29sZWFuIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZQotCSAqIHJlY2VpdmVyIGlzIGFkZGVkIGFzIGFuIGFkYXB0ZXIgdG8gZXZlcnkgbm9kZSBmb3VuZCBvbiB0aGUgcGF0aC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB0cmF2ZXJzZXMgcGFzdCB0aGUgZG9tUGF0aCBpZiBvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSA8bWFwPi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NTm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIGJvb2xlYW4gYWRkQWRhcHRlcnMpIHsKLQotCQkvLyBGaXJzdCwgdHJhY2UgZG93biB0aGUgcGF0aAotCQlOb2RlIGN1ck5vZGUgPSBmaW5kRE9NUGF0aChwYXJlbnQsIG1hcCwgYWRkQWRhcHRlcnMpOwotCQlpZiAobWFwLmlzRE9NVGV4dFZhbHVlKCkgfHwgbWFwLmlzRE9NQXR0cmlidXRlKCkgfHwgY3VyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGN1ck5vZGU7Ci0KLQkJLy8gTm93IGxvb2sgZm9yIHRoZSBmaXJzdCBET00gbmFtZSB3ZSBjYW4gZmluZAotCQlTdHJpbmdbXSBkb21OYW1lcyA9IG1hcC5nZXRET01OYW1lcygpOwotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBkb21OYW1lc1tpXTsKLQkJCUxpc3Qgbm9kZXMgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkcmVuKGN1ck5vZGUsIG5vZGVOYW1lKTsKLQkJCWlmIChub2RlcyAhPSBudWxsICYmICFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlpZiAobm9kZXMuc2l6ZSgpID4gMSkKLQkJCQkJaGFuZGxlSW52YWxpZE11bHRpTm9kZXMobm9kZU5hbWUpOwotCQkJCW5vZGUgPSAoTm9kZSkgbm9kZXMuZ2V0KDApOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKGFkZEFkYXB0ZXJzICYmIChtYXAgIT0gbnVsbCB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkpCi0JCQkJCQlhZGRET01BZGFwdGVyKGN1ck5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wLCBuZXcgT2JqZWN0W117bm9kZU5hbWV9KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgPG1hcD51bmRlciA8bm9kZT4uIE9ubHkgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggdGhhdCBkb2VzIG5vdAotCSAqIGV4aXN0IChpZiBhbnkpIGlzIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCBUZXh0IGZpbmRPckNyZWF0ZVRleHROb2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHRleHQpIHsKLQkJVGV4dCB0ZXh0Tm9kZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHROb2RlKHBhcmVudCk7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQl0ZXh0Tm9kZS5zZXREYXRhKHRleHQpOwotCQl9IGVsc2UgewotCQkJaWYgKCFpc0VtcHR5VGFnKChFbGVtZW50KSBwYXJlbnQpKSB7Ci0JCQkJVGV4dCBuZXdOb2RlID0gY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSwgbWFwLCB0ZXh0KTsKLQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIG51bGwpOwotCQkJCXJldHVybiBuZXdOb2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmaW5kVHJhbnNsYXRvcihTdHJpbmcgdGFnTmFtZSwgYm9vbGVhbiBhdHRyaWJ1dGVNYXApIHsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvciBtYXAgPSBtYXBzW2ldOwotCQkJaWYgKG1hcC5pc01hcEZvcih0YWdOYW1lKSAmJiBhdHRyaWJ1dGVNYXAgPT0gbWFwLmlzRE9NQXR0cmlidXRlKCkpCi0JCQkJcmV0dXJuIG1hcHNbaV07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE5vZGUgYU5vZGUpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoYU5vZGUpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZW1vdmVET01BZGFwdGVyKGFOb2RlLCBhZGFwdGVyKTsKLQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVwZW5kZW5jeUZlYXR1cmUoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgIT0gbnVsbCkKLQkJCXJlbW92ZURlcGVuZGVuY3lBZGFwdGVyKChFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCWlmIChtc2cuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKQotCQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXIoKEVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlcGVuZGVuY3lGZWF0dXJlKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQkJcmV0dXJuIGZUcmFuc2xhdG9yLmlzRGVwZW5kZW5jeVBhcmVudCgpICYmIGZUcmFuc2xhdG9yLmdldERlcGVuZGVuY3lGZWF0dXJlKCkgPT0gbXNnLmdldEZlYXR1cmUoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHlUYWcoRWxlbWVudCBwYXJlbnQpIHsKLQkJUmV2aXNpdC50b0RvKCk7Ci0JCS8vRGV0ZXJtaW5lIGhvdyB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHB1cmUgRE9NIGFwaXMsIGlmIHBvc3NpYmxlLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlPYmplY3QgYXR0clZhbHVlID0gbnVsbDsKLQkJYm9vbGVhbiBpc1NldCA9IGZhbHNlOwotCQlpZiAobWFwLmlzSURNYXAoKSkgewotCQkJdHJ5IHsKLQkJCQlhdHRyVmFsdWUgPSBtYXAuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCX0gY2F0Y2ggKElEVHJhbnNsYXRvci5Ob1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVzb3VyY2UsCi0JCQkJLy9ObyBuZWVkIHRvIHVwZGF0ZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlzU2V0ID0gYXR0clZhbHVlICE9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyVmFsdWUgPSBtYXAuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCWlzU2V0ID0gbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJfQotCi0JCWlmIChtYXAuaXNET01BdHRyaWJ1dGUoKSkgewotCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IG1hcHMgdG8gYW4gYXR0cmlidXRlIG9mIHRoZQotCQkJLy8gRE9NIG5vZGUuIEdldCB0aGUgdmFsdWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgYW5kIHNldCBpdAotCQkJLy8gaW50byBET00gbm9kZS4KLQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KSBjcmVhdGVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgaXNTZXQpCi0JCQkJZS5zZXRBdHRyaWJ1dGUobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSwgbWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGF0dHJWYWx1ZSwgbW9mT2JqZWN0KSk7Ci0JCQllbHNlCi0JCQkJZS5yZW1vdmVBdHRyaWJ1dGUobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVET01TdWJ0cmVlKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCBhdHRyVmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlua1VwZGF0ZXJUYXJnZXQuSU5TVEFOQ0UudXBkYXRlRE9NKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCi0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBtYXAuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQkJTGlzdCBkb21DaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0KLQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZkNoaWxkcmVuLCBkb21DaGlsZHJlbiwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltVXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIW1hcC5mZWF0dXJlRXhpc3RzKG1vZk9iamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU9iamVjdCBkb21WYWx1ZSA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlTU9GQXR0QWRhcHRlciA9IGZhbHNlOwotCQlib29sZWFuIGlzVW5zZXQgPSBmYWxzZTsKLQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBudWxsOwotCi0JCU5vZGUgY2hpbGQgPSBmaW5kRE9NTm9kZShub2RlLCBtYXAsIHRydWUpOwotCi0JCWlmIChtYXAuaXNET01BdHRyaWJ1dGUoKSAmJiBjaGlsZCAhPSBudWxsKSB7Ci0JCQkvLyBBbiBhdHRyaWJ1dGUgb2YgdGhlIE1PRiBvYmplY3QgbWFwcyB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi0JCQkvLyBET00gbm9kZS4gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgRE9NIGF0dHJpYnV0ZSBhbmQgc2V0IGl0Ci0JCQkvLyBpbnRvIHRoZSBNT0Ygb2JqZWN0LgotCi0JCQlBdHRyIGRvbUF0dHIgPSAoQXR0cikgY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJCWlmIChkb21BdHRyICE9IG51bGwpIHsKLQkJCQlkb21WYWx1ZSA9IGRvbUF0dHIuZ2V0VmFsdWUoKTsKLQkJCQlkb21WYWx1ZSA9IG1hcC5jb252ZXJ0U3RyaW5nVG9WYWx1ZSgoU3RyaW5nKSBkb21WYWx1ZSwgbW9mT2JqZWN0KTsKLQkJCX0gZWxzZQotCQkJCWlzVW5zZXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IGlzIGFjdHVhbGx5IGEgc3ViLWVsZW1lbnQKLQkJCS8vIG9mIHRoZSBET00gbm9kZS4gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3ViLWVsZW1lbnQgd2l0aAotCQkJLy8gdGhlIGNvcnJlY3QgbmFtZSB0byB1c2UgYXMgYW4gYXR0cmlidXRlLgotCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZWQgYXR0cmlidXRlIHRoYXQgaGFzCi0JCQkJLy8gYSBNT0Ygb2JqZWN0IGFzIGl0cyB2YWx1ZQotCQkJCWlmICghbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkJYXR0ckFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKGNoaWxkLCBtYXApOwotCQkJCQl1cGRhdGVNT0ZBdHRBZGFwdGVyID0gdHJ1ZTsKLQkJCQkJZG9tVmFsdWUgPSBhdHRyQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNoaWxkIGlzIGFkYXB0ZWQuIElmIG5vdCwgYWRhcHQKLQkJCQkJLy8gaXQuCi0JCQkJCWFkZERPTUFkYXB0ZXIoY2hpbGQpOwotCi0JCQkJCS8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIHRleHQgY2hpbGQKLQkJCQkJZG9tVmFsdWUgPSBleHRyYWN0VmFsdWUoY2hpbGQsIG1hcCwgbW9mT2JqZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlpc1Vuc2V0ID0gdHJ1ZTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYXR0cmlidXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBET00gdG8gdGhlIE1PRiBvYmplY3QuCi0JCWJvb2xlYW4gaGFzQ2hhbmdlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlpZiAobWFwLmlzSURNYXAoKSkKLQkJCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBkb21WYWx1ZSk7Ci0JCQllbHNlIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOwotCQkJCW9sZFZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJYm9vbGVhbiBpc1NldCA9IG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJLy9JbiB0aGUgY2FzZSBvZiBlbnVtcyB3aXRoIGRlZmF1bHQgdmFsdWVzLCB3ZSBuZWVkIHRvIHRyaXAKLQkJCQkvLyB0aGUgYXR0cmlidXRlIGZyb20KLQkJCQkvL2RlZmF1bHQgdG8gYSBzZXQgdmFsdWUKLQkJCQlpZiAob2xkVmFsdWUgPT0gZG9tVmFsdWUpIHsKLQkJCQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgaXNTZXQpCi0JCQkJCQloYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChkb21WYWx1ZSA9PSBudWxsICYmICFpc1NldCkKLQkJCQkJLy9JZiB0aGUgZG9tVmFsdWUgaXMgbnVsbCBhbmQgdGhlIGZlYXR1cmUgaXMgbm90IHNldCwgdGhlbgotCQkJCQkvLyB3ZSBkb24ndCBuZWVkCi0JCQkJCS8vdG8gZG8gYW55dGhpbmcKLQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCWVsc2UgaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUuZXF1YWxzKGRvbVZhbHVlKSAmJiBpc1NldCkKLQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsICYmIGRvbVZhbHVlID09IG51bGwgJiYgbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KSA9PSBpc1Vuc2V0KQotCQkJCQloYXNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoaGFzQ2hhbmdlZCkgewotCQkJCQlpZiAoIShtYXAuaXNEYXRhVHlwZSgpKSAmJiAhbWFwLmlzU2hhcmVkKCkpCi0JCQkJCQlyZW1vdmVNT0ZWYWx1ZSgoRU9iamVjdCkgb2xkVmFsdWUsIG1hcCk7Ci0JCQkJCWlmIChkb21WYWx1ZSA9PSBudWxsKQotCQkJCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCQkJZWxzZQotCQkJCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgZG9tVmFsdWUpOwotCi0JCQkJCWlmICgoZG9tVmFsdWUgPT0gbnVsbCAmJiAhKG1hcC5pc0VudW1GZWF0dXJlKCkpKSB8fCBpc1Vuc2V0KQotCQkJCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsgLy91bnNldAotCQkJCQkvLyBudWxsCi0JCQkJCS8vIGZvcgotCQkJCQkvLyBub24KLQkJCQkJLy8gZW51bQotCQkJCQkvLyBmZWF0dXJlcwotCi0JCQkJCWlmICh1cGRhdGVNT0ZBdHRBZGFwdGVyKQotCQkJCQkJYXR0ckFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQloYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGV4KTsKLQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGhhc0NoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhpcyBtZXRob2QgaXMgb25seQotCSAqIGNhbGxlZCBpZiB0aGUgRE9NIG5vZGUgY2hhbmdlcyBhbmQgdGhlIG1hcCBpcyBhbiBvYmplY3QgbGluayBtYXAuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqIEByZXR1cm4gUmV0dXJuIHRydWUgaWYgdGhlIE1PRiBmZWF0dXJlIHdhcyB1cGRhdGVkLCBmYWxzZSBpZiBubyB1cGRhdGUgd2FzIGRvbmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRkxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUxpbmtVcGRhdGVyVGFyZ2V0LklOU1RBTkNFLnVwZGF0ZU1PRihtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIElmIHRoZSBmZWF0dXJlIGlzIGEgY29sbGVjdGlvbiBvZiBzdHJpbmdzIG9yIGludHMsIGNhbGwgYSBzcGVjaWFsCi0JCS8vIG1ldGhvZAotCQkvLyB0aGF0IGhhbmRsZXMgdGhpcy4KLQkJaWYgKG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQl1cGRhdGVNT0ZNdWx0aVByaW1pdGl2ZUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBub2RlQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOwotCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0KLQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZkNoaWxkcmVuLCBub2RlQ2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlcGVuZGVuY3lBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCUFkYXB0ZXIgZXhpc3RpbmcgPSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG9iaiwgRGVwZW5kZW5jeUFkYXB0ZXIuS0VZKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpCi0JCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKGV4aXN0aW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCB0aGUgRE9NIGNoaWxkcmVuIGZyb20gPHBhcmVudD50aGF0IGFyZSByZXByZXNlbnRlZCBieSA8bWFwPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZHJlbihOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXApIHsKLQkJU3RyaW5nW10gZG9tTmFtZXMgPSBtYXAuZ2V0RE9NTmFtZXMoKTsKLQkJSGFzaFNldCBkb21OYW1lc1NldCA9IG5ldyBIYXNoU2V0KGRvbU5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9tTmFtZXMubGVuZ3RoOyBpKyspCi0JCQlkb21OYW1lc1NldC5hZGQoZG9tTmFtZXNbaV0pOwotCi0JCS8vIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoaWxkcmVuIGFuZCBmaW5kIGFueSB0aGF0IG1hdGNoIHRoZSBtYXAuCi0JCU5vZGVMaXN0IG5sID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoZG9tTmFtZXNTZXQuY29udGFpbnMoY2hpbGROb2RlLmdldE5vZGVOYW1lKCkpKQotCQkJCXRvUmVtb3ZlLmFkZChjaGlsZE5vZGUpOwotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSBjaGlsZHJlbiB0aGF0IHdlcmUgZm91bmQuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gKE5vZGUpIHRvUmVtb3ZlLmdldChpKTsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgY2hpbGROb2RlLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldEZyb21Ob2RlKCkgewotCQlzZXRUYXJnZXQoZlRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGZOb2RlLmdldE5vZGVOYW1lKCksIGV4dHJhY3RSZWFkQWhlYWROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJaWYgKG1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCQl1cGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZEZWJ1ZykgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIERPTSBOb2RlOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQl0cnkgewotCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCXByaW1VcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCX0KLQotCQkJaWYgKG1hcC5pc1RhcmdldExpbmtNYXAoKSkgewotCQkJCXVwZGF0ZURPTUxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXBvc3RVcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTUxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIERPTSBOb2RlIChsaW5rKTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpbVVwZGF0ZURPTUxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTU11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZSAobXVsdGkpOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGEgRE9NIHN1YnRyZWUgdG8gcmVmbGVjdCB0aGUgbW9mT2JqZWN0IGFuZCBtYXAgcGFzc2VkIGluLiBUaGUgc3VidHJlZSBpcyBvZiA8bm9kZT5pcwotCSAqIHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NU3VidHJlZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgT2JqZWN0IGF0dHJWYWx1ZSkgewotCi0JCWlmIChtYXAuZmVhdHVyZUV4aXN0cyhtb2ZPYmplY3QpKSB7Ci0JCQlpZiAoKG1hcC5pc0VudW1GZWF0dXJlKCkgfHwgbWFwLmlzQm9vbGVhbkZlYXR1cmUoKSkgJiYgKG1hcC5pc1Vuc2V0dGFibGUoKSAmJiAhbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KSkpCi0JCQkJYXR0clZhbHVlID0gbnVsbDsKLQkJfSBlbHNlCi0JCQlhdHRyVmFsdWUgPSBtYXAuZXh0cmFjdFN0cmluZ1ZhbHVlKG1vZk9iamVjdCk7Ci0KLQkJLy8gQ3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIERPTSBzdWJ0cmVlCi0JCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJTm9kZSBwYXJlbnQgPSBjcmVhdGVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCQlpZiAobWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG1vZiB2YWx1ZSBpcyBub3QgYW5vdGhlcgotCQkJCS8vIG1vZiBvYmplY3QgKHByaW1pdGl2ZSkKLQkJCQlpZiAobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSAhPSBudWxsICYmIG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkuc3RhcnRzV2l0aCgiIyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQotCQkJCUVsZW1lbnQgY2hpbGQgPSBtYXAuaXNET01UZXh0VmFsdWUoKSA/IChFbGVtZW50KSBwYXJlbnQgOiBmaW5kT3JDcmVhdGVOb2RlKHBhcmVudCwgbWFwLCBtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQotCQkJCWZpbmRPckNyZWF0ZVRleHROb2RlKGNoaWxkLCBtYXAsIG1hcC5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG1vZk9iamVjdCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2VyZSB0aGUgbW9mIHZhbHVlIGlzIGEgbW9mIG9iamVjdC4KLQkJCQlFT2JqZWN0IG1vZlZhbHVlID0gKEVPYmplY3QpIGF0dHJWYWx1ZTsKLQkJCQlFTUYyRE9NQWRhcHRlciB2YWx1ZUFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIobW9mVmFsdWUsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQkJCWlmICh2YWx1ZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJdmFsdWVBZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCWVsc2UgewotCQkJCQlyZW1vdmVET01DaGlsZHJlbihwYXJlbnQsIG1hcCk7Ci0JCQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKG1vZlZhbHVlLCBtYXApOwotCQkJCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCQkJCUxpc3QgZG9tQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihwYXJlbnQsIG1hcCk7Ci0KLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCAwLCBkb21DaGlsZHJlbik7Ci0JCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIGFkYXB0ZXIuZ2V0Tm9kZSgpLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gYWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluZGVudChhZGFwdGVyLmdldE5vZGUoKSwgbWFwKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCQkJfQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBhdHRyaWJ1dGUgdmFsdWUgd2FzIHNldCB0byBudWxsIG9yIHVuc2V0LiBSZW1vdmUgYW55Ci0JCQkvLyBleGlzdGluZyBET00gbm9kZXMuCi0JCQlOb2RlIGNoaWxkID0gZmluZERPTU5vZGUobm9kZSwgbWFwKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCXJlbW92ZURPTUNoaWxkKGNoaWxkLmdldFBhcmVudE5vZGUoKSwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGEgZmVhdHVyZSB0aGF0IGlzIHNldCBieSBsaW5raW5nIHRvIGFub3RoZXIgZXhpc3Rpbmcgb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQKLQkgKiB3aGVuIHRoZSBNT0Ygb2JqZWN0IGlzIHVwZGF0ZWQgaW4gb3JkZXIgdG8gdXBkYXRlIERPTSBub2Rlcy4KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZMaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBNT0ZPYmplY3QgKGxpbmspOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZU1PRkxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBNT0ZPYmplY3QgKG11bHRpKTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuIFRoZSByZWxhdGlvbnNoaXAgTVVTVCBCRSBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRk11bHRpUHJpbWl0aXZlRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaXN0IG5vZGVDaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0KLQkJbWFwLmNsZWFyTGlzdChtb2ZPYmplY3QpOwotCi0JCS8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2Ygbm9kZXMgYW5kIHVwZGF0ZSB0aGUgTU9GIGNvbGxlY3Rpb24KLQkJaW50IGFkZEluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgbm9kZUNoaWxkcmVuLmdldChpKTsKLQkJCU9iamVjdCBhdHRyaWJ1dGVWYWx1ZSA9IGV4dHJhY3RWYWx1ZShjaGlsZCwgbWFwLCBtb2ZPYmplY3QpOwotCQkJYm9vbGVhbiBhZHZhbmNlQWRkSW5kZXggPSB0cnVlOwotCQkJaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpewotCQkJCWlmKG1hcC5nZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiBtYXAuZ2V0RmVhdHVyZSgpLmlzVW5pcXVlKCkgJiYgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkgIT0gbnVsbCAmJiBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKSBpbnN0YW5jZW9mIExpc3QgJiYgKChMaXN0KSBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKSkuY29udGFpbnMoYXR0cmlidXRlVmFsdWUpKXsKLQkJCQkJYWR2YW5jZUFkZEluZGV4ID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBkb21OYW1lID0gbWFwLmRvbU5hbWVBbmRQYXRoICE9IG51bGwgPyBtYXAuZG9tTmFtZUFuZFBhdGggOiAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAnbm8gZHVwbGljYXRlcycgY29uc3RyYWludCBpcyB2aW9sYXRlZCBieSAiK2RvbU5hbWUrIiA9ICIrYXR0cmlidXRlVmFsdWUpKTsKLQkJCQkJaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgYXR0cmlidXRlVmFsdWUsIGFkZEluZGV4KTsKLQkJCQl9Ci0JCQkJaWYoYWR2YW5jZUFkZEluZGV4KXsKLQkJCQkJYWRkSW5kZXggKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBBZGFwdCB0aGUgbm9kZSBzbyB1cGRhdGUgd2lsbCBvY2N1ci4KLQkJCWFkZERPTUFkYXB0ZXIoY2hpbGQpOwotCQl9Ci0JCWlmIChtYXAuaGFzRE9NUGF0aCgpICYmIG5vZGVDaGlsZHJlbi5pc0VtcHR5KCkgJiYgZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSkgIT0gbnVsbCkKLQkJCW1hcC5zZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgobW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChtYXAuaXNNdWx0aVZhbHVlZCgpKSB7Ci0JCQl1cGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKG1hcC5pc0NvbW1lbnQoKSkgewotCQkJdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVE9ETyBNREUgQWRkIGEgbWFwLmlzQ29tbWVudCgpIGFuZCB1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0KLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0OiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJYm9vbGVhbiBoYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCWhhc0NoYW5nZWQgPSBwcmltVXBkYXRlTU9GRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0KLQkJaWYgKG1hcC5pc1RhcmdldExpbmtNYXAoKSAmJiBoYXNDaGFuZ2VkKQotCQkJdXBkYXRlTU9GTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBtb2ZPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlOb2RlIGNvbW1lbnROb2RlID0gbm9kZTsKLQkJLyogc2NhbiB1cCB0aGUgZG9tIHRvIGZpbmQgdGhlIGZpcnN0IGNvbW1lbnQgbm9kZSBiZWZvcmUgdGhpcyBub2RlICovCi0JCXdoaWxlICgoY29tbWVudE5vZGUgPSBjb21tZW50Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgIT0gbnVsbCAmJiBjb21tZW50Tm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkvKiBubyBjb21tZW50IGF2YWlsYWJsZSAqLwotCQkJaWYgKGNvbW1lbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb21tZW50Tm9kZSAhPSBudWxsKQotCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgY29tbWVudE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZiZGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NTG9hZE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyIHsKLQotCXByb3RlY3RlZCBNYXAgZG9tQWRhcHRlclJlZ2lzdHJ5OwotCXByb3RlY3RlZCBib29sZWFuIG5lZWRzVG9DcmVhdGVET00gPSB0cnVlOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBET01SZW5kZXJlckltcGwuCi0JICovCi0JcHVibGljIEVNRjJET01SZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG1hbmFnZXNET01BZGFwdGVycygpKQotCQkJaW5pdERPTUFkYXB0ZXJSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb0xvYWQoSW5wdXRTdHJlYW0sIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoKGluICE9IG51bGwpIHx8ICF1c2VTdHJlYW1zRm9ySU8oKSkgewotCQkJbG9hZERvY3VtZW50KGluLCBvcHRpb25zKTsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOwotCQkJYWRhcHRlci51cGRhdGVNT0YoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlET01Mb2FkT3B0aW9ucyBkb21PcHRzID0gbmV3IERPTUxvYWRPcHRpb25zKCk7Ci0JCQlkb21PcHRzLnNldEFsbG93SmF2YUVuY29kaW5ncyh0cnVlKTsKLQkJCWRvbU9wdHMuc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKHRydWUpOwotCQkJZG9tT3B0cy5zZXRWYWxpZGF0ZShpc1ZhbGlkYXRpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5sb2FkRG9jdW1lbnQoaW4sIGRvbU9wdHMsIGdldFJlc291cmNlKCkuZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdF9yZXgpIHsKLQkJCXRocm93IHRfcmV4OwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IGlveDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb1NhdmUoT3V0cHV0U3RyZWFtLCBNYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQkJc2VyaWFsaXplRG9jdW1lbnQob3V0cHV0U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiBhZGFwdGVycyBhcmUgbm90IGNhY2hlZCB3aXRoaW4gdGhpcyByZW5kZXJlciwgZS5nLiwgdGhleSBhcmUKLQkgKiBzdG9yZWQgaW4gbm90aWZ5aW5nIE5vZGVzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFuYWdlc0RPTUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RE9NQWRhcHRlclJlZ2lzdHJ5KCkgewotCQlpZiAoZG9tQWRhcHRlclJlZ2lzdHJ5ID09IG51bGwpCi0JCQlkb21BZGFwdGVyUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRE9NQWRhcHRlcihOb2RlIG5vZGUsIEVNRjJET01BZGFwdGVyIGFkYXB0ZXIpIHsKLQkJZG9tQWRhcHRlclJlZ2lzdHJ5LnB1dChub2RlLCBhZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKEVNRjJET01BZGFwdGVyKSBkb21BZGFwdGVyUmVnaXN0cnkuZ2V0KG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCWRvbUFkYXB0ZXJSZWdpc3RyeS5yZW1vdmUoYU5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVwYXJlVG9BZGRDb250ZW50cygpCi0JICovCi0JcHVibGljIHZvaWQgcHJlcGFyZVRvQWRkQ29udGVudHMoKSB7Ci0JCS8vIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVRyZWUoKSB7Ci0JCWNyZWF0ZURvY3VtZW50KCk7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOwotCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgcm9vdCA9IG5ldyBFTUYyRE9NQWRhcHRlckltcGwoZ2V0UmVzb3VyY2UoKSwgZG9jdW1lbnQsIHRoaXMsIGdldFJlc291cmNlKCkuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JCXJlZ2lzdGVyRE9NQWRhcHRlcihkb2N1bWVudCwgcm9vdCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCkgewotCQlpZiAobmVlZHNUb0NyZWF0ZURPTSkKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5jcmVhdGVOZXdEb2N1bWVudChyZXMuZ2V0RG9jdHlwZSgpLCByZXMuZ2V0UHVibGljSWQoKSwgcmVzLmdldFN5c3RlbUlkKCkpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VyaWFsaXplRG9jdW1lbnQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IGNyZWF0ZU91dHB1dEZvcm1hdCgpOyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQotCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXQsIGZvcm1hdCk7Ci0JCSAqIHNlcmlhbGl6ZXIuYXNET01TZXJpYWxpemVyKCkuc2VyaWFsaXplKGRvY3VtZW50KTsKLQkJICovCi0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJLyoKLQkJCSAqIHRyeSB7IGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLCBXM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2gKLQkJCSAqIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9Ci0JCQkgKi8KLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OLCBnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAibm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7Ci0JCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwgZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCQkJLyogc291cmNlLnNldFN5c3RlbUlkKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSk7ICovCi0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7Ci0JICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IHJldHVybiBmb3JtYXQ7IH0KLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJRG9jdW1lbnQgbmV3RG9jID0gbnVsbDsKLQkJLy8gTmVlZCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgZG9jdHlwZSBkaXJlY3RseSBvbiB0aGUgZXhpc3RpbmcgZG9jdW1lbnQ7IHJpZ2h0IG5vdyBjYW4ndAotCQkvLyBiZWNhdXNlCi0JCS8vIG9mIGxpbWl0YXRpb25zIG9uIHBhcnNlciBuZXV0cmFsIGFwaXMKLQotCQl0cnkgewotCQkJbmV3RG9jID0gRE9NVXRpbGl0aWVzLmNyZWF0ZU5ld0RvY3VtZW50KGRvY1R5cGVOYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQotCQlyZXBsYWNlTm9kZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgbmV3RG9jLCBuZXdEb2MpOwotCQlyZWFkYXB0KGRvY3VtZW50LCBuZXdEb2MpOwotCQlkb2N1bWVudCA9IG5ld0RvYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShOb2RlIG9sZENoaWxkLCBOb2RlIG5ld1BhcmVudCwgRG9jdW1lbnQgbmV3RG9jKSB7Ci0JCU5vZGUgbmV3Q2hpbGQgPSBuZXdEb2MuaW1wb3J0Tm9kZShvbGRDaGlsZCwgZmFsc2UpOwotCQluZXdQYXJlbnQuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOwotCQlyZWFkYXB0KG9sZENoaWxkLCBuZXdDaGlsZCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gb2xkQ2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlcGxhY2VOb2RlKGNoaWxkcmVuLml0ZW0oaSksIG5ld0NoaWxkLCBuZXdEb2MpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVhZGFwdChOb2RlIG9sZENoaWxkLCBOb2RlIG5ld0NoaWxkKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0RPTUFkYXB0ZXIob2xkQ2hpbGQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZWdpc3RlckRPTUFkYXB0ZXIobmV3Q2hpbGQsIGFkYXB0ZXIpOwotCQkJLy8gU29tZSBub2RlcyBhcmUgbWFuYWdlZCBieSB0aGUgcGFyZW50IGFuZCB0aHVzIHRoZQotCQkJLy8gbm9kZSBzaG91bGQgbm90IGJlIHNldCBvbiB0aGUgcGFyZW50IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyLmdldE5vZGUoKSA9PSBvbGRDaGlsZCkKLQkJCQlhZGFwdGVyLnNldE5vZGUobmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSgpLmdldFZlcnNpb25JRCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U1NjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJET01SZW5kZXJlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQotCSAqLwotCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKLQkJRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJET01SZW5kZXJlcigpOwotCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTdhMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciNnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1YmI2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogVGhlIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaXMgdXRpbGl6ZWQgYnkgdGhlIFNBWCBwYXJzZXIgdG8gYW5ub3VuY2UgWE1MIEV2ZW50cywgc3VjaCBhcwotICogYmVnaW5uaW5nIGFuZCBlbmQgb2YgWE1MIGVsZW1lbnRzIGFuZCB0aGUgY29udGVudHMgb2YgdGhvc2UgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWERvY3VtZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIENhY2hlRXZlbnRTdGFjayBldmVudFN0YWNrID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOwotCXByaXZhdGUgQ2FjaGVFdmVudFBvb2wgYXZhaWxhYmxlRXZlbnRQb29sID0gbmV3IENhY2hlRXZlbnRQb29sKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gRU1GMlNBWERvY3VtZW50SGFuZGxlciB0byBwb3B1bGF0ZSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCXRoaXMucmVzb3VyY2Uuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCi0JCXRyeSB7Ci0JCQlFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IHRoaXMucmVzb3VyY2UuZ2V0RW50aXR5UmVzb2x2ZXIoKTsKLQotCQkJaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IHN1cGVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGlvZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvKgotCQkgKiBUaGUgZW5kRG9jdW1lbnQoKSBtZXRob2Qgc2hvdWxkIGhhdmUgZnJvemVuIHRoZSBwb29sLCBvciBpdCBtYXkgbm90IGJlIHdhcm1lZCB5ZXQuIEluCi0JCSAqIGVpdGhlciBjYXNlLCB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgZG8gYXMgbGl0dGxlIHdvcmsgYXMgbmVjZXNzYXJ5Ci0JCSAqLwotCQlhdmFpbGFibGVFdmVudFBvb2wud2FybVBvb2woKTsKLQotCQkvKiBUaGlzIGxpbmUgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnksIGJ1dCBpcyBsZWZ0IGZvciBzYWZ0eSAqLwotCQlldmVudFN0YWNrLmNsZWFyKCk7Ci0JCXRoaXMuY3JlYXRlUm9vdCh0aGlzLnJlc291cmNlKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWFkZFRvU3RhY2socU5hbWUsIGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJQ2FjaGVFdmVudE5vZGUgY3VycmVudFJlY29yZCA9IGdldEN1cnJlbnRSZWNvcmQoKTsKLQkJaWYgKGN1cnJlbnRSZWNvcmQgIT0gbnVsbCkgewotCQkJY3VycmVudFJlY29yZC5hcHBlbmRUb0J1ZmZlcihkYXRhLCBzdGFydCwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJQ2FjaGVFdmVudE5vZGUgY3VycmVudFJlY29yZCA9IG51bGw7Ci0KLQkJLyoKLQkJICogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIERPTVBhdGggd2FzIGlnbm9yZWQgc28gdGhlIHN0YWNrIGRvZXMgbm90Ci0JCSAqIHF1aXRlIG1hdGNoIHdpdGggdGhlIFhNTCBkYXRhIHN0cnVjdHVyZS4gSW4gdGhpcyBjYXNlIHdlIGRvIG5vdGhpbmcKLQkJICovCi0JCWlmIChxTmFtZS5lcXVhbHModGhpcy5nZXRDdXJyZW50UmVjb3JkKCkuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCWN1cnJlbnRSZWNvcmQgPSB0aGlzLnJlbW92ZUN1cnJlbnRSZWNvcmQoKTsKLQkJCWlmIChjdXJyZW50UmVjb3JkICE9IG51bGwpIHsKLQkJCQljdXJyZW50UmVjb3JkLmNvbW1pdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmREb2N1bWVudCgpCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJQ2FjaGVFdmVudE5vZGUgbGFzdFJlY29yZCA9IHRoaXMucmVtb3ZlQ3VycmVudFJlY29yZCgpOwotCQlsYXN0UmVjb3JkLmNvbW1pdCgpOwotCQlhdmFpbGFibGVFdmVudFBvb2wuZnJlZXplUG9vbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdGhyb3cgZXg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdGhyb3cgZXg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZXgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2VBcmcpIHsKLQkJdGhpcy5ldmVudFN0YWNrLnB1c2goYXZhaWxhYmxlRXZlbnRQb29sLmNyZWF0ZUNhY2hlRXZlbnROb2RlKHJlc291cmNlQXJnKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGFjayhTdHJpbmcgbm9kZU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlDYWNoZUV2ZW50Tm9kZSBwYXJlbnQgPSB0aGlzLmdldEN1cnJlbnRSZWNvcmQoKTsKLQkJaWYgKCFwYXJlbnQuaXNDaGlsZElnbm9yYWJsZShub2RlTmFtZSkpIHsKLQkJCXRoaXMuZXZlbnRTdGFjay5wdXNoKGF2YWlsYWJsZUV2ZW50UG9vbC5jcmVhdGVDYWNoZUV2ZW50Tm9kZShwYXJlbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGVzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGV2ZW50IHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICovCi0JcHJvdGVjdGVkIENhY2hlRXZlbnROb2RlIGdldEN1cnJlbnRSZWNvcmQoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0JCWlmICghdGhpcy5ldmVudFN0YWNrLmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gdGhpcy5ldmVudFN0YWNrLnBlZWsoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZXZlbnQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVFdmVudE5vZGUgcmVtb3ZlQ3VycmVudFJlY29yZCgpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCF0aGlzLmV2ZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmV2ZW50U3RhY2sucG9wKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwlwcml2YXRlIGZpbmFsIHZvaWQgcHJpbnRTdGFjaygpIHsKLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmludGluZyBzdGFjayAuLi4iKTsKLQkvLwkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV2ZW50U3RhY2suc2l6ZSgpOyBpKyspIHsKLQkvLwkJLy8gZGVidWcoInN0YWNrWyIgKyBpICsgIl06ICIgKyBldmVudFN0YWNrLmdldChpKSk7Ci0JLy8JCS8vIH0KLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIuLi4gUHJpbnRlZCBzdGFjayIpOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgZGVidWcoT2JqZWN0IG9iaikgewotCS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHdhcm4oT2JqZWN0IG9iaikgewotCS8vCQkvL1N5c3RlbS5lcnIucHJpbnRsbihvYmopOwotCS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmNzIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbXBsIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GMlNBWFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb0xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB7Ci0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCS8qCi0JCQkgKiBDYXVzZXMgZXJyb3JzIGluIElCTSBKREsgdHJ5IHsgZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsCi0JCQkgKiBXM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJCSAqLwotCQkJU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCQlYTUxSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJRU1GMlNBWERvY3VtZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IEVNRjJTQVhEb2N1bWVudEhhbmRsZXIodGhpcy5nZXRSZXNvdXJjZSgpKTsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgaXNWYWxpZGF0aW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBzbnJlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCBpc1ZhbGlkYXRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hXCIuIFZhbGlkYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzXCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8qCi0JCQkgKiB0cnkgeyByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGhhbmRsZXIpOyB9Ci0JCQkgKiBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7IH0KLQkJCSAqLwotCQkJcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotCQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKLQkJCS8vcmVhZGVyLnNldERUREhhbmRsZXIoaGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoaGFuZGxlcik7Ci0JCQlJbnB1dFNvdXJjZSB0ZXN0c291cmNlID0gbmV3IElucHV0U291cmNlKGluKTsKLQkJCXJlYWRlci5wYXJzZSh0ZXN0c291cmNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0X3JleCkgewotCQkJdGhyb3cgdF9yZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvU2F2ZShqYXZhLmlvLk91dHB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJLyoKLQkJICogdHJ5IHsgU2VyaWFsaXplciBzZXJpYWxpemVyID0KLQkJICogU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplckZhY3RvcnkoTWV0aG9kLlhNTCkubWFrZVNlcmlhbGl6ZXIob3V0cHV0U3RyZWFtLAotCQkgKiBjcmVhdGVPdXRwdXRGb3JtYXQoKSk7IHNlcmlhbGl6ZXIuc2V0T3V0cHV0Qnl0ZVN0cmVhbShvdXRwdXRTdHJlYW0pOyBDb250ZW50SGFuZGxlcgotCQkgKiBoYW5kbGVyID0gc2VyaWFsaXplci5hc0NvbnRlbnRIYW5kbGVyKCk7Ci0JCSAqLwotCi0JCVRyYW5zZm9ybWVySGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJU0FYVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSAoU0FYVHJhbnNmb3JtZXJGYWN0b3J5KSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCQloYW5kbGVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIoKTsKLQotCQkJCWhhbmRsZXIuc2V0UmVzdWx0KG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0JCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBoYW5kbGVyLmdldFRyYW5zZm9ybWVyKCk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OLCBnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJubyIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgICAgIAotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotCQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDLCBnZXRSZXNvdXJjZSgpLmdldFB1YmxpY0lkKCkpOwotCQkJCWlmIChnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLQkJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwgZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsKLQotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCJTQVggV3JpdGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUVNRjJTQVhXcml0ZXIgd3JpdGVyID0gbmV3IEVNRjJTQVhXcml0ZXIoKTsKLQkJCXdyaXRlci5zZXJpYWxpemUodGhpcy5yZXNvdXJjZSwgaGFuZGxlcik7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzYXhlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihzYXhlKTsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIE91dHB1dEZvcm1hdCBjcmVhdGVPdXRwdXRGb3JtYXQoKSB7IE91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCk7Ci0JICogZm9ybWF0LnNldEluZGVudGluZyh0cnVlKTsgZm9ybWF0LnNldExpbmVTZXBhcmF0b3IoRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HKTsKLQkgKiAvLyROT04tTkxTLTEkIGZvcm1hdC5zZXRFbmNvZGluZyhnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCSAqIGZvcm1hdC5zZXRWZXJzaW9uKGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsgaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkKLQkgKiBmb3JtYXQuc2V0RG9jdHlwZSh0aGlzLnJlc291cmNlLmdldFB1YmxpY0lkKCksIHRoaXMucmVzb3VyY2UuZ2V0U3lzdGVtSWQoKSk7IHJldHVybiBmb3JtYXQ7IH0KLQkgKi8KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVwYXJlVG9BZGRDb250ZW50cygpCi0JICovCi0JcHVibGljIHZvaWQgcHJlcGFyZVRvQWRkQ29udGVudHMoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2dldFZlcnNpb25JRCgpCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSgpLmdldFZlcnNpb25JRCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmZDVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAxOSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi0vKioKLSAqIFVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgRU1GMlNBWFJlbmRlcmVyCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSBleHRlbmRzIFJlbmRlcmVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSNjcmVhdGVSZW5kZXJlcigpCi0JICovCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlFTUYyU0FYUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgRU1GMlNBWFJlbmRlcmVyKCk7Ci0JCXJlbmRlcmVyLnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOwotCQlyZXR1cm4gcmVuZGVyZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFdyaXRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTU1NzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOwotCi0vKioKLSAqIFRoZSBFTUYyU0FYV3JpdGVyIGhhbmRsZXMgdGhlIHNlcmlhbGl6YXRpb24gb2YgRU1GIFJlc291cmNlcyB1c2luZyBTQVggZXZlbnRzLiBTQVggZXZlbnRzIGFyZQotICogdHJpZ2dlcmVkIHRvIHRoZSBjb250ZW50IGhhbmRsZXIgYXMgdGhlIHRyZWUgaXMgYmVpbmcgcGFyc2VkLiBUaGVzZSBldmVudHMgY2FuIHRoZW4gYmUgd3JpdHRlbgotICogaW50byBhbnkgc3RyZWFtIHdyYXBwZWQgYnkgdGhlIENvbnRlbnRIYW5kbGVyLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhXcml0ZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIiI7Ly8iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIFVzZWQgaW4gdGhvc2UgY2FzZXMgd2hlcmUgbm8gQXR0cmlidXRlcyBhcmUgbmVjZXNzYXJ5ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlcyBFTVBUWV9BVFRSSUJVVEVTID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0KLQkvKioKLQkgKiBTZXJpYWxpemUgYW4gRU1GIHJlc291cmNlIGludG8gYW4gWE1MIFN0cmVhbSB1c2luZyB0aGUgZ2l2ZW4gQ29udGVudEhhbmRsZXIuIE5vdGUgdGhhdCB0aGlzCi0JICogbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29weSBhIGdpdmVuIEVNRiBSZXNvdXJjZSBpZiB0aGUgRU1GMlNBWERvY3VtZW50SGFuZGxlciBpcyB1c2VkIGFzCi0JICogdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgc2VyaWFsaXplKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSwgQ29udGVudEhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJVHJhbnNsYXRvciByb290VHJhbnNsYXRvciA9IHJlc291cmNlLmdldFJvb3RUcmFuc2xhdG9yKCk7Ci0JCUVMaXN0IGNvbnRlbnRzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQotCQlpZiAoY29udGVudHMuc2l6ZSgpICE9IDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBjb250ZW50cyBvZiBhIHJlc291cmNlIG1heSBvbmx5IGNvbnRhaW4gb25lIEVNRiBNb2RlbCBPYmplY3QuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQloYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJc2VyaWFsaXplKGhhbmRsZXIsIGVsZW1lbnQsIHJvb3RUcmFuc2xhdG9yLCBuZXcgV3JpdGVySGludHMocmVzb3VyY2UpKTsKLQkJaGFuZGxlci5lbmREb2N1bWVudCgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShDb250ZW50SGFuZGxlciBoYW5kbGVyLCBFT2JqZWN0IHRhcmdldCwgVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBXcml0ZXJIaW50cyBoaW50cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG51bGw7Ci0JCU9iamVjdCByYXdWYWx1ZSA9IG51bGw7Ci0JCUVPYmplY3QgbmV3VGFyZ2V0ID0gbnVsbDsKLQkJVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKLQkJVHJhbnNsYXRvciBuZXh0VHJhbnNsYXRvciA9IG51bGw7Ci0JCWNoYXJbXSBjaGFyYWN0ZXJEYXRhID0gbnVsbDsKLQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbnVsbDsKLQkJU3RyaW5nIGNoaWxkRG9tTmFtZSA9IG51bGw7Ci0JCWZpbmFsIGludCB2ZXJzaW9uID0gaGludHMuZ2V0VmVyc2lvbigpOwotCi0JCS8qCi0JCSAqIFByb2Nlc3NpbmcgaGludHMgYXJlIHVzZWQgdG8gcmVtZW1iZXIgd2hlcmUgYXJlIGluIHRoZSBpdGVyYXRpb24gb2YgdGhlIHRyYW5zbGF0b3IncwotCQkgKiBjaGlsZHJlbi4gc2VlIHRoZSBUcmFuc2xhdG9yRmlsdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0aGlzIGFycmF5IGlzIHVzZWQuCi0JCSAqLwotCQlpbnRbXSBwcm9jZXNzaW5nSGludHMgPSBUcmFuc2xhdG9yRmlsdGVyLmNyZWF0ZVByb2Nlc3NpbmdIaW50cygpOwotCi0JCVN0cmluZyB0YXJnZXREb21OYW1lID0gdHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0KLQkJYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXModHJhbnNsYXRvciwgdGFyZ2V0LCBoaW50cyk7Ci0KLQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCB0YXJnZXREb21OYW1lLCB0YXJnZXREb21OYW1lLCBhdHRyaWJ1dGVzKTsKLQotCQljdXJyZW50Q2hpbGRUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0T2JqZWN0VHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKTsKLQkJd2hpbGUgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJLyogRm9yIGVhY2ggQ2hpbGQgVHJhbnNsYXRvciBvZiB0aGUgVHJhbnNsYXRvciBwYXJhbWV0ZXIgcGFzc2VkIGludG8gdGhlIG1ldGhvZCAqLwotCi0JCQkvKiBEb2VzIHRoZSBUcmFuc2xhdG9yIGhhdmUgYW55IE1PRiBDaGlsZHJlbj8gKi8KLQkJCW1vZkNoaWxkcmVuID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRNT0ZDaGlsZHJlbih0YXJnZXQpOwotCQkJb3BlbkRvbVBhdGhJZk5lY2Vzc2FyeShoYW5kbGVyLCBoaW50cywgY3VycmVudENoaWxkVHJhbnNsYXRvciwgdGFyZ2V0LCBtb2ZDaGlsZHJlbik7Ci0KLQkJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkvKgotCQkJCSAqIFRyYW5zbGF0b3JzIHdoaWNoIGFyZSBtYW5hZ2VkIGJ5IHRoZWlyIHBhcmVudHMgcmVxdWlyZSBsZXNzIHByb2Nlc3NpbmcgLS0ganVzdAotCQkJCSAqIGNvbnZlcnQgdGhlaXIgdmFsdWUgdG8gYSBzdHJpbmcgYW5kIHdyaXRlIGl0IG91dCBhcyB0aGUgY29udGVudCBvZiBhbiBYTUwgZWxlbWVudAotCQkJCSAqLwotCQkJCWNoaWxkRG9tTmFtZSA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCQkJCWlmICghY3VycmVudENoaWxkVHJhbnNsYXRvci5pc0VtcHR5VGFnKCkpIHsKLQkJCQkJLyogVGhlIFRyYW5zbGF0b3IgaXMgbm90IGFuIEVtcHR5IHRhZy4gSXRzIHRleHQgY29udGVudCBpcyBzaWduaWZpY2FudCAqLwotCi0JCQkJCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7Ci0KLQkJCQkJCQkvKiBUZXh0IG9ubHkgdHJhbnNsYXRvcnMgd2lsbCBub3QgaGF2ZSBvcGVuIGFuZCBjbG9zZSBYTUwgZWxlbWVudHMgKi8KLQkJCQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNET01UZXh0VmFsdWUoKSkKLQkJCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7Ci0KLQkJCQkJCQlyYXdWYWx1ZSA9IG1vZkNoaWxkcmVuLmdldChqKTsKLQkJCQkJCQkvKiBjb252ZXJ0VmFsdWVUb1N0cmluZyBzaG91bGQgYWx3YXlzIHJldHVybiBhIG5vbi1udWxsIFN0cmluZyAqLwotCQkJCQkJCWNvbnZlcnRlZFZhbHVlID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5jb252ZXJ0VmFsdWVUb1N0cmluZyhyYXdWYWx1ZSwgdGFyZ2V0KTsKLQkJCQkJCQljaGFyYWN0ZXJEYXRhID0gWE1MRW5jb2RlckRlY29kZXIuZXNjYXBlKGNvbnZlcnRlZFZhbHVlKS50b0NoYXJBcnJheSgpOwotCQkJCQkJCWhhbmRsZXIuY2hhcmFjdGVycyhjaGFyYWN0ZXJEYXRhLCAwLCBjaGFyYWN0ZXJEYXRhLmxlbmd0aCk7Ci0KLQkJCQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNET01UZXh0VmFsdWUoKSkKLQkJCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogVGhlIFRyYW5zbGF0b3IgaXMgYW4gRW1wdHkgRWxlbWVudCAoaXRzIG1lcmUgcHJlc2VuY2UgaGFzIHNpZ25pZmljYW5jZSkgKGUuZy4KLQkJCQkJICogPGNhc2NhZGUtZGVsZXRlLz4KLQkJCQkJICovCi0KLQkJCQkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNCb29sZWFuRmVhdHVyZSgpKSB7Ci0JCQkJCQkvKiBCb29sZWFuIGZlYXR1cmVzIG1heSBvciBtYXkgbm90IGJlIHJlbmRlcmVkICovCi0JCQkJCQlyYXdWYWx1ZSA9IG1vZkNoaWxkcmVuLmdldCgwKTsKLQkJCQkJCWlmIChyYXdWYWx1ZSAhPSBudWxsICYmICgoQm9vbGVhbikgcmF3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7Ci0JCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOwotCQkJCQkJfQotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBBbHdheXMgcmVuZGVyIGFueSBvdGhlciBFbXB0eSBlbGVtZW50cyAqLwotCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7Ci0JCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCi0JCQkJLyogVGhlIFRyYW5zbGF0b3IgaXMgYSBtb3JlIGNvbXBsZXggZmVhdHVyZSwgaGFuZGxlIGl0cyBwcm9jZXNzaW5nIHJlY3Vyc2l2ZWx5ICovCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgewotCQkJCQluZXdUYXJnZXQgPSAoRU9iamVjdCkgbW9mQ2hpbGRyZW4uZ2V0KGopOwotCQkJCQlzZXJpYWxpemUoaGFuZGxlciwgbmV3VGFyZ2V0LCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBoaW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBGZXRjaCB0aGUgbmV4dCBwZWVyIHRyYW5zbGF0b3IgKi8KLQkJCW5leHRUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0T2JqZWN0VHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKTsKLQotCQkJY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoaGFuZGxlciwgaGludHMsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG5leHRUcmFuc2xhdG9yLCB0YXJnZXQsIG1vZkNoaWxkcmVuKTsKLQotCQkJLyoKLQkJCSAqIFdlIG5lZWRlZCB0byBpbnZva2UgY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoKSB3aXRoIHRoZSBwZWVyLCBub3cgd2UgbW92ZSBvbiB0bwotCQkJICogcHJvY2VzcyB0aGF0IHBlZXIKLQkJCSAqLwotCQkJY3VycmVudENoaWxkVHJhbnNsYXRvciA9IG5leHRUcmFuc2xhdG9yOwotCi0JCX0KLQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgdGFyZ2V0RG9tTmFtZSwgdGFyZ2V0RG9tTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIERPTSBQYXRoIHNob3VsZCBiZSByZW5kZXJlZC4gVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAotCSAqIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIEVtcHR5IFhNTCBlbGVtZW50cyBhcmUgcmVsZXZhbnQgYW5kIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBYTUwKLQkgKiBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCi0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IFRyYW5zbGF0b3IKLQkgKiBAcGFyYW0gbW9mQ2hpbGRyZW4KLQkgKiAgICAgICAgICAgIFRoZSBtb2ZDaGlsZHJlbiB0aGF0IHdlcmUgZm91bmQgZm9yIHRoZSBUcmFuc2xhdG9yIG9uIHRoZSBUYXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlbmRlckRvbVBhdGgoRU9iamVjdCB0YXJnZXQsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgTGlzdCBtb2ZDaGlsZHJlbikgewotCQlyZXR1cm4gIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLnNob3VsZFJlbmRlckVtcHR5RE9NUGF0aCh0YXJnZXQpIHx8IG1vZkNoaWxkcmVuLnNpemUoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIG9wZW5Eb21QYXRoSWZOZWNlc3Nhcnkgd2lsbCB3cml0ZSB0aGUgY3VycmVudCBET00gUGF0aCB0byB0aGUgc2VyaWFsaXphdGlvbiBzdHJlYW0gaWYgaXQgaGFzCi0JICogbm90IGJlZW4gd3JpdHRlbiBieSBhIHByZXZpb3VzIHBlZXIgdHJhbnNsYXRvci4gVGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBpbiB0aGUgY29sbGFwc2Ugb2YKLQkgKiBQZWVyIFRyYW5zbGF0b3JzIHdpdGggbWF0Y2hpbmcgRE9NIFBhdGhzIGludG8gYSBzaW5nbGUgWE1MIHBhcmVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICogICAgICAgICAgICBUaGUgQ29udGVudEhhbmRsZXIgd2hpY2ggaXMgd3JpdGluZyB0aGUgWE1MIHJlc3VsdAotCSAqIEBwYXJhbSBoaW50cwotCSAqICAgICAgICAgICAgQSBHbG9iYWwgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHNpbmdsZSBYTUwgZG9jdW1lbnQKLQkgKiBAcGFyYW0gY3VycmVudENoaWxkVHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIGFjdGl2ZSBUcmFuc2xhdG9yIGJlaW5nIHByb2Nlc3NlZAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5Eb21QYXRoSWZOZWNlc3NhcnkoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgV3JpdGVySGludHMgaGludHMsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIExpc3QgbW9mQ2hpbGRyZW4pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCS8qIElmIHRoZSB0cmFuc2xhdG9yIGRvZXMgbm90IGhhdmUgYSBET00gUGF0aCwgdGhlbiB3ZSBkbyBub3RoaW5nICovCi0JCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmhhc0RPTVBhdGgoKSAmJiBzaG91bGRSZW5kZXJEb21QYXRoKHRhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbW9mQ2hpbGRyZW4pKSB7Ci0KLQkJCVN0cmluZyBjaGlsZERvbVBhdGggPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKLQotCQkJLyoKLQkJCSAqIElzRG9tUGF0aEFjdGl2ZSgpIHdpbGwgdmVyaWZ5IHdoZXRoZXIgdGhpcyBET00gUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlCi0JCQkgKiBYTUwgc3RyZWFtCi0JCQkgKi8KLQkJCWlmICghaGludHMuaXNEb21QYXRoQWN0aXZlKGNoaWxkRG9tUGF0aCkpIHsKLQotCQkJCS8qCi0JCQkJICogV3JpdGUgYW4gb3BlbiBlbGVtZW50IGZvciB0aGUgRE9NIFBhdGggYW5kICJyZW1lbWJlciIgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gaXQKLQkJCQkgKi8KLQkJCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tUGF0aCwgY2hpbGREb21QYXRoLCBFTVBUWV9BVFRSSUJVVEVTKTsKLQkJCQloaW50cy5wdXNoRG9tUGF0aChjaGlsZERvbVBhdGgpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9zZURvbVBhdGhJZk5lY2Vzc2FyeSB3aWxsIGRldGVybWluZSB3aGV0aGVyIHRoZSBuZXh0IHBlZXIgVHJhbnNsYXRvciBzaGFyZXMgdGhlIGFjdGl2ZSBET00KLQkgKiBQYXRoIG9mIHRoZSBjdXJyZW50IFRyYW5zbGF0b3IuIElmIHRoZSBuZXh0IHBlZXIgVHJhbnNsYXRvciBoYXMgdGhlIHNhbWUgRE9NIFBhdGgsIG5vIGFjdGlvbgotCSAqIHdpbGwgYmUgdGFrZW4gKGhlbmNlIGNvbmRlbnNpbmcgdGhlIGVsZW1lbnRzIGludG8gYSBzaW5nbGUgWE1MIHBhcmVudCkuIEhvd2V2ZXIsIGlmIHRoZSBET00KLQkgKiBQYXRoIGRpZmZlcnMgKGluY2x1ZGluZyB0aGUgTmV4dCBQZWVyIFRyYW5zbGF0b3IgaGFzIG5vIERPTSBQYXRoKSB0aGVuIHRoZSBjdXJyZW50IERPTSBQYXRoCi0JICogd2lsbCBiZSBjbG9zZWQgKGEgY2xvc2UgWE1MIGVsZW1lbnQgaXMgZ2VuZXJhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICogICAgICAgICAgICBUaGUgQ29udGVudEhhbmRsZXIgd2hpY2ggaXMgd3JpdGluZyB0aGUgWE1MIHJlc3VsdAotCSAqIEBwYXJhbSBoaW50cwotCSAqICAgICAgICAgICAgQSBHbG9iYWwgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHNpbmdsZSBYTUwgZG9jdW1lbnQKLQkgKiBAcGFyYW0gY3VycmVudENoaWxkVHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIGxhc3QgVHJhbnNsYXRvciB0byBoYXZlIGNvbXBsZXRlZCBwcm9jZXNzaW5nCi0JICogQHBhcmFtIG5leHRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgbmV4dCBwZWVyIFRyYW5zbGF0b3IgdGhhdCB3aWxsIGJlY29tZSBhY3RpdmUKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZURvbVBhdGhJZk5lY2Vzc2FyeShDb250ZW50SGFuZGxlciBoYW5kbGVyLCBXcml0ZXJIaW50cyBoaW50cywgVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBUcmFuc2xhdG9yIG5leHRUcmFuc2xhdG9yLCBFT2JqZWN0IHRhcmdldCwgTGlzdCBtb2ZDaGlsZHJlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaGFzRE9NUGF0aCgpICYmIHNob3VsZFJlbmRlckRvbVBhdGgodGFyZ2V0LCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBtb2ZDaGlsZHJlbikpIHsKLQkJCVN0cmluZyBjaGlsZERvbVBhdGggPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKLQkJCWlmIChuZXh0VHJhbnNsYXRvciAhPSBudWxsKSB7IC8qCi0JCQkJCQkJCQkJICAgKiBUaGVyZSBhcmUgbW9yZSBwZWVycyBhZnRlciB0aGlzIGVsZW1lbnQsIHdlIGNhbiBwZWVrCi0JCQkJCQkJCQkJICAgKiBhaGVhZAotCQkJCQkJCQkJCSAgICovCi0JCQkJU3RyaW5nIG5leHRQZWVyRG9tUGF0aCA9IG5leHRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKLQkJCQlpZiAobmV4dFBlZXJEb21QYXRoID09IG51bGwgfHwgIW5leHRQZWVyRG9tUGF0aC5lcXVhbHMoY2hpbGREb21QYXRoKSkgewotCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCk7Ci0JCQkJCWhpbnRzLnBvcERvbVBhdGgoKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7IC8qIFRoaXMgd2FzIHRoZSBsYXN0IGNoaWxkIGVsZW1lbnQsIHdlIG11c3QgY2xvc2UgdGhlIGRvbXBhdGggKi8KLQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCk7Ci0JCQkJaGludHMucG9wRG9tUGF0aCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWdncmVnYXRlIHRoZSBBdHRyaWJ1dGUgdHJhbnNsYXRvciBjaGlsZHJlbiBmcm9tIGEgZ2l2ZW4gdHJhbnNsYXRvci4gVGhpcyBtZXRob2Qgd2lsbCByZXF1ZXN0Ci0JICogdGhlIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCBmcm9tIHRoZSBXcml0ZXJIaW50cyBvYmplY3QuIFRoZSBXcml0ZXJIaW50cyBtYWludGFpbnMgdGhpcwotCSAqIHJldXNhYmxlIGNvbGxlY3Rpb24gdG8gbGltaXQgdGhlIHJlcXVpcmVtZW50IGZvciBuZXcgb2JqZWN0IGNyZWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdG9yCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSBoaW50cwotCSAqIEByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgc2V0IG9mIEF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBUcmFuc2xhdG9yIGFuZCBFTUYgVGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBFT2JqZWN0IHRhcmdldCwgV3JpdGVySGludHMgaGludHMpIHsKLQotCQlBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gaGludHMuZ2V0QXR0cmlidXRlSG9sZGVyKCk7Ci0JCWludCB2ZXJzaW9uID0gaGludHMuZ2V0VmVyc2lvbigpOwotCQlPYmplY3QgcmF3VmFsdWUgPSBudWxsOwotCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgY2hpbGREb21OYW1lID0gbnVsbDsKLQkJVHJhbnNsYXRvciBhdHRyaWJ1dGVUcmFuc2xhdG9yID0gbnVsbDsKLQkJaW50W10gcHJvY2Vzc2luZ0hpbnRzID0gVHJhbnNsYXRvckZpbHRlci5jcmVhdGVQcm9jZXNzaW5nSGludHMoKTsKLQotCQl3aGlsZSAoKGF0dHJpYnV0ZVRyYW5zbGF0b3IgPSBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRBdHRyaWJ1dGVUcmFuc2xhdG9yKHRyYW5zbGF0b3IsIHByb2Nlc3NpbmdIaW50c1tUcmFuc2xhdG9yRmlsdGVyLk5FWFRfU1RBUlRfSElOVF9JTkRYXSwgcHJvY2Vzc2luZ0hpbnRzLCB0YXJnZXQsIHZlcnNpb24pKSAhPSBudWxsKSB7Ci0KLQkJCUxpc3QgbW9mQ2hpbGRyZW4gPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldE1PRkNoaWxkcmVuKHRhcmdldCk7Ci0JCQlpZiAobW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQotCQkJCQljaGlsZERvbU5hbWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoaik7Ci0JCQkJCWNvbnZlcnRlZFZhbHVlID0gYXR0cmlidXRlVHJhbnNsYXRvci5jb252ZXJ0VmFsdWVUb1N0cmluZyhyYXdWYWx1ZSwgdGFyZ2V0KTsKLQkJCQkJY29udmVydGVkVmFsdWUgPSBYTUxFbmNvZGVyRGVjb2Rlci5lc2NhcGUoY29udmVydGVkVmFsdWUpOwotCQkJCQlhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCAiU3RyaW5nIiwgY29udmVydGVkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWNoaWxkRG9tTmFtZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCQkJCWNvbnZlcnRlZFZhbHVlID0gKFN0cmluZykgYXR0cmlidXRlVHJhbnNsYXRvci5nZXRNT0ZWYWx1ZSh0YXJnZXQpOwotCQkJCWlmIChjb252ZXJ0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCQlhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCAiU3RyaW5nIiwgY29udmVydGVkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVySGludHMgaXMgdXNlZCB0byAicmVtZW1iZXIiIGNlcnRhaW4gcGllY2VzIG9mIGluZm9ybWF0aW9uIHdoaWxlIHRoZSB3cml0ZXIgaXMKLQkgKiBwcm9jZXNzaW5nLiBPZiBwYXJ0aWN1bGFyIGludGVyZXN0IGFyZSB0aGUgdmVyc2lvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBET00gUGF0aCBvdXRwdXQuCi0JICogQ29uc2VjdXRpdmUgZWxlbWVudHMgd2l0aCBjb25zaXN0ZW50IChpZGVudGljYWwpIERPTSBQYXRocyBhcmUgY29sbGFwc2VkIHVuZGVyIGEgc2luZ2xlIFhNTAotCSAqIGVsZW1lbnQuCi0JICogCi0JICogVGhlIFdyaXRlckhpbnRzIHByb3ZpZGVzIGdsb2JhbCBzdGF0ZSBiZXR3ZWVuIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBvZiBzZXJpYWxpemUoKS4gSXQgc2hvdWxkCi0JICogYmUgbm90IGJlIHVzZWQgdG8gc3RvcmUgbG9jYWwgZGF0YSAoZS5nLiBkYXRhIHRoYXQgaXMgb25seSByZWxldmFudCB0byBhIHNpbmdsZSBUcmFuc2xhdG9yIGluCi0JICogYSBnaXZlbiBjb250ZXh0KS4KLQkgKiAKLQkgKiBUaGUgV3JpdGVySGludHMgYWxzbyBzdG9yZXMgYW4gQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRoYXQgaXMgcmUtdXNlZCB0byBzdG9yZSBhdHRyaWJ1dGVzLiBUaGUKLQkgKiBnZXRBdHRyaWJ1dGVzKCkgbWV0aG9kIHdpbGwgcmVxdWVzdCB0aGUgQXR0cmlidXRlcyBIb2xkZXIuCi0JICogCi0JICogQGF1dGhvciBtZGVsZGVyCi0JICovCi0JcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlckhpbnRzIHsKLQkJcHJpdmF0ZSBmaW5hbCBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgU3RhY2sgZG9tU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzSW1wbCA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0JCXB1YmxpYyBXcml0ZXJIaW50cyhUcmFuc2xhdG9yUmVzb3VyY2UgcmVzKSB7Ci0JCQl0aGlzLnJlc291cmNlID0gcmVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1c2ggYSBuZXcgZG9tUGF0aCBvbnRvIHRoZSBzdGFjawotCQkgKiAKLQkJICogQHBhcmFtIGRvbVBhdGgKLQkJICogICAgICAgICAgICBhIERPTVBhdGggd2hpY2ggaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHVzaERvbVBhdGgoU3RyaW5nIGRvbVBhdGgpIHsKLQotCQkJaWYgKGRvbVBhdGggIT0gbnVsbCAmJiBkb21QYXRoLmxlbmd0aCgpID4gMCkKLQkJCQlkb21TdGFjay5wdXNoKGRvbVBhdGgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBvcCB0aGUgY3VycmVudCBkb21QYXRoIGZyb20gdGhlIEFycmF5Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBwb3BEb21QYXRoKCkgewotCi0JCQlpZiAoIWRvbVN0YWNrLmlzRW1wdHkoKSkKLQkJCQlkb21TdGFjay5wb3AoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBET01QYXRoIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQotCQkgKiAKLQkJICogQHBhcmFtIGRvbVBhdGgKLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBET01QYXRoIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNEb21QYXRoQWN0aXZlKFN0cmluZyBkb21QYXRoKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKCFkb21TdGFjay5pc0VtcHR5KCkpIHsKLQotCQkJCVN0cmluZyBjdXJyZW50RG9tUGF0aCA9IChTdHJpbmcpIGRvbVN0YWNrLnBlZWsoKTsKLQkJCQlpZiAoY3VycmVudERvbVBhdGggIT0gbnVsbCAmJiBkb21QYXRoICE9IG51bGwpCi0JCQkJCXJlc3VsdCA9IGN1cnJlbnREb21QYXRoLmVxdWFscyhkb21QYXRoKTsKLQkJCQllbHNlIGlmICghKGN1cnJlbnREb21QYXRoID09IG51bGwgXiBkb21QYXRoID09IG51bGwpKQotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIEVNRiBSZXNvdXJjZQotCQkgKi8KLQkJcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotCQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0VmVyc2lvbklEKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyBhbiBlbXB0eSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgdG8gc3RvcmUgYXR0cmlidXRlcy4gV2l0aGluIHRoZSBjb250ZXh0IG9mIGEgZ2l2ZW4KLQkJICogV3JpdGVySGludHMgb2JqZWN0IChhbmQgaGVuY2Ugc2luZ2xlIFhNTCBkb2N1bWVudCksIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMgYSBzaW5nbGV0b24uCi0JCSAqIFRoZSBzYW1lIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCBpcyBjbGVhcmVkIGFuZCByZXVzZWQgZm9yIGVhY2ggaW52b2NhdGlvbi4KLQkJICogCi0JCSAqIEByZXR1cm4gYW4gZW1wdHkgQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRvIHN0b3JlIGF0dHJpYnV0ZXMKLQkJICovCi0JCXB1YmxpYyBBdHRyaWJ1dGVzSW1wbCBnZXRBdHRyaWJ1dGVIb2xkZXIoKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZXNJbXBsLmNsZWFyKCk7Ci0JCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzSW1wbDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0ZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0ZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiM2RhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBNYXAvKjxTdHJpbmcgc2hvcnROYW1lLCBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yPiovIGRlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsgCi0JcHJpdmF0ZSBNYXAvKjxSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLCBSZXNvdXJjZS5GYWN0b3J5PiovIGZhY3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVzb3VyY2UuRmFjdG9yeSB0aGF0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBVUkkncyBmaWxlIG5hbWUuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwjZ2V0RmFjdG9yeShVUkkpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRGaWxlTmFtZUZhY3RvcnkoVVJJIHVyaSkgewotCi0JCWlmKHVyaSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHVyaSk7Ci0JCQkKLQkJCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRGYWN0b3J5KGRlc2NyaXB0b3IpOwkKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkodXJpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkKLQl7Ci0JCVJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gbnVsbDsKLQkJaWYodXJpICE9IG51bGwgJiYgdXJpLmxhc3RTZWdtZW50KCkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJCi0JCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBnZXRGYWN0b3J5KGRlc2NyaXB0b3IpOwkKLQkJCX0JCi0JCX0KLQkJaWYocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpCi0JCQlyZXNvdXJjZUZhY3RvcnkgPSBzdXBlci5nZXRGYWN0b3J5KHVyaSwgY29udGVudFR5cGUpOwotCQlyZXR1cm4gcmVzb3VyY2VGYWN0b3J5OyAKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhIGZpbGUgbmFtZSByZXByZXNlbnRpbmcgdGhlIGxhc3Qgc2VnbWVudCBvZiBhIFVSSSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCi0JICogUmVzb3VyY2UuRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoU3RyaW5nIGFTaW1wbGVGaWxlTmFtZSwgUmVzb3VyY2UuRmFjdG9yeSBhRmFjdG9yeSkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhU2ltcGxlRmlsZU5hbWUpOwotCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSB1cmkubGFzdFNlZ21lbnQoKTsgCi0JCWFkZERlc2NyaXB0b3IobmV3IFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IobGFzdFNlZ21lbnQsIGFGYWN0b3J5KSk7CQkKLQl9IAotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoVVJJIHVyaSkgewotCQlyZXR1cm4gKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCh1cmkubGFzdFNlZ21lbnQoKSk7Ci0JfQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTWFwIGdldERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN5bmNocm9uaXplZCBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7ICAKLQkJUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gKEZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoZGVzY3JpcHRvcik7Ci0JCWlmKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yaWVzLnB1dChkZXNjcmlwdG9yLCAoZmFjdG9yeSA9IGRlc2NyaXB0b3IuY3JlYXRlRmFjdG9yeSgpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRvcihSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsgCi0JCWRlc2NyaXB0b3JzLnB1dChkZXNjcmlwdG9yLmdldFNob3J0U2VnbWVudCgpLCBkZXNjcmlwdG9yKTsKLQl9Ci0gCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9HZW5lcmljVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZTA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9HZW5lcmljVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFNwZWNpYWxpemVkIHRyYW5zbGF0b3IgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIHNpbXBsZSBtYXBwaW5ncyB3aXRoIG5vIHNwZWNpYWxpemVkIGJlaGF2aW9yLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRocwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGhbXSBwYXRocykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGhzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JbXQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiAgICAgICAgICAgIFRoZSBjaGlsZHJlbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGFwcGVuZENoaWxkcmVuKEdlbmVyaWNUcmFuc2xhdG9yIHRyYW4sIFRyYW5zbGF0b3JbXSBjaGlsZCkgewotCQlUcmFuc2xhdG9yW10gb3JnQ2hpbGQgPSB0cmFuLmdldENoaWxkcmVuKCk7Ci0JCVRyYW5zbGF0b3JbXSBuZXdDaGlsZHJlbiA9IChUcmFuc2xhdG9yW10pIGNvbmNhdChvcmdDaGlsZCwgY2hpbGQpOwotCQl0cmFuLnNldENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIHRyYW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGFwcGVuZENoaWxkKEdlbmVyaWNUcmFuc2xhdG9yIHRyYW4sIFRyYW5zbGF0b3IgY2hpbGQpIHsKLQkJT2JqZWN0W10gb3JnQ2hpbGQgPSB0cmFuLmdldENoaWxkcmVuKCk7Ci0JCVRyYW5zbGF0b3JbXSBuZXdDaGlsZHJlbiA9IChUcmFuc2xhdG9yW10pIGNvbmNhdChvcmdDaGlsZCwgY2hpbGQpOwotCQl0cmFuLnNldENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIHRyYW47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSURUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmY2YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSURUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE5LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgSURUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0JcHVibGljIGNsYXNzIE5vUmVzb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCQlwdWJsaWMgTm9SZXNvdXJjZUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9SZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQkJc3VwZXIocyk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBJRF9GRUFUVVJFID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NfRUlEQXR0cmlidXRlKCk7Ci0Jc3RhdGljIGZpbmFsIHB1YmxpYyBJRFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgSURUcmFuc2xhdG9yKCk7Ci0KLQlwdWJsaWMgSURUcmFuc2xhdG9yKCkgewotCQlzdXBlcigiaWQiLCBJRF9GRUFUVVJFLCBET01fQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBlbWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOb1Jlc291cmNlRXhjZXB0aW9uKCk7Ci0JCVN0cmluZyBpZCA9IHJlcy5nZXRJRChlbWZPYmplY3QpOwotCQlpZiAoaWQgPT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyh2YWx1ZSkpIHx8ICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMoaWQpKSkKLQkJCXJlcy5zZXRJRChlbWZPYmplY3QsIChTdHJpbmcpIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOb1Jlc291cmNlRXhjZXB0aW9uKCk7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZW1mT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldElEKGVtZk9iamVjdCk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lSb290T2JqZWN0UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lSb290T2JqZWN0UmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0ODEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJUm9vdE9iamVjdFJlc291cmNlIHsKLQotCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTGlua1VwZGF0ZXJUYXJnZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2QxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTGlua1VwZGF0ZXJUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBMaW5rVXBkYXRlclRhcmdldCBleHRlbmRzIE9iamVjdCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtVcGRhdGVyVGFyZ2V0IElOU1RBTkNFID0gbmV3IExpbmtVcGRhdGVyVGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTGlua1VwZGF0ZXJNdWx0aVRhcmdldC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqLwotCXByaXZhdGUgTGlua1VwZGF0ZXJUYXJnZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmVmcmVzaFNvdXJjZU9iamVjdHMobWFwLCBub2RlLCBtb2ZPYmplY3QsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRihUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZWZyZXNoU291cmNlT2JqZWN0cyhtYXAsIG5vZGUsIG1vZk9iamVjdCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTb3VyY2VPYmplY3RzKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0LCBib29sZWFuIGRvbVVwZGF0ZSkgewotCQlUcmFuc2xhdG9yUGF0aFtdIHBhdGhzID0gbWFwLmdldFRyYW5zbGF0b3JQYXRocygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmFuc2xhdG9yUGF0aCBwYXRoID0gcGF0aHNbaV07Ci0JCQlMaXN0IGFsbFNvdXJjZU9iamVjdHMgPSBwYXRoLmZpbmRPYmplY3RzKG1vZk9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxTb3VyY2VPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgY3VyT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCUVNRjJET01BZGFwdGVyIGN1ckFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGN1ck9iamVjdC5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChjdXJBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGRvbVVwZGF0ZSkKLQkJCQkJCWN1ckFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWN1ckFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTWFwcGVkWE1JSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTM5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTWFwcGVkWE1JSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLQotcHVibGljIGNsYXNzIE1hcHBlZFhNSUhlbHBlciBleHRlbmRzIFhNTEhlbHBlckltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUk9UT0NPTCA9ICJ3b3Jrc3BhY2U6LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgPSAicGxhdGZvcm06L3Jlc291cmNlLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgTlVMTF9GRUFUVVJFID0gbmV3IFVuc3VwcG9ydGVkRmVhdHVyZSgpOwotCXByb3RlY3RlZCBib29sZWFuIHVzaW5nTWFwcyA9IHRydWU7Ci0JcHJvdGVjdGVkIE1hcCBjYWNoZWRSZWxhdGl2ZVVSSXM7Ci0JcHJvdGVjdGVkIE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFwcGVkWE1MSGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBNYXBwZWRYTUlIZWxwZXIoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBwcmVmaXhlc1RvVVJJcykgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JCXRoaXMucHJlZml4ZXNUb1VSSXMucHV0QWxsKHByZWZpeGVzVG9VUklzKTsKLQkJcHVzaENvbnRleHQoKTsgLy9OZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dCB0byB6ZXJvCi0JCVNldCBrZXlzID0gcHJlZml4ZXNUb1VSSXMua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJpID0gKFN0cmluZykgcHJlZml4ZXNUb1VSSXMuZ2V0KHByZWZpeCk7Ci0JCQluYW1lc3BhY2VTdXBwb3J0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgVVJJIHJlc29sdmUoVVJJIHJlbGF0aXZlLCBVUkkgYmFzZSkgewotCQlVUkkgcmVzb2x2ZWQgPSBudWxsOwotCQlib29sZWFuIGlzTWFwcGVkID0gZmFsc2U7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlVUkkgbG9jYWxyZXNvdXJjZVVSSSA9IG51bGw7Ci0JCQlpZiAocmVsYXRpdmUuaGFzRnJhZ21lbnQoKSkKLQkJCQlsb2NhbHJlc291cmNlVVJJID0gcmVsYXRpdmUudHJpbUZyYWdtZW50KCk7Ci0JCQllbHNlCi0JCQkJbG9jYWxyZXNvdXJjZVVSSSA9IHJlbGF0aXZlOwotCQkJaXNNYXBwZWQgPSAhKCgoVVJJQ29udmVydGVySW1wbC5VUklNYXApIHNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKGxvY2FscmVzb3VyY2VVUkkpLmVxdWFscyhsb2NhbHJlc291cmNlVVJJKSk7Ci0JCX0KLQkJaWYgKCFpc01hcHBlZCkgewotCQkJaWYgKGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzKCkgJiYgc2V0ICE9IG51bGwpCi0JCQkJcmVzb2x2ZWQgPSBzZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHJlbGF0aXZlKTsKLQkJfSBlbHNlIHsKLQkJCXJlc29sdmVkID0gcmVsYXRpdmU7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkID09IG51bGwgPyBzdXBlci5yZXNvbHZlKHJlbGF0aXZlLCBiYXNlKSA6IHJlc29sdmVkOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMoKSB7Ci0JCXJldHVybiAoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgcmVzb3VyY2UpLmdldEZvcm1hdCgpID09IENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSB8fCB1c2luZ01hcHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJLyoKLQkJICogcHJvYmxlbSAtIHRoZSBpbmNvbWluZyBrZXkgdmFsdWUgcGFpciBpcyBlamJibmQtPmVqYmJuZC54bWk7IGhvd2V2ZXIsIHRoZSBtYXAgYWxyZWFkeSBoYXMKLQkJICogYSBrZXkgdmFsdWUgcGFpciBvZiBlamJibmQtPmh0dHA6Ly8vZWpiYm5kLmVjb3JlCi0JCSAqLwotCQlpZiAodXJpLmVuZHNXaXRoKCIuZWNvcmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl1c2luZ01hcHMgPSBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXhpc3RpbmcgPSAoU3RyaW5nKSBwcmVmaXhlc1RvVVJJcy5nZXQocHJlZml4KTsKLQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCXByZWZpeGVzVG9VUklzLnB1dChwcmVmaXgsIHVyaSk7Ci0JCQluYW1lc3BhY2VTdXBwb3J0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOwotCQl9IGVsc2UgaWYgKCFleGlzdGluZy5lcXVhbHModXJpKSkgewotCQkJZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkuYWRkT3JpZ2luYWxQYWNrYWdlVVJJKGV4aXN0aW5nLCB1cmkpOwotCQkJZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIGdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGdldFJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNnZXRIUkVGKEVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIUkVGKEVPYmplY3Qgb2JqKSB7Ci0JCWlmICghZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkgewotCQkJVVJJQ29udmVydGVyIGNvbnYgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ICE9IG51bGwgJiYgY29udiBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpIHsKLQkJCQlTdHJpbmcgaHJlZiA9IGdldENvbXBhdGlibGlsdHlIUkVGKG9iaiwgKENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpIGNvbnYpOwotCQkJCXJldHVybiB1c2VXb3Jrc3BhY2VQcm90b2NvbElmTmVjZXNzYXJ5KGhyZWYpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRIUkVGKG9iaik7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gaHJlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZVdvcmtzcGFjZVByb3RvY29sSWZOZWNlc3NhcnkoU3RyaW5nIGhyZWYpIHsKLQkJaWYgKGhyZWYgIT0gbnVsbCAmJiBocmVmLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpKQotCQkJcmV0dXJuIFdPUktTUEFDRV9QUk9UT0NPTCArIGhyZWYuc3Vic3RyaW5nKDE5KTsKLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcGF0aWJsaWx0eUhSRUYoRU9iamVjdCBvYmosIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgY29udikgewotCQkvL0ltcGxlbWVudGF0aW9uIGNvcGllZCBmcm9tIHN1cGVyLmdldEhSRUYoRU9iamVjdCkKLQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmo7Ci0KLQkJVVJJIG9iamVjdFVSSSA9IG8uZVByb3h5VVJJKCk7Ci0JCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgewotCQkJUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCWlmIChvdGhlclJlc291cmNlID09IG51bGwpIHsKLQkJCQlvYmplY3RVUkkgPSBoYW5kbGVEYW5nbGluZ0hSRUYob2JqKTsKLQkJCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJb2JqZWN0VVJJID0gb3RoZXJSZXNvdXJjZS5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChvdGhlclJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iaikpOwotCQl9Ci0KLQkJLy9Nb2RpZmllZCB0byBkaXNwYXRjaCBiYWNrIHRvIFVSSSBDb252ZXJ0ZXIKLQkJaWYgKCFvYmplY3RVUkkuaXNSZWxhdGl2ZSgpKSB7Ci0JCQlvYmplY3RVUkkgPSBtYWtlUmVsYXRpdmUob2JqZWN0VVJJLCBjb252KTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFVSSSBtYWtlUmVsYXRpdmUoVVJJIG9iamVjdFVSSSwgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciBjb252KSB7Ci0JCVN0cmluZyBmcmFnbWVudCA9IG9iamVjdFVSSS5mcmFnbWVudCgpOwotCQlvYmplY3RVUkkgPSBvYmplY3RVUkkudHJpbUZyYWdtZW50KCk7Ci0JCVVSSSByZWxhdGl2ZSA9IChVUkkpIGdldENhY2hlZFJlbGF0aXZlVVJJcygpLmdldChvYmplY3RVUkkpOwotCQlpZiAocmVsYXRpdmUgPT0gbnVsbCkgewotCQkJcmVsYXRpdmUgPSBjb252LmRlTm9ybWFsaXplKG9iamVjdFVSSSk7Ci0JCQlpZiAocmVsYXRpdmUuaXNSZWxhdGl2ZSgpKQotCQkJCWNhY2hlZFJlbGF0aXZlVVJJcy5wdXQob2JqZWN0VVJJLCByZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aXZlLmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldENhY2hlZFJlbGF0aXZlVVJJcygpIHsKLQkJaWYgKGNhY2hlZFJlbGF0aXZlVVJJcyA9PSBudWxsKQotCQkJY2FjaGVkUmVsYXRpdmVVUklzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZFJlbGF0aXZlVVJJczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldElEKEVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChFT2JqZWN0IG9iaikgewotCQlpZiAoZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5nZXRJRChvYmopOwotCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQob2JqLCByZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE5TSW5mbyhFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlpZiAocHJlZml4ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde3BrZy5nZXROc1ByZWZpeCgpLCBwa2cuZ2V0TnNVUkkoKX07Ci0JCXJldHVybiBuZXcgU3RyaW5nW117cHJlZml4LCBwcmVmaXggKyAiLnhtaSJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRQcmVmaXgoRVBhY2thZ2UgcGtnKSB7Ci0JCVN0cmluZyBuc1VSSSA9IHBrZy5nZXROc1VSSSgpOwotCQlpZiAodXNpbmdNYXBzIHx8ICFnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIChTdHJpbmcpIHBhY2thZ2VVUklzVG9QcmVmaXhlcy5nZXQobnNVUkkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFByZWZpeE9yRGVmYXVsdChFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlyZXR1cm4gcHJlZml4ID09IG51bGwgPyBwa2cuZ2V0TnNQcmVmaXgoKSA6IHByZWZpeDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZVVSSXNUb1ByZWZpeGVzCi0JICogICAgICAgICAgICBUaGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VVUklzVG9QcmVmaXhlcyhNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzKSB7Ci0JCXRoaXMucGFja2FnZVVSSXNUb1ByZWZpeGVzID0gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoRUNsYXNzIGMpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKGMpOwotCi0JCWlmICh4bWxNYXAgIT0gbnVsbCkgewotCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyBjbHNJbmZvID0geG1sTWFwLmdldEluZm8oYyk7Ci0KLQkJCWlmIChjbHNJbmZvICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2xzSW5mby5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQlyZXR1cm4gZ2V0UU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLQkJCX0KLQkJfQotCi0JCUVQYWNrYWdlIHAgPSBjLmdldEVQYWNrYWdlKCk7Ci0JCXBhY2thZ2VzLnB1dChwLCBudWxsKTsKLQotCQlpZiAocC5nZXROc1ByZWZpeCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQgCi0JCQlyZXR1cm4gbmFtZTsKLQotCQkvL01vZGlmaWVkIGZyb20gc3VwZXJjbGFzcwotCQkvL3JldHVybiBwLmdldE5zUHJlZml4KCkgKyAiOiIgKyBuYW1lOwotCQlyZXR1cm4gZ2V0TWFwcGVkUHJlZml4T3JEZWZhdWx0KHApICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI3NldFZhbHVlKEVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gTlVMTF9GRUFUVVJFKQotCQkJcmV0dXJuOwotCQlpZiAoIWZlYXR1cmUuaXNUcmFuc2llbnQoKSkgewotCQkJaWYgKHZhbHVlID09IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkuaXNQcmltaXRpdmUoKSkKLQkJCQkvL0ZvciBjb21wYXRpYmlsaXR5IHdpdGggTU9GNSB3aGVyZSB0eXBlcyBsaWtlIEludGVnZXIgbWlnaHQgaGF2ZSBiZWVuIHNldAotCQkJCS8vYW5kIHNlcmlhbGl6ZWQgYXMgInhzaTpuaWwiCi0JCQkJcmV0dXJuOwotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlciNnZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJaWYgKFVuc3VwcG9ydGVkRmVhdHVyZS5pc1Vuc3VwcG9ydGVkKGVDbGFzcywgbmFtZSkpCi0JCQlyZXR1cm4gTlVMTF9GRUFUVVJFOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShlQ2xhc3MsIG5hbWVzcGFjZVVSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyI2dldEZlYXR1cmVLaW5kKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIGludCBnZXRGZWF0dXJlS2luZChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSA9PSBOVUxMX0ZFQVRVUkUpCi0JCQlyZXR1cm4gWE1MSGVscGVyLkRBVEFUWVBFX1NJTkdMRTsKLQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZWQ1YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aU9iamVjdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltde307Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTXVsdGlPYmplY3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoRU9iamVjdCBvKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBUcmFuc2xhdG9yIGdldERlbGVnYXRlRm9yKFN0cmluZyBkb21OYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSk7Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKS5jcmVhdGVFTUZPYmplY3Qobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbikgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1RSQU5TTEFUT1JTOwotCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3IoKEVPYmplY3QpIG8pLmdldENoaWxkcmVuKG8sIHZlcnNpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0RE9NTmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKChFT2JqZWN0KSB2YWx1ZSkuZ2V0RE9NTmFtZSh2YWx1ZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFuYWdlZEJ5UGFyZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudEVuZFRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkgewotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQkJfQotCQlUcmFuc2xhdG9yIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGVGb3Iobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjNlZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTQsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2VBZGFwdGVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSkgewotCQlzdXBlcihkb21OYW1lLCBOYW1lc3BhY2VBZGFwdGVyLk5PVElGSUNBVElPTl9GRUFUVVJFLCBET01fQVRUUklCVVRFKTsKLQkJaW5pdFByZWZpeCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJlZml4KCkgewotCQlTdHJpbmcgZE5hbWUgPSBnZXRET01OYW1lKG51bGwpOwotCQlwcmVmaXggPSBkTmFtZS5zdWJzdHJpbmcoRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LlhNTE5TLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgKFN0cmluZykgdmFsdWUsIGVtZk9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIGdldE1PRlZhbHVlKGVtZk9iamVjdCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBtb2ZPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjdW5TZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCwgZW1mT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gZmVhdHVyZSkgewotCQkJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpIChvbGRWYWx1ZSA9PSBudWxsID8gbmV3VmFsdWUgOiBvbGRWYWx1ZSk7Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHByZWZpeC5lcXVhbHMobmFtZXNwYWNlLmdldFByZWZpeCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThiOWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0VHJhbnNsYXRvckZpbHRlcigpIHsKLQkJc3VwZXIobnVsbCwgLTEpOwotCX0KLQotCXB1YmxpYyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgewotCQlpbnQgZm91bmQgPSBzdGFydCArIDE7Ci0JCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgewotCQkJaWYgKCFjaGlsZHJlbltmb3VuZF0uaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlicmVhazsKLQkJfQotCQlmb3VuZCA9IChmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aCkgPyBmb3VuZCA6IC0xOwotCQlyZXR1cm4gZm91bmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDFhMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlYWRBaGVhZEhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudERPTU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNoaWxkRE9NTmFtZTsKLQotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIoU3RyaW5nIHBhcmVudERPTU5hbWUsIFN0cmluZ1tdIHZhbHVlcywgU3RyaW5nIGNoaWxkRE9NTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudERPTU5hbWUgPSBwYXJlbnRET01OYW1lOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQkJdGhpcy5jaGlsZERPTU5hbWUgPSBjaGlsZERPTU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRET01OYW1lKCkgewotCQlyZXR1cm4gY2hpbGRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudERPTU5hbWUoKSB7Ci0JCXJldHVybiBwYXJlbnRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQljaGlsZERPTU5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlwYXJlbnRET01OYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQkJdmFsdWVzID0gc3RyaW5nczsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIG5vZGVWYWx1ZUlzUmVhZEFoZWFkTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQotCQlyZXR1cm4gKGNoaWxkRE9NTmFtZSAhPSBudWxsKSA/IGNoaWxkRE9NTmFtZS5lcXVhbHMobm9kZU5hbWUpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbm9kZU5hbWVJc1JlYWRBaGVhZE5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobm9kZU5hbWUuZXF1YWxzKHZhbHVlc1tpXSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmYWYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZWRSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlLCBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgewotCS8vVE9ETyAtIHJlbmFtZSBwYWNrYWdlZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRF9FUlJPUl9NU0cgPSAiVGhpcyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfV0FTX1NBVkVEID0gNjAxOwotCQotCS8qKgotCSAqIEEgZmxhZyB1c2VkIHRvIGluZGljYXRlIGEgUmVmZXJlbmNlZFJlc291cmNlIGlzIGFib3V0Ci0JICogdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9BQk9VVF9UT19TQVZFID0gNjAyOwotCQotCS8qKgotCSAqIEEgZmxhZyB1c2VkIHRvIGluZGljYXRlIGEgUmVmZXJlbmNlZFJlc291cmNlIGhhcyBmYWlsZWQKLQkgKiB0byBzYXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX1NBVkVfRkFJTEVEID0gNjAzOwotCi0JLyoqCi0JICogQWNjZXNzIHRoaXMgcmVzb3VyY2UgZm9yIHJlYWQgb25seS4gVGhpcyBjYWxsIGluY3JlbWVudHMgdGhlIHVzZSByZWFkIGNvdW50IG9mIHRoaXMgcmVzb3VyY2UuCi0JICogQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhleSB1c2UgdGhlIHJlc291cmNlLiBUaGV5IHNob3VsZCBjYWxsCi0JICogcmVsZWFzZUZyb21SZWFkKCkgYWZ0ZXIgdGhleSBhcmUgZG9uZSBtb2RpZnlpbmcgdGhpcyByZXNvdXJjZS4KLQkgKi8KLQl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsKLQotCS8qKgotCSAqIEFjY2VzcyB0aGlzIHJlc291cmNlIGZvciB3cml0ZSBvbmx5LiBUaGlzIGNhbGwgaW5jcmVtZW50cyB0aGUgdXNlIHdyaXRlIGNvdW50IG9mIHRoaXMKLQkgKiByZXNvdXJjZS4gQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhleSBtb2RpZnkgdGhlIHJlc291cmNlLiBUaGV5IHNob3VsZCBjYWxsCi0JICogcmVsZWFzZUZyb21Xcml0ZSgpIGFmdGVyIHRoZXkgYXJlIGRvbmUgbW9kaWZ5aW5nIHRoaXMgcmVzb3VyY2UuCi0JICovCi0Jdm9pZCBhY2Nlc3NGb3JXcml0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBoYXMganVzdCBiZWVuIGxvYWRlZCBhbmQgbm90IHlldCBhY2Nlc3NlZCBmb3IgcmVhZCBvciB3cml0ZS4KLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYW55IHdyaXRlIHJlZmVyZW5jZXMuCi0JICovCi0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIHNoYXJlZCBmb3IgcmVhZCBvciB3cml0ZSBieSBtb3JlIHRoYW4gb25lIGFjY2Vzc29yLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaXMgc2hhcmVkIGZvciB3cml0ZSBieSBtb3JlIHRoYW4gb25lIGFjY2Vzc29yLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpOwotCi0JLyoqCi0JICogUmVsZWFzZSByZWFkIHRoZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVGhpcyBjYWxsIGRlY3JlbWVudHMgdGhlIHVzZSBjb3VudCBvZiB0aGlzIHJlc291cmNlCi0JICogYW5kIHdpbGwgcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIGl0cyByZXNvdXJjZSBzZXQgaWYgdGhlIHVzZSBjb3VudCBnb2VzIHRvIDAuIENsaWVudHMgc2hvdWxkCi0JICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZXkgYXJlIGRvbmUgYWNjZXNzaW5nIHRoZSByZXNvdXJjZSBhbmQgb25seSBhZnRlciB0aGV5IGhhdmUgY2FsbGVkCi0JICogYWNjZXNzRm9yUmVhZCgpIHRvIG9idGFpbiBhY2Nlc3MuCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbVJlYWQoKTsKLQotCS8qKgotCSAqIFJlbGVhc2Ugd3JpdGUgdGhlIGFjY2VzcyB0byB0aGlzIHJlc291cmNlLiBUaGlzIGNhbGwgZGVjcmVtZW50cyB0aGUgd3JpdGUgY291bnQgb2YgdGhpcwotCSAqIHJlc291cmNlIGFuZCB3aWxsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IGlmIHRoZSB1c2UgY291bnQgZ29lcyB0byAwLgotCSAqIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgYW5kIG9ubHkgYWZ0ZXIgdGhleQotCSAqIGhhdmUgY2FsbGVkIGFjY2Vzc0ZvcldyaXRlKCkgdG8gb2J0YWluIGFjY2Vzcy4KLQkgKi8KLQl2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgcmVzb3VyY2Ugb25seSBpZiB0aGUgd3JpdGUgY291bnQgaXMgZXF1YWwgdG8gMS4KLQkgKi8KLQl2b2lkIHNhdmVJZk5lY2Vzc2FyeSgpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIGRpcnR5IGFuZCBpcyBub3Qgc2hhcmVkIGZvciB3cml0ZS4KLQkgKi8KLQlib29sZWFuIG5lZWRzVG9TYXZlKCk7Ci0KLQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgd2Ugc2hvdWxkIGFsbG93IGEgcmVmcmVzaCB0byB0YWtlIHBsYWNlIGV2ZW4gd2hlbiB0aGlzIHJlc291cmNlIGlzIGRpcnR5LgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0Jdm9pZCBzZXRGb3JjZVJlZnJlc2goYm9vbGVhbiBiKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHdlIHNob3VsZCBhbGxvdyBhIHJlZnJlc2ggdG8gdGFrZSBwbGFjZSBldmVuIHdoZW4gdGhpcyByZXNvdXJjZSBpcyBkaXJ0eS4KLQkgKi8KLQlib29sZWFuIHNob3VsZEZvcmNlUmVmcmVzaCgpOwotCi0JYm9vbGVhbiB3YXNSZXZlcnRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9wZW4gcmVhZCBhY2Nlc3NlcyBvbiB0aGlzIHJlc291cmNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRSZWFkQ291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHdyaXRlIGFjY2Vzc2VzIG9uIHRoaXMgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFdyaXRlQ291bnQoKTsKLQotCS8qKgotCSAqIElmIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgYmVpbmcgYWNjZXNzZWQsIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIHJlc291cmNlIHNldC4KLQkgKi8KLQl2b2lkIHVubG9hZElmTmVjZXNzYXJ5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkxYzJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2xvYmFsQWRhcHRlckZhY3RvcmllczsKLQlwcm90ZWN0ZWQgTGlzdCBsb2NhbEFkYXB0ZXJGYWN0b3JpZXM7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIGEgbmV3IFJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbCNjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZG9DcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlhZGFwdE5ldyhyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkYXB0TmV3KFJlc291cmNlIHJlcykgewotCQlpZiAoZ2xvYmFsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKLQkJCQlmYWN0b3J5LmFkYXB0QWxsTmV3KHJlcyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsQWRhcHRlckZhY3Rvcmllcy5zaXplKCk7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGxvY2FsQWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyhyZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvY2FsIGFkYXB0ZXIgZmFjdG9yeSBpcyBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5b3UgdXNlIHRvIG9ubHkgYWRhcHQgdGhlIHJlc291cmNlCi0JICogc3BlY2lmaWMgdG8gdGhlIFJlc291cmNlRmFjdG9yeSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExvY2FsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAobG9jYWxBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpCi0JCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAobG9jYWxBZGFwdGVyRmFjdG9yaWVzICE9IG51bGwpCi0JCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEEgZ2xvYmFsIGFkYXB0ZXIgZmFjdG9yeSB3aWxsIGJlIHVzZWQgdG8gYWRhcHQgYW55IHJlc291cmNlIGNyZWF0ZWQgYnkgYW55IFJlc291cmNlRmFjdG9yeQotCSAqIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlR2xvYmFsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAoZ2xvYmFsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKQotCQkJZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5yZW1vdmUoZmFjdG9yeSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTYzNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZWRSZXNvdXJjZSB7Ci0JLy9UT0RPIEFkZCB0b1N0cmluZyBob29rCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX1NUUklORyA9ICJSZWZlcmVuY2VkWE1JUmVzb3VyY2UsIGZpbGUgPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09VTlRfVE9fU1RSSU5HID0gIiBSPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPVU5UX1RPX1NUUklORyA9ICIgVz0gIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgcmVhZFJlZmVyZW5jZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBlZGl0UmVmZXJlbmNlQ291bnQgPSAwOwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVJlZnJlc2g7Ci0JCi0JICBwdWJsaWMgc3RhdGljIGNsYXNzIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCBleHRlbmRzIEVBZGFwdGVyTGlzdAotCSAgewotCi0JICAgIHB1YmxpYyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCXN1cGVyKG5vdGlmaWVyKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5yZW1vdmUob2JqZWN0KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkKLQkgICAgewotCSAgICAgc3VwZXIuY2xlYXIoKTsKLQkgICAgfQotCi0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuc2V0KGluZGV4LCBvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgaW50IG9sZFBvc2l0aW9uKQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvbGRQb3NpdGlvbik7Ci0JICAgIH0KLQkgIH0KLQotCSAKLQkvKioKLQkgKiBSZWZlcmVuY2FibGVYTUlSZXNvdXJjZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjZ2V0UmVhZENvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlYWRDb3VudCgpIHsKLQkJcmV0dXJuIHJlYWRSZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNnZXRXcml0ZUNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdyaXRlQ291bnQoKSB7Ci0JCXJldHVybiBlZGl0UmVmZXJlbmNlQ291bnQ7Ci0JfQotCi0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yUmVhZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JCWNoZWNrRGVsZXRlZCgpOwotCQlpZiAoIWlzTmV3KCkpCi0JCQlyZWFkUmVmZXJlbmNlQ291bnQrKzsKLQkJaXNOZXcgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvcldyaXRlCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCWNoZWNrRGVsZXRlZCgpOwotCQllZGl0UmVmZXJlbmNlQ291bnQrKzsKLQkJaWYgKGlzTmV3KQotCQkJcmVsZWFzZUZyb21SZWFkKCk7Ci0JCWlzTmV3ID0gZmFsc2U7Ci0JCWlmICghaXNUcmFja2luZ01vZGlmaWNhdGlvbigpKQotCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGlzIHJlc291cmNlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEKLQkgKiBSZXNvdXJjZVNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0RlbGV0ZWQoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZVNldCgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihERUxFVEVEX0VSUk9SX01TRyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxlY3RDb250YWluZWRPYmplY3RzKGphdmEudXRpbC5MaXN0IGNvbGxlY3RpbmcsIEVPYmplY3QgcGFyZW50T2JqZWN0KSB7Ci0KLQkJamF2YS51dGlsLkl0ZXJhdG9yIGNoaWxkcmVuID0gcGFyZW50T2JqZWN0LmVDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjaGlsZHJlbi5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgY2hpbGRyZW4ubmV4dCgpOwotCQkJY29sbGVjdGluZy5hZGQoY2hpbGQpOwotCQkJY29sbGVjdENvbnRhaW5lZE9iamVjdHMoY29sbGVjdGluZywgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGVuc3VyZUZ1bGxJREh5ZHJhdGlvbigpIHsKLQkJTGlzdCBhbGxSZWZPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciByb290T2JqZWN0cyA9IGdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJvb3RPYmplY3RzLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSByb290T2JqZWN0cy5uZXh0KCk7Ci0JCQlhbGxSZWZPYmplY3RzLmFkZChjaGlsZCk7Ci0JCQljb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhhbGxSZWZPYmplY3RzLCBjaGlsZCk7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyID0gYWxsUmVmT2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0JCQlJRFV0aWwuYXNzaWduSUQoKEVPYmplY3QpIGl0ZXIubmV4dCgpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIGFjY2Vzc2VkLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgdW5sb2FkSWZOZWNlc3NhcnkoKSB7Ci0JCWlmICgoZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpIDw9IDApIHx8IChlZGl0UmVmZXJlbmNlQ291bnQgPD0gMCAmJiBpc01vZGlmaWVkKCkpKQotCQkJdW5sb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygd3JpdGUgYWNjZXNzZXMgdG8gdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRUb3RhbFJlZmVyZW5jZUNvdW50KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50ICsgcmVhZFJlZmVyZW5jZUNvdW50OwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNOZXcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQkJcmV0dXJuIGlzTmV3OwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNSZWFkT25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBlZGl0UmVmZXJlbmNlQ291bnQgPD0gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzU2hhcmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiBnZXRUb3RhbFJlZmVyZW5jZUNvdW50KCkgPiAxOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNTaGFyZWRGb3JXcml0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKSB7Ci0JCXJldHVybiBlZGl0UmVmZXJlbmNlQ291bnQgPiAxOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3ByZURlbGV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3JlbGVhc2VGcm9tUmVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVhZFJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChyZWFkUmVmZXJlbmNlQ291bnQgPCAwKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlYWQgcmVmZXJlbmNlIGNvdW50IGVycm9yOiAgIiArIHRoaXMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdW5sb2FkSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3JlbGVhc2VGcm9tV3JpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQllZGl0UmVmZXJlbmNlQ291bnQtLTsKLQkJaWYgKGVkaXRSZWZlcmVuY2VDb3VudCA8IDApCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV3JpdGUgcmVmZXJlbmNlIGNvdW50IGVycm9yOiAgIiArIHRoaXMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdW5sb2FkSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3NhdmVJZk5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoIWlzU2hhcmVkRm9yV3JpdGUoKSkgLy8gY2FsbGVyIGlzIHRoZSBvbmx5IHJlZmVyZW5jZXIKLQkJCXNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gVE9fU1RSSU5HICsgZ2V0VVJJKCkudG9TdHJpbmcoKSArIFJFQURfQ09VTlRfVE9fU1RSSU5HICsgbmV3IEludGVnZXIocmVhZFJlZmVyZW5jZUNvdW50KSArIFdSSVRFX0NPVU5UX1RPX1NUUklORyArIG5ldyBJbnRlZ2VyKGVkaXRSZWZlcmVuY2VDb3VudCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNuZWVkc1RvU2F2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNUb1NhdmUoKSB7Ci0JCXJldHVybiBpc01vZGlmaWVkKCkgJiYgIWlzU2hhcmVkRm9yV3JpdGUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3NldEZvcmNlUmVmcmVzaChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmNlUmVmcmVzaChib29sZWFuIGIpIHsKLQkJZm9yY2VSZWZyZXNoID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzaG91bGRGb3JjZVJlZnJlc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEZvcmNlUmVmcmVzaCgpIHsKLQkJcmV0dXJuIGZvcmNlUmVmcmVzaDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY0RvTG9hZChJbnB1dFN0cmVhbSBhcmcwLCBNYXAgYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBpc1RyYWNraW5nTW9kcyA9IGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmIChpc1RyYWNraW5nTW9kcykKLQkJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbihmYWxzZSk7Ci0JCQlzdXBlci5iYXNpY0RvTG9hZChhcmcwLCBhcmcxKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpc1RyYWNraW5nTW9kcykKLQkJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1VubG9hZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCWlmIChpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCkgJiYgZWRpdFJlZmVyZW5jZUNvdW50IDwgMSkgLy9kbyBub3QgdHVybiBvZmYgbW9kaWZpY2F0aW9uIGlmCi0JCQkvLyB3ZSBzdGlsbCBoYXZlIGEgd3JpdGUgY291bnQKLQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJc3VwZXIuZG9VbmxvYWQoKTsKLQkJc2V0Rm9yY2VSZWZyZXNoKGZhbHNlKTsKLQkJc2V0TW9kaWZpZWQoZmFsc2UpOyAvL2RjYiAtIHRoaXMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgcmVzb3VyY2VzIHdpdGhvdXQgZmlsZXMgYXJlCi0JCS8vIG1hcmtlZCBhcyBub3QgbW9kaWZpZWQuCi0JCWlmIChyZWFkUmVmZXJlbmNlQ291bnQgPT0gMCAmJiBlZGl0UmVmZXJlbmNlQ291bnQgPT0gMCkgewotCQkJZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJCQotCX0KLQotCi0JLyoqCi0JICogVGhlIHJlc291cmNlIGhhcyBiZWVuIHVubG9hZGVkLCBhbmQgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMuIFRyZWF0IHRoZSByZXNvdXJjZSBsaWtlIGEgbmV3Ci0JICogUmVzb3VyY2UKLQkgKi8KLQkvLyBuZXZlciB1c2VkCi0vLwlwcml2YXRlIHZvaWQgcmVzZXRBc05ldygpIHsKLS8vCQlyZWFkUmVmZXJlbmNlQ291bnQgPSAxOwotLy8JCWlzTmV3ID0gdHJ1ZTsKLS8vCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI3NhdmUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW5vdGlmeUFib3V0VG9TYXZlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci5zYXZlKG9wdGlvbnMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbm90aWZ5U2F2ZUZhaWxlZCgpOwotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2F2ZWQoKSB7Ci0JCW5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9XQVNfU0FWRUQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX0FCT1VUX1RPX1NBVkUpOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTYXZlRmFpbGVkKCkgewotICAgICAgICBub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfU0FWRV9GQUlMRUQpOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5U2F2ZUV2ZW50KGludCBldmVudFR5cGUpIHsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCSAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9Ci0JCQluZXcgTm90aWZpY2F0aW9uSW1wbChldmVudFR5cGUsIHRoaXMsIHRoaXMpCi0JCQl7Ci0JCQkgIHB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKQotCQkJICB7Ci0JCQkJcmV0dXJuIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwudGhpczsKLQkJCSAgfQotCQkJICBwdWJsaWMgaW50IGdldEZlYXR1cmVJRChDbGFzcyBleHBlY3RlZENsYXNzKQotCQkJICB7Ci0JCQkJcmV0dXJuIGV2ZW50VHlwZTsKLQkJCSAgfQotCQkJfTsKLQkJCWVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVmZXJlbmNlZFJlc291cmNlI3dhc1JldmVydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YXNSZXZlcnRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgRUxpc3QgZUFkYXB0ZXJzKCkKLQkgIHsKLQkgICAgaWYgKGVBZGFwdGVycyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUFkYXB0ZXJzID0gIG5ldyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QodGhpcyk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGVBZGFwdGVyczsKLQkgIH0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5YzM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBkZWZpbmVzIHRoZSBhcGkgZm9yIHJlbmRlcmluZyBhbiBFTUYgb2JqZWN0IHRvIFhNTCBhbmQgdmljZSB2ZXJzYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFBfU0NIRU1BX0xBTkdVQUdFID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheHAvcHJvcGVydGllcy9zY2hlbWFMYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFczQ19YTUxfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCi0Jdm9pZCBzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UgYVJlc291cmNlKTsKLQotCVRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotCi0Jdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JYm9vbGVhbiB1c2VTdHJlYW1zRm9ySU8oKTsKLQotCXZvaWQgcHJlcGFyZVRvQWRkQ29udGVudHMoKTsKLQotCWludCBnZXRWZXJzaW9uSUQoKTsKLQotCWJvb2xlYW4gaXNNb2RpZmllZCgpOwotCi0Jdm9pZCBhY2Nlc3NGb3JXcml0ZSgpOwotCi0Jdm9pZCBhY2Nlc3NGb3JSZWFkKCk7Ci0KLQl2b2lkIHJlbGVhc2VGcm9tUmVhZCgpOwotCi0Jdm9pZCByZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQl2b2lkIHByZURlbGV0ZSgpOwotCi0Jdm9pZCBwcmVVbmxvYWQoKTsKLQotCWJvb2xlYW4gaXNTaGFyZWQoKTsKLQotCWJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpOwotCi0Jdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKTsKLQkKLQlib29sZWFuIGlzQmF0Y2hNb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjI5NGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbmRlcmVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgUmVuZGVyZXIgY3JlYXRlUmVuZGVyZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIFJlbmRlcmVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgZGVmYXVsdEhhbmRsZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBJbnRlcmVzdGVkIHBhcnRpZXMgY2FuIHVzZSB0aGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIE5vdGlmaWVyIE5vdGlmaWNhdGlvbkVuZ2luZSA9IE5vdGlmaWVyLklOU1RBTkNFOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCWlmIChkZWZhdWx0UmVuZGVyZXJGYWN0b3J5ID09IG51bGwpCi0JCQlkZWZhdWx0UmVuZGVyZXJGYWN0b3J5ID0gZ2V0RGVmYXVsdEhhbmRsZXIoKS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBkZWZhdWx0UmVuZGVyZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiXG5cbioqKlNldHRpbmcgZmFjdG9yeTogIiArIGZhY3RvcnkpOwotCQlOb3RpZmljYXRpb25FbmdpbmUubm90aWZ5TGlzdGVuZXJzKGZhY3RvcnkpOwotCQlkZWZhdWx0UmVuZGVyZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJlbmRlcmVyRmFjdG9yeSBpbnN0YW5jZTogIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOb3RpZmllciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm90aWZpZXIgSU5TVEFOQ0UgPSBuZXcgTm90aWZpZXIoKTsKLQotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgTm90aWZpZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeSkgewotCi0JCQlmaW5hbCBpbnQgbGVuZ3RoID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLnNpemUoKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZnlpbmcgIiArIGxlbmd0aCArICIgbGlzdGVuZXJzIik7Ci0KLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBTaW5jZSB0aGUgcmVuZGVyZXIgZmFjdG9yaWVzIGFyZSBzaW5nbGV0b25zLCB0aGlzIHJlZmVyZW5jZSBjaGVjayBzaG91bGQgYWx3YXlzCi0JCQkJICogd29yawotCQkJCSAqLwotCQkJCWlmIChyZW5kZXJlckZhY3RvcnkgIT0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkgewotCQkJCQlXZWFrUmVmZXJlbmNlIHdyZWYgPSBudWxsOwotCQkJCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCQkJCXN5bmNocm9uaXplZCAocmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJd3JlZiA9IChXZWFrUmVmZXJlbmNlKSBpLm5leHQoKTsKLQkJCQkJCQlsaXN0ZW5lciA9IChMaXN0ZW5lcikgd3JlZi5nZXQoKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90aWZ5aW5nIExpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQkJCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCQkJCQlsaXN0ZW5lci51cGRhdGVSZW5kZXJlckZhY3RvcnkocmVuZGVyZXJGYWN0b3J5KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWkucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGxpc3RlbmVyOiAiICsgbCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgewotCQkJCXJlc291cmNlRmFjdG9yeUxpc3RlbmVycy5hZGQobmV3IFdlYWtSZWZlcmVuY2UobCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXJUb1JlbW92ZSkgewotCQkJZmluYWwgaW50IGxlbmd0aCA9IHJlc291cmNlRmFjdG9yeUxpc3RlbmVycy5zaXplKCk7Ci0JCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCVdlYWtSZWZlcmVuY2Ugd3JlZiA9IG51bGw7Ci0JCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQkJCXN5bmNocm9uaXplZCAocmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlRmFjdG9yeUxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCXdyZWYgPSAoV2Vha1JlZmVyZW5jZSkgaS5uZXh0KCk7Ci0JCQkJCQlsaXN0ZW5lciA9IChMaXN0ZW5lcikgd3JlZi5nZXQoKTsKLQkJCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGxpc3RlbmVyID09IGxpc3RlbmVyVG9SZW1vdmUpIHsKLQkJCQkJCQkJaS5yZW1vdmUoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLQkJdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBnZXREZWZhdWx0SGFuZGxlcigpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpCi0JCQlkZWZhdWx0SGFuZGxlciA9IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRTsKLQkJcmV0dXJuIGRlZmF1bHRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRIYW5kbGVyKFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVkZjRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0JUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5ODRjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgewotCQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIGZpbGVVUkkuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBkZWNsYXJlcyBhIHJlc291cmNlIGZhY3RvcnkgYXBwbGljYWJsZSB0byB0aGUgZ2l2ZW4gVVJJLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnRlbnRUeXBlIGlzIG9uZSBvcHRpb25hbCB3YXkgdGhhdCBhIFJlc291cmNlRmFjdG9yeQotCSAqIG1pZ2h0IGFwcGx5IHRvIGEgVVJJLiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBpc0VuYWJsZWRGb3J9IAotCSAqIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBjb250ZW50IFR5cGVzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgcmV0dXJuIG51bGwuKG9wdGlvbmFsKTwvYj48L3A+Ci0JICogIAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgdHlwZSB0aGF0IHRoaXMgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEluIHRoZSBjYXNlIHdoZXJlIG1vcmUgdGhhbiBvbmUgZmFjdG9yeSBpcyBkZWZpbmVkIGZvciB0aGUgc2FtZSBmaWxlTmFtZSwgCi0JICogYW5kIGNyZWF0aW9uIGlzIHBhc3NlZCBhIHVyaSBvbmx5IGEgZGVmYXVsdCBmYWN0b3J5IGlzIG5lZWRlZAotCSAqIAotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBib29sZWFuIGRlc2NyaWJpbmcgdGhlIGRlZmF1bHQgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHNob3J0IHNlZ21lbnQgaXMgb25lIHBvc3NpYmxlIHdheSB0aGF0IGEgUmVzb3VyY2VGYWN0b3J5Ci0JICogbWlnaHQgYXBwbHkgdG8gYSBVUkkuIENsaWVudHMgc2hvdWxkIGNhbGwge0BsaW5rIGlzRW5hYmxlZEZvcn0gCi0JICogaW5zdGVhZCBvZiBjb21wYXJpbmcgdGhlIHNob3J0IHNlZ21lbnRzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgTk9UIHJldHVybiBudWxsLjwvYj48L3A+Ci0JICogIAotCSAqIEByZXR1cm4gVGhlIHNob3J0IHNlZ21lbnQgdGhhdCB0aGlzIGRlc2NyaXB0b3IgaXMgYXBwbGljYWJsZSB0by4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNob3J0U2VnbWVudCgpOwotCQotCQotCS8qKgotCSAqIFRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIFJlc291cmNlLkZhY3RvcnkuIFRoZSBpbnN0YW5jZSByZXR1cm5lZAotCSAqIG1heSBvciBtYXkgbm90IGJlIHVuaXF1ZSwgc28gaWYgeW91IHJlcXVpcmUgdGhlIHNhbWUgaW5zdGFuY2UgCi0JICogZm9yIGVhY2ggY2FsbCwgeW91IHNob3VsZCBjYWNoZSB0aGUgdmFsdWUgcmV0dXJuZWQgdGhlIGZpcnN0Ci0JICogdGltZSBmcm9tIHRoaXMgbWV0aG9kLiAKLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFJlc291cmNlLkZhY3RvcnkuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFJlc291cmNlLkZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpOwotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRTaG9ydFNlZ21lbnQoKS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyBpbnN0YW5jZW9mIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpCi0JCQlyZXR1cm4gZ2V0U2hvcnRTZWdtZW50KCkuZXF1YWxzKCgoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcilvKS5nZXRTaG9ydFNlZ21lbnQoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Sb290VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NDBlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Sb290VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBSb290VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJvb3RUcmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgUm9vdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUoTm90aWZpZXIsIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQkoKFJlc291cmNlKSBvd25lcikuZ2V0Q29udGVudHMoKS5hZGQobmV3SW5kZXgsIChFT2JqZWN0KXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3JlbW92ZU1PRlZhbHVlKE5vdGlmaWVyLCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkoKFJlc291cmNlKSBvd25lcikuZ2V0Q29udGVudHMoKS5yZW1vdmUodmFsdWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKFJlc291cmNlIHJlcywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KXZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTXVsdGlWYWx1ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlWYWx1ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Tb3VyY2VMaW5rVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkNjk3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Tb3VyY2VMaW5rVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlTGlua1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JCWZTdHlsZSB8PSBzdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCi0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCWlmIChzdHJWYWx1ZSAhPSBudWxsKQotCQkJLy8gRmluZCB0aGUgb2JqZWN0IHdpdGggdGhlIG5hbWUgdGhhdCBtYXRjaGVzIG1hdGNoTmFtZQotCQkJdmFsdWUgPSBmVHJhbnNsYXRvclBhdGhzWzBdLmZpbmRPYmplY3Qob3duZXIsIHN0clZhbHVlLnRyaW0oKSk7Ci0JCWlmICgoZlN0eWxlICYgVHJhbnNsYXRvci5TVFJJTkdfUkVTVUxUX09LKSAhPSAwKQotCQkJcmV0dXJuICgodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IHN0clZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCVRyYW5zbGF0b3JQYXRoIHBhdGggPSBmVHJhbnNsYXRvclBhdGhzWzBdOwotCQlPYmplY3QgYXR0clZhbHVlID0gcGF0aC5nZXRMYXN0TWFwKCkuZ2V0TU9GVmFsdWUoKEVPYmplY3QpIHZhbHVlKTsKLQkJcmV0dXJuIHBhdGguZ2V0TGFzdE1hcCgpLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGF0dHJWYWx1ZSwgb3duZXIpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FmNGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogRGVjbGFyZXMgYSBzdWJjbGFzcyB0byBjcmVhdGUgUmVzb3VyY2UuRmFjdG9yeShpZXMpIGZyb20gYW4gZXh0ZW5zaW9uLiAKLSAqLwotY2xhc3MgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBleHRlbmRzIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNob3J0U2VnbWVudDsKLQlwcml2YXRlIGZpbmFsIFJlc291cmNlLkZhY3RvcnkgZmFjdG9yeTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2hvcnRTZWdtZW50IEEgbm9uLW51bGwgbmFtZSBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZhY3RvcnkKLQkgKiBAcGFyYW0gZmFjdG9yeSBBIG5vbi1udWxsIFJlc291cmNlLkZhY3RvcnkgdGhhdCBjYW4gbG9hZCBmaWxlcyBvZiB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKFN0cmluZyBzaG9ydFNlZ21lbnQsIFJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNob3J0U2VnbWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeSk7Ci0JCXRoaXMuc2hvcnRTZWdtZW50ID0gc2hvcnRTZWdtZW50OwotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0gIAotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKFVSSSBmaWxlVVJJKSB7Ci0JCS8qIHNob3J0U2VnbWVudCBtdXN0IGJlIG5vbi1udWxsIGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBjcmVhdGVkLCAKLQkJICogYSB2YWxpZGF0aW9uIGNoZWNrIGluIGluaXQoKSB2ZXJpZmllcyB0aGlzIHJlcXVpcmVtZW50ICovCi0JCWlmKGZpbGVVUkkgIT0gbnVsbCAmJiBmaWxlVVJJLmxhc3RTZWdtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBzaG9ydFNlZ21lbnQuZXF1YWxzKGZpbGVVUkkubGFzdFNlZ21lbnQoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IAotCQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0JCSByZXR1cm4gZmFjdG9yeTsJCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0U2VnbWVudCgpIHsKLQkJcmV0dXJuIHNob3J0U2VnbWVudDsKLQl9ICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyODA3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PX1NUWUxFID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBET01fQVRUUklCVVRFID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTVBUWV9UQUcgPSAxIDw8IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0RBVEFfQ09OVEVOVCA9IDEgPDwgMjsKLQkvKioKLQkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW5kIHRhZyBzaG91bGQgTk9UIGJlIGluZGVudGVkOyBieSBkZWZhdWx0IGl0IGlzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVORF9UQUdfTk9fSU5ERU5UID0gMSA8PCAzOwotCS8qKgotCSAqIFN0eWxlIGJpdCB0aGF0IGluZGljYXRlcyB0aGF0IGJvb2xlYW5zIHNob3VsZCBOT1QgYmUgY29udmVydGVkIGFzICJUcnVlIiBhbmQgIkZhbHNlIjsgZGVmYXVsdAotCSAqIGlzIHRoYXQgdGhleSBhcmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCT09MRUFOX0xPV0VSQ0FTRSA9IDEgPDwgNDsKLQkvKioKLQkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgYW4gZW51bSB2YWx1ZSBjb250YWlucyBoeXBoZW5zIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiBpbnRlcm5hbGx5IHRoZQotCSAqIGh5cGhlbnMgYXJlIHJlcGxhY2VkIHdpdGggdW5kZXJzY29yZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TID0gMSA8PCA1OwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgT0JKRUNUX01BUCA9IDEgPDwgNjsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBCT09MRUFOX0ZFQVRVUkUgPSAxIDw8IDc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTSEFSRURfUkVGRVJFTkNFID0gMSA8PCA4OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIGZlYXR1cmUgbWF5IGJlIHNpZ25pZmljYW50IGV2ZW4gaWYgaXQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTVBUWV9DT05URU5UX0lTX1NJR05JRklDQU5UID0gMSA8PCA5OwotCi0JLyoqCi0JICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGZlYXR1cmUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWVudCBub2RlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQ09NTUVOVF9GRUFUVVJFID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIGFuIGVVbnNldCgpIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOU0VUX0lGX05VTEwgPSAxIDw8IDExOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvbnRlbnRzIGFzIGEgU3RyaW5nIGlmIHRoZSBmZWF0dXJlIGlzIHVucmVzb2x2ZWFibGUgKFVzZWQgYnkgdGhlCi0JICogU291cmNlTGlua1RyYW5zbGF0b3IpCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RSSU5HX1JFU1VMVF9PSyA9IDEgPDwgMTI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZkRPTU5hbWVzOwotCXByb3RlY3RlZCBTdHJpbmcgZkRPTVBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBNYXAgcmVhZEFoZWFkTmFtZXM7Ci0JcHJvdGVjdGVkIGludCBmU3R5bGUgPSBOT19TVFlMRTsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JcHJvdGVjdGVkIFRyYW5zbGF0b3JQYXRoW10gZlRyYW5zbGF0b3JQYXRoczsKLQlwcm90ZWN0ZWQgRUNsYXNzIGVtZkNsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWVTcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8gYWRkZWQgYnkgTURFCi0JcHJvdGVjdGVkIFN0cmluZyBkb21OYW1lQW5kUGF0aCA9IG51bGw7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYW55IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIFRyYW5zbGF0b3IgYXJlIHRoZW1zZWx2ZXMgRGVwZW5kZW5jeVRyYW5zbGF0b3JzCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNEZXBlbmRlbmN5UGFyZW50OwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZGVwZW5kZW5jeUZlYXR1cmU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFY29yZVBhY2thZ2UgRUNPUkVfUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkvLyBVc2UgdGhpcyBpZGVudGlmaWVyIGZvciB0aGUgRE9NTmFtZSB3aGVuIHRoZSBhdHRyaWJ1dGUKLQkvLyB2YWx1ZSBpcyB0byBiZSBleHRyYWN0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgdGV4dCBvZiB0aGUgbm9kZS4KLQkvLyBUaGlzIGlzIHJhcmUsIGJ1dCBvY2N1cnMgaW4gdGhlIHdlYi54bWwgaW4gdGhlIGNhc2Ugb2YgYQotCS8vIFdlbGNvbWVGaWxlLgotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIFRFWFRfQVRUUklCVVRFX1ZBTFVFID0gIiRURVhUX0FUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIENPTlRBSU5FUl9GRUFUVVJFID0gbmV3IENvbnRhaW5lckZlYXR1cmUoKTsKLQotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIFJPT1RfRkVBVFVSRSA9IG5ldyBSb290RmVhdHVyZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb250YWluZXJGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7Ci0JCXByb3RlY3RlZCBDb250YWluZXJGZWF0dXJlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUm9vdEZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKLQkJcHJvdGVjdGVkIFJvb3RGZWF0dXJlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGZpbmRDaGlsZChTdHJpbmcgdGFnTmFtZSwgT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCi0JCVRyYW5zbGF0b3IgcmVzdWx0ID0gbnVsbDsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZHJlbih0YXJnZXQsIHZlcnNpb25JRCk7Ci0KLQkJaWYgKG1hcHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJhbnNsYXRvciBtYXAgPSBtYXBzW2ldOwotCQkJCWlmIChtYXAuaXNNYXBGb3IodGFnTmFtZSkpIHsKLQkJCQkJcmVzdWx0ID0gbWFwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBnZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsICYmIGZhY3RvcnkuYWNjZXB0cyh0YWdOYW1lKSkgewotCQkJCXJlc3VsdCA9IGZhY3RvcnkuY3JlYXRlKHRhZ05hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gc3RyaW5nIHRvZ2V0aGVyIGFycmF5cyBvZiBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoYXJyYXkxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhcnJheTEubGVuZ3RoICsgYXJyYXkyLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gbmV3IE9iamVjdFtde29iamVjdDJ9OwotCQlyZXR1cm4gY29uY2F0KGFycmF5MSwgbmV3QXJyYXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQYXJlbnRBbmRUZXh0QXR0cmlidXRlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHBhcmVudEZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcGFyZW50ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIHBhcmVudEZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQkJcGFyZW50LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW117bmV3IFRyYW5zbGF0b3IoVEVYVF9BVFRSSUJVVEVfVkFMVUUsIGNoaWxkRmVhdHVyZSl9KTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJc2V0RU1GQ2xhc3MoZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpbml0aWFsaXplRE9NTmFtZUFuZFBhdGgoZG9tTmFtZUFuZFBhdGgpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgRUNsYXNzIGVDbGFzcykgewotCQl0aGlzKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JCXNldEVNRkNsYXNzKGVDbGFzcyk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJdGhpcyhkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIG5ldyBUcmFuc2xhdG9yUGF0aFtde3BhdGh9KTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGhbXSBwYXRocykgewotCQlpbml0aWFsaXplRE9NTmFtZUFuZFBhdGgoZG9tTmFtZUFuZFBhdGgpOwotCQlmVHJhbnNsYXRvclBhdGhzID0gcGF0aHM7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJZlN0eWxlID0gc3R5bGU7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWNvcmVQYWNrYWdlIGdldEVjb3JlUGFja2FnZSgpIHsKLQkJcmV0dXJuIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gZkRPTU5hbWVzWzBdOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRET01OYW1lcygpIHsKLQkJcmV0dXJuIGZET01OYW1lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERPTVBhdGgoKSB7Ci0JCXJldHVybiBmRE9NUGF0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNET01QYXRoKCkgewotCQlyZXR1cm4gZkRPTVBhdGggIT0gbnVsbCAmJiBmRE9NUGF0aC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIERPTSBuYW1lcyBhbmQgcGF0aCBvdXQgb2YgPGRvbU5hbWVBbmRQYXRoPmFuZCBzZXQgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRE9NTmFtZUFuZFBhdGgoU3RyaW5nIGRvbU5hbWVBbmRQYXRoQXJnKSB7Ci0JCWlmIChkb21OYW1lQW5kUGF0aEFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW54ID0gZG9tTmFtZUFuZFBhdGhBcmcubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGlueCAhPSAtMSkgewotCQkJZkRPTU5hbWVzID0gcGFyc2VET01OYW1lcyhkb21OYW1lQW5kUGF0aEFyZy5zdWJzdHJpbmcoaW54ICsgMSkpOwotCQkJZkRPTVBhdGggPSBkb21OYW1lQW5kUGF0aEFyZy5zdWJzdHJpbmcoMCwgaW54KTsKLQkJfSBlbHNlIHsKLQkJCWZET01OYW1lcyA9IHBhcnNlRE9NTmFtZXMoZG9tTmFtZUFuZFBhdGhBcmcpOwotCQkJZkRPTVBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGFkZGVkIGJ5IE1ERQotCQl0aGlzLmRvbU5hbWVBbmRQYXRoID0gZG9tTmFtZUFuZFBhdGhBcmc7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgd3JpdHRlbiBhcyBhbiBlbXB0eSB0YWc7IGVnLCA8ZGlzdHJpYnV0YWJsZS8+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDREFUQUNvbnRlbnQoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQ0RBVEFfQ09OVEVOVCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRE9NTmFtZSByZXByZXNlbnRzIGEgc3ViIGVsZW1lbnQgbmFtZSBvciBhbiBhdHRyaWJ1dGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBET01OYW1lIGlzIGFuIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRE9NQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIERPTV9BVFRSSUJVVEUpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgYW4gZW1wdHkgdGFnOyBlZywgPGRpc3RyaWJ1dGFibGUvPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlUYWcoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRU1QVFlfVEFHKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblVwcGVyY2FzZSgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBCT09MRUFOX0ZFQVRVUkUpICE9IDAgJiYgKGZTdHlsZSAmIEJPT0xFQU5fTE9XRVJDQVNFKSA9PSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhbkZlYXR1cmUoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQk9PTEVBTl9GRUFUVVJFKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudEVuZFRhZygpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBFTkRfVEFHX05PX0lOREVOVCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzaG91bGRJbmRlbnRFbmRUYWcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkgewotCQlyZXR1cm4gKChmU3R5bGUgJiBFTVBUWV9UQUcpICE9IDApIHx8ICgoZlN0eWxlICYgRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIGlzIHRvIGFub3RoZXIgTU9GIG9iamVjdCAobm90IGEgcHJpbWl0aXZlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2JqZWN0TWFwKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIE9CSkVDVF9NQVApICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIHNoYXJlZCByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBTSEFSRURfUkVGRVJFTkNFKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW51bVdpdGhIeXBoZW5zKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEVOVU1fRkVBVFVSRV9XSVRIX0hZUEhFTlMpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1hcCByZXByZXNlbnRzIGEgY2FzZSB3aGVyZSB0aGUgdGV4dCBvZiB0aGUgRE9NTm9kZSByZXByZXNlbnRzIHRoZQotCSAqIG9iamVjdHMgb25lIGFuZCBvbmx5IGF0dHJpYnV0ZSB2YWx1ZS4gQW4gZXhhbXBsZSBvZiB0aGlzIGNhc2UgaXMgYSA8d2VsY29tZS1maWxlPmZpbGUudHh0Ci0JICogPC93ZWxjb21lLWZpbGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRE9NVGV4dFZhbHVlKCkgewotCQlyZXR1cm4gZkRPTU5hbWVzWzBdID09IFRFWFRfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZCBpcyB0aGUgbW9mIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBiZSBzZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJRE1hcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZCBpcyB0aGUgbW9mIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBiZSBzZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rTWFwKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0b3JQYXRocyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0TGlua01hcCgpIHsKLQkJcmV0dXJuIGlzTGlua01hcCgpICYmICFpc09iamVjdE1hcCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbWFwIGlzIHRoZSBvbmUgcmVwcmVzZW50aW5nIGEgbm9kZSB3aXRoIHRoZSBuYW1lIDxkb21OYW1lPi4gQnkgZGVmYXVsdAotCSAqIHRoaXMgbWV0aG9kIHNpbXBseSBjb21wYXJlcyB0aGUgRE9NIG5hbWUgb2YgdGhlIG1hcCBhZ2FpbnN0IHRoZSA8ZG9tTmFtZT5wYXJhbWV0ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZG9tTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKFN0cmluZyBkb21OYW1lKSB7Ci0JCWlmIChkb21OYW1lLmVxdWFscyhnZXRET01QYXRoKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkRPTU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZG9tTmFtZS5lcXVhbHMoZkRPTU5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBhRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBmZWF0dXJlIGJlaW5nIG1hcHBlZCBpcyBhIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGZlYXR1cmUgaXMgbXVsdGkgdmFsdWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlWYWx1ZWQoKSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQlyZXR1cm4gZmVhdHVyZS5pc01hbnkoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBjb21tYSBzZXBhcmF0ZWQgbmFtZXMgZnJvbSA8ZG9tTmFtZXNTdHJpbmc+LiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRvbU5hbWVzU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHBhcnNlRE9NTmFtZXMoU3RyaW5nIGRvbU5hbWVzU3RyaW5nKSB7Ci0JCWludCBzdGFydElueCA9IDA7Ci0JCWludCBpbnggPSBkb21OYW1lc1N0cmluZy5pbmRleE9mKCcsJyk7Ci0JCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJd2hpbGUgKGlueCAhPSAtMSkgewotCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcuc3Vic3RyaW5nKHN0YXJ0SW54LCBpbngpKTsKLQkJCXN0YXJ0SW54ID0gaW54ICsgMTsKLQkJCWlueCA9IGRvbU5hbWVzU3RyaW5nLmluZGV4T2YoJywnLCBzdGFydElueCk7Ci0JCX0KLQkJaWYgKHN0YXJ0SW54ID09IDApCi0JCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZyk7Ci0JCWVsc2UKLQkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydElueCkpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNuID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpID0gY24ubGFzdEluZGV4T2YoJy4nKTsKLQkJY24gPSBjbi5zdWJzdHJpbmcoKytpLCBjbi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZChjbik7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQoZkRPTU5hbWVzWzBdKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCBmRE9NTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCXNiLmFwcGVuZCgnfCcpOwotCQkJc2IuYXBwZW5kKGZET01OYW1lc1tqXSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcsJyk7Ci0JCXNiLmFwcGVuZChoYXNoQ29kZSgpKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFRyYW5zbGF0b3JQYXRoLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFRyYW5zbGF0b3JQYXRoCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JQYXRoW10gZ2V0VHJhbnNsYXRvclBhdGhzKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0b3JQYXRoczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNsYXRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRyYW5zbGF0b3IgbWFwSW5mbyA9IChUcmFuc2xhdG9yKSBvYmplY3Q7Ci0JCXJldHVybiBmRE9NTmFtZXMuZXF1YWxzKG1hcEluZm8uZ2V0RE9NTmFtZXMoKSkgJiYgKGZlYXR1cmUgPT0gbnVsbCAmJiBtYXBJbmZvLmdldEZlYXR1cmUoKSA9PSBudWxsIHx8IGZlYXR1cmUuZXF1YWxzKG1hcEluZm8uZ2V0RmVhdHVyZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaXNNYW5hZ2VkQnlQYXJlbnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihudWxsLCAtMSkgPT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEluIHRoZSA5OSUgY2FzZSB0aGVyZSBpcyBvbmx5IG9uZSBub2RlIG5hbWUgdG8gYmUgY29uY2VybmVkIHdpdGgsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqIGZvciB0aGUgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZG9tIG5hbWVzIG1hcCB0byBvbmUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCWlmIChlbWZDbGFzcyA9PSBudWxsKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdChmZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KGVtZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBjcmVhdGVFTUZPYmplY3QoKChFUmVmZXJlbmNlKSBhRmVhdHVyZSkuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChFQ2xhc3MgYW5FQ2xhc3MpIHsKLQkJaWYgKGFuRUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFuRUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShhbkVDbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoU3RyaW5nIHRleHRWYWx1ZSwgTm90aWZpZXIgb3duZXIsIGludCB2ZXJzaW9uSWQpIHsKLQkJVHJhbnNsYXRvciB0ZXh0VHJhbnNsYXRvciA9IHRoaXMuZmluZENoaWxkKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIG93bmVyLCB2ZXJzaW9uSWQpOwotCQlpZiAodGV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdFZhbHVlID0gdGV4dFRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUodGV4dFZhbHVlLCAoRU9iamVjdCkgb3duZXIpOwotCQkJdGV4dFRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUob3duZXIsIG9iamVjdFZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBmZWF0dXJlIGlzIHZhbGlkIG9uIGEgcGFydGljdWxhciBtb2ZPYmplY3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIHNwZWNpZmllZCBleGlzdHMgb24gdGhlIE1PRiBvYmplY3QuCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVtZk9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZS5nZXROYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRvcnMgd2hpY2ggZG8gbm90IGhhdmUgYSBmZWF0dXJlIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIGN1c3RvbSBiZWhhdmlvci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoaXNFbXB0eVRhZygpICYmIGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy9GYWtlIGl0IG91dCB3aXRoIGEgdmFsdWUgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUsIFN0cmluZyB2YWx1ZSwgTm90aWZpZXIgb3duZXIpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCWlmICghdGhpcy5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRU1GT2JqZWN0KG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY29udmVydFN0cmluZ1RvVmFsdWUodmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSBzdHJWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChpc0VudW1XaXRoSHlwaGVucygpKQotCQkJCXN0clZhbHVlID0gc3RyVmFsdWUucmVwbGFjZSgnLScsICdfJyk7Ci0JCQlpZiAoIWlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQlzdHJWYWx1ZSA9IHN0clZhbHVlLnRyaW0oKTsKLQkJCX0KLQkJfQotCQlPYmplY3QgdmFsdWUgPSBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuREVGQVVMVC5jb252ZXJ0VmFsdWUoc3RyVmFsdWUsIGZlYXR1cmUpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKGlzRW1wdHlUYWcoKSAmJiAhaXNET01BdHRyaWJ1dGUoKSAmJiAhaXNET01UZXh0VmFsdWUoKSAmJiBpc0Jvb2xlYW5GZWF0dXJlKCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCUVPYmplY3QgY29udmVydFRvVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChjb252ZXJ0VG9UeXBlID09IG51bGwpCi0JCQkJdmFsdWUgPSBzdHJWYWx1ZTsKLQkJCWVsc2UgaWYgKGNvbnZlcnRUb1R5cGUuZXF1YWxzKGdldEVjb3JlUGFja2FnZSgpLmdldEVTdHJpbmcoKSkpIHsKLQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgdmFsdWUgb2YgYSBzcGVjaWZpZWQgdHlwZSB0byBhIHN0cmluZyB2YWx1ZS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgZm9yIHNwZWNpYWwKLQkgKiBjYXNlcyB3aGVyZSBzcGVjaWFsIGNvbnZlcnNpb24gbmVlZHMgdG8gb2NjdXIgYmFzZWQgb24gdGhlIGZlYXR1cmUgYW5kIG9yIG9iamVjdCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBjb252ZXJ0ZWQgdmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBjb252ZXJ0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChpc0VtcHR5VGFnKCkgfHwgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChpc0VudW1XaXRoSHlwaGVucygpKQotCQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgnXycsICctJyk7Ci0JCWVsc2UgaWYgKGlzQm9vbGVhblVwcGVyY2FzZSgpKQotCQkJcmV0dXJuICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpID8gIlRydWUiIDogIkZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRWYXJpYWJsZUNoaWxkcmVuKE5vdGlmaWVyIHRhcmdldCwgaW50IHZlcnNpb24pIHsKLQkJVHJhbnNsYXRvcltdIHJlc3VsdHMgPSBudWxsOwotCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBnZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCUxpc3QgdmFyaWFibGVUcmFuc2xhdG9ycyA9IGZhY3RvcnkuY3JlYXRlKHRhcmdldCk7Ci0JCQlpZiAodmFyaWFibGVUcmFuc2xhdG9ycyAhPSBudWxsICYmIHZhcmlhYmxlVHJhbnNsYXRvcnMuc2l6ZSgpID4gMCkgewotCQkJCU9iamVjdFtdIHZ0b2EgPSB2YXJpYWJsZVRyYW5zbGF0b3JzLnRvQXJyYXkoKTsKLQotCQkJCXJlc3VsdHMgPSBuZXcgVHJhbnNsYXRvclt2dG9hLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJCQlyZXN1bHRzW2ldID0gKFRyYW5zbGF0b3IpIHZ0b2FbaV07Ci0JCQl9Ci0KLQkJfQotCQlpZiAocmVzdWx0cyA9PSBudWxsKQotCQkJcmVzdWx0cyA9IG5ldyBUcmFuc2xhdG9yWzBdOwotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG51bGwgYnkgZGVmYXVsdDsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIHNwZWNpZmljIGNoaWxkcmVuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbigpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBNT0YgY2hpbGRyZW4gdGhhdCBjdXJyZW50bHkgZXhpc3QgZm9yIHRoZSB2YWx1ZXMgb2YgYW4gYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJTGlzdCByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZiAoaXNNdWx0aVZhbHVlZCgpKQotCQkJcmVzdWx0ID0gKExpc3QpIHZhbHVlOwotCQllbHNlIGlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2YWx1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2ZPYmplY3QuZUdldChmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgdmFsdWUgb2YgYSBmZWF0dXJlIGluIGEgbW9mIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJaWYgKChmU3R5bGUgJiBVTlNFVF9JRl9OVUxMKSAhPSAwICYmIHZhbHVlID09IG51bGwpCi0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuZVVuc2V0T3JSZW1vdmUoKEVPYmplY3QpIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuZVNldE9yQWRkKChFT2JqZWN0KSBvd25lciwgZmVhdHVyZSwgdmFsdWUsIG5ld0luZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJc2V0TU9GVmFsdWUoKEVPYmplY3QpIG93bmVyLCB2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJc2V0TU9GVmFsdWUoKFJlc291cmNlKSBvd25lciwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvLwkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJLy8JCQllbWZPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCXNldE1PRlZhbHVlKGVtZk9iamVjdCwgdmFsdWUsIC0xKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShSZXNvdXJjZSByZXMsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJRXh0ZW5kZWRFY29yZVV0aWwuZVVuc2V0T3JSZW1vdmUoKEVPYmplY3QpIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlib29sZWFuIGlzU2V0ID0gZmVhdHVyZSAhPSBudWxsICYmIGVtZk9iamVjdC5lSXNTZXQoZmVhdHVyZSk7Ci0JCWlmIChpc0VtcHR5VGFnKCkpCi0JCQlyZXR1cm4gaXNTZXQgJiYgKChCb29sZWFuKSBlbWZPYmplY3QuZUdldChmZWF0dXJlKSkuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiBpc1NldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQllbWZPYmplY3QuZVVuc2V0KGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJKChMaXN0KSBtb2ZPYmplY3QuZUdldChmZWF0dXJlKSkuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBhRmVhdHVyZTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy9UaGlzIHdheSBhbiBpbnN0YW5jZSBjaGVjayBoYXBwZW5zIG9ubHkgb25jZQotCQlpZiAoYUZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQlmU3R5bGUgfD0gT0JKRUNUX01BUDsKLQkJCWlmICghKChFUmVmZXJlbmNlKSBhRmVhdHVyZSkuaXNDb250YWlubWVudCgpKQotCQkJCWZTdHlsZSB8PSBTSEFSRURfUkVGRVJFTkNFOwotCQl9Ci0KLQkJaWYgKGdldEVjb3JlUGFja2FnZSgpLmdldEVCb29sZWFuKCkgPT0gZmVhdHVyZS5nZXRFVHlwZSgpKQotCQkJZlN0eWxlIHw9IEJPT0xFQU5fRkVBVFVSRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFTUZDbGFzcyhFQ2xhc3MgYW5FQ2xhc3MpIHsKLQkJdGhpcy5lbWZDbGFzcyA9IGFuRUNsYXNzOwotCQlpZiAoYW5FQ2xhc3MgIT0gbnVsbCkKLQkJCWZTdHlsZSB8PSBPQkpFQ1RfTUFQOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVhZEFoZWFkTmFtZXMoKSB7Ci0JCXJldHVybiByZWFkQWhlYWROYW1lcyAhPSBudWxsICYmICFyZWFkQWhlYWROYW1lcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFkIGFoZWFkIG5hbWVzLCBpZiB0aGV5IGFyZSBkZWZpbmVkLCBmb3IgYSBnaXZlbiBwYXJlbnQgbm9kZSBuYW1lLiBUaGlzIGlzIHVzZWQKLQkgKiB3aGVuIGNyZWF0aW9uIG9mIGEgc3BlY2lmaWMgRU1GIG9iamVjdCBpcyBkZXBlbmRlbnQgb24gdGhlIHZhbHVlIG9mIGEgY2hpbGQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgUmVhZEFoZWFkSGVscGVyIGdldFJlYWRBaGVhZEhlbHBlcihTdHJpbmcgcGFyZW50TmFtZSkgewotCQlpZiAocmVhZEFoZWFkTmFtZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFJlYWRBaGVhZEhlbHBlcikgcmVhZEFoZWFkTmFtZXMuZ2V0KHBhcmVudE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlYWRBaGVhZEhlbHBlcihSZWFkQWhlYWRIZWxwZXIgaGVscGVyKSB7Ci0JCWlmIChyZWFkQWhlYWROYW1lcyA9PSBudWxsKQotCQkJcmVhZEFoZWFkTmFtZXMgPSBuZXcgSGFzaE1hcCgzKTsKLQkJcmVhZEFoZWFkTmFtZXMucHV0KGhlbHBlci5nZXRQYXJlbnRET01OYW1lKCksIGhlbHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBlbmRlbmN5Q2hpbGQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXBlbmRlbmN5UGFyZW50KCkgewotCQlpZiAoaXNEZXBlbmRlbmN5UGFyZW50ID09IG51bGwpIHsKLQkJCWlzRGVwZW5kZW5jeVBhcmVudCA9IEJvb2xlYW4uRkFMU0U7Ci0JCQlUcmFuc2xhdG9yW10gdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbihudWxsLCAtMSk7Ci0JCQlpZiAodGhlQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy9Gb3Igbm93IHdlIGFzc3VtZSBvbmUKLQkJCQkJaWYgKHRoZUNoaWxkcmVuW2ldLmlzRGVwZW5kZW5jeUNoaWxkKCkpIHsKLQkJCQkJCWlzRGVwZW5kZW5jeVBhcmVudCA9IEJvb2xlYW4uVFJVRTsKLQkJCQkJCWRlcGVuZGVuY3lGZWF0dXJlID0gdGhlQ2hpbGRyZW5baV0uZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNEZXBlbmRlbmN5UGFyZW50LmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldERlcGVuZGVuY3lGZWF0dXJlKCkgewotCQlyZXR1cm4gZGVwZW5kZW5jeUZlYXR1cmU7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgYmFzaWNHZXREZXBlbmRlbmN5T2JqZWN0KEVPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiAoRU9iamVjdCkgcGFyZW50LmVHZXQoZGVwZW5kZW5jeUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSBET00gcGF0aCBpcyBub3QgbnVsbCwgYW5kIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4gRGVmYXVsdCBpcyBmYWxzZSwgYnV0Ci0JICogc3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmRlckVtcHR5RE9NUGF0aChFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIGlzRW1wdHlDb250ZW50U2lnbmlmaWNhbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2Ugd2hlbiB0aGUgdHJhbnNsYXRvciB0b2xlcmF0ZXMgcGFyZW50IG5vZGVzIHRoYXQgcmVsYXRlIHRvIHRoZSBET00gcGF0aCwgYW5kIG5vIGNoaWxkcmVuOwotCSAqIGRlZmF1bHQgaXMgZG8gbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChFT2JqZWN0IGVPYmplY3QpIHsKLQotCX0KLQotCS8qKgotCSAqIE5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lU3BhY2UoKSB7Ci0JCXJldHVybiBmTmFtZVNwYWNlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZXNwYWNlIGZvciB0aGUgZG9tIGF0dHJpYnV0ZQotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lU3BhY2UoU3RyaW5nIHN0cmluZykgewotCQlmTmFtZVNwYWNlID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKSB7Ci0JCWlmIChpc09iamVjdE1hcCgpKQotCQkJcmV0dXJuIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5JTlNUQU5DRTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnVtRmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbCAmJiBFQ09SRV9QQUNLQUdFLmdldEVFbnVtKCkuaXNJbnN0YW5jZShmZWF0dXJlLmdldEVUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXR0YWJsZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmlzVW5zZXR0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiBmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQ09NTUVOVF9GRUFUVVJFKSAhPSAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTIwNjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjEsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLS8qCi0gKiBUcmFuc2xhdG9yIGZpbHRlcnMgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIE9iamVjdCBhbmQgQXR0cmlidXRlIFRyYW5zbGF0b3JzIHdpdGhvdXQKLSAqIGJyZWFraW5nIHRoZW0gb3V0IGludG8gc2VwZXJhdGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgRmlsdGVyIHdpbGwgcmVseSBvbiB0aGUgdW5kZXJseWluZyBkYXRhCi0gKiBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIFRyYW5zbGF0b3IuCi0gKiAKLSAqIGdldE5leHRDaGlsZCgpIHdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyBvdGhlciB0cmFuc2xhdG9ycyBvZiB0aGUgZ2l2ZW4gZ2VucmUgYXJlIGF2YWlsYWJsZS4KLSAqIAotICogVGhlIHByb2Nlc3NpbmcgaGludHMgd2hpY2ggYXJlIGNyZWF0ZWQgYW5kIHRoZW4gcGFzc2VkIHRvIGdldE5leHQqVHJhbnNsYXRvcigpIHN0b3JlIGluZm9ybWF0aW9uCi0gKiB0aGF0IG5lZWRzIHRvIGJlIHBlcnNpc3RlZCBiZXR3ZWVuIGNhbGxzLiBUaGUgY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCkgd2lsbCBjcmVhdGUgYSBwcm9wZXJseQotICogaW5pdGlhbGl6ZWQgYXJyYXkuIFRoZSBjb25zdGFudHMgTkVYVF9TVEFSVF9ISU5UX0lORFggYW5kIE1PREVfSElOVF9JTkRYIHByb3ZpZGUgcG9pbnRlcnMgaW50bwotICogdGhlIGFycmF5IGZvciB0aGUgTkVYVF9TVEFSVCBwb3NpdGlvbiBhbmQgdGhlIHByb3BlciBtb2RlIHRvIG9wZXJhdGUgaW4KLSAqIChTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIG9yCi0gKiAgCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdG9yRmlsdGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2xhdG9yIHRyYW5zbGF0b3I7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCB2ZXJzaW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVYVF9TVEFSVF9ISU5UX0lORFggPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfSElOVF9JTkRYID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgPSAxOwotCi0JLyoKLQkgKiBUaGVzZSBUcmFuc2xhdG9yRmlsdGVycyBhcmUgdXNlZCBpbiBhIHN0YXRlbGVzcyBtb2RlLiBPbmx5IHRoZWlyIHNjYW5OZXh0VHJhbnNsYXRvcigpIG1ldGhvZHMKLQkgKiB3aWxsIGJlIGludm9rZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRmlsdGVyIG9iamVjdFRyYW5zbGF0b3JGaWx0ZXIgPSBuZXcgT2JqZWN0VHJhbnNsYXRvckZpbHRlcihudWxsLCAtMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvckZpbHRlciBhdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyID0gbmV3IEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIobnVsbCwgLTEpOwotCi0KLQlwcm90ZWN0ZWQgaW50IG1vZGUgPSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFOwotCXByb3RlY3RlZCBpbnQgaW5kZXggPSAtMTsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3IgPSBudWxsOwotCi0JcHVibGljIFRyYW5zbGF0b3JGaWx0ZXIoVHJhbnNsYXRvciB0cmFucywgaW50IHZlcnNpb24pIHsKLQkJdGhpcy50cmFuc2xhdG9yID0gdHJhbnM7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQ2FsbGluZyBwZWVrIHR3aWNlIHdpbGwgYWR2YW5jZSB0aGUgY3VycmVudCBjaGlsZAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIHBlZWtOZXh0Q2hpbGQoRU9iamVjdCB0YXJnZXQpIHsKLQkJY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IGdldE5leHRDaGlsZCh0YXJnZXQpOwotCQlyZXR1cm4gY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0Q2hpbGQoKSB3aWxsIHJldHVybiBudWxsIHdoZW4gbm8gb3RoZXIgdHJhbnNsYXRvcnMgb2YgdGhlIGdpdmVuIGdlbnJlIGFyZSBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0TmV4dENoaWxkKEVPYmplY3QgdGFyZ2V0KSB7Ci0KLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQlpZiAoY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yOwotCQkJY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJaW50IGZvdW5kID0gMDsKLQkJVHJhbnNsYXRvciBjaGlsZHJlbltdID0gbnVsbDsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWNoaWxkcmVuID0gdGhpcy50cmFuc2xhdG9yLmdldENoaWxkcmVuKHRhcmdldCwgdGhpcy52ZXJzaW9uKTsKLQotCQkJCS8qIExvb2sgZm9yIHRoZSBuZXh0IEF0dHJpYnV0ZSBUcmFuc2xhdG9yICovCi0JCQkJZm91bmQgPSBzY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIHRoaXMuaW5kZXgpOwotCi0JCQkJaWYgKGZvdW5kID49IDApIHsKLQkJCQkJLyoKLQkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAgYWhlYWQgb24KLQkJCQkJICogdGhlIG5leHQgaW52b2NhdGlvbiAoMykgZXNjYXBlIHRoZSBWQVJJQUJMRV9UUkFOU0xBVE9SUyBwcm9jZXNzaW5nCi0JCQkJCSAqLwotCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltmb3VuZF07Ci0JCQkJCXRoaXMuaW5kZXggPSBmb3VuZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogUmVzZXQgdGhlIGluZGV4LiBETyBOT1QgQlJFQUsuIEFsbG93IGVudHJ5IGludG8gVkFSSUFCTEVfVFJBTlNMQVRPUlMgY2FzZQotCQkJCSAqLwotCQkJCXRoaXMuaW5kZXggPSAtMTsKLQkJCQkvKgotCQkJCSAqIHVwZGF0ZSB0aGUgbW9kZSB0byBWQVJJQUJMRV9UUkFOU0xBVE9SUyBzbyB3ZSBjYW4gc2tpcCB0byBpdCBkaXJlY3RseSBuZXh0IHRpbWUKLQkJCQkgKi8KLQkJCQl0aGlzLm1vZGUgPSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFOwotCQkJY2FzZSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQljaGlsZHJlbiA9IHRoaXMudHJhbnNsYXRvci5nZXRWYXJpYWJsZUNoaWxkcmVuKHRhcmdldCwgdGhpcy52ZXJzaW9uKTsKLQkJCQlmb3VuZCA9IHNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgdGhpcy5pbmRleCk7Ci0JCQkJaWYgKGZvdW5kID49IDApIHsKLQkJCQkJLyoKLQkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAgYWhlYWQgb24KLQkJCQkJICogdGhlIG5leHQgaW52b2NhdGlvbgotCQkJCQkgKi8KLQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bZm91bmRdOwotCQkJCQl0aGlzLmluZGV4ID0gZm91bmQ7Ci0JCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdey0xLCBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBuZXh0SGludCwgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uKSB7Ci0KLQkJcmV0dXJuIFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dENoaWxkKHRyYW5zbGF0b3IsIHN0YXJ0SGludCwgbmV4dEhpbnQsIHRhcmdldCwgdmVyc2lvbiwgYXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIGdldE5leHRPYmplY3RUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gbmV4dEhpbnQsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbikgewotCi0JCXJldHVybiBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRDaGlsZCh0cmFuc2xhdG9yLCBzdGFydEhpbnQsIG5leHRIaW50LCB0YXJnZXQsIHZlcnNpb24sIG9iamVjdFRyYW5zbGF0b3JGaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRDaGlsZCgpIHRha2VzIGhpbnRzIG9uIHdoZXJlIHRvIGJlZ2luIGluIHRoZSBjaGlsZHJlbiBhcnJheSBvZiB0aGUgZ2l2ZW4gVHJhbnNsYXRvci4KLQkgKiBXaGVuIGl0IGZpbmRzIHRoZSB0cmFuc2xhdG9yLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaGludHMgYXJyYXkgd2l0aCB0aGUgc3RhcnQgaGludCBmb3IgdGhlIG5leHQKLQkgKiBpbnZvY2F0aW9uKGhpbnRzWzBdKSBhbmQgd2hlbiBuZWNlc3NhcnkgaXQgd2lsbCB1c2UgdXBkYXRlIHRoZSBtb2RlIChoaW50c1sxXSkgdG8gZWl0aGVyCi0JICogU1RBTkRBUkRfVFJBTlNMQVRPUlMgb3IgVkFSSUFCTEVfVFJBTlNMQVRPUlMuCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0b3IKLQkgKiBAcGFyYW0gc3RhcnRIaW50Ci0JICogQHBhcmFtIGhpbnRzCi0JICogICAgICAgICAgICBhIHR3by1lbGVtZW50IGFycmF5OiBoaW50c1swXSB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV4dCBzdGFydEhpbnQgYW5kIGhpbnRzWzFdCi0JICogICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIG1vZGUuCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogQHBhcmFtIHRyYW5zbGF0b3JGaWx0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIGdldE5leHRDaGlsZChUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIGhpbnRzLCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24sIFRyYW5zbGF0b3JGaWx0ZXIgdHJhbnNsYXRvckZpbHRlcikgewotCi0JCVRyYW5zbGF0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlpbnQgaW5kZXggPSBzdGFydEhpbnQ7Ci0JCVRyYW5zbGF0b3IgY2hpbGRyZW5bXSA9IG51bGw7Ci0KLQkJc3dpdGNoIChoaW50c1tNT0RFX0hJTlRfSU5EWF0pIHsKLQkJCWNhc2UgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJY2hpbGRyZW4gPSB0cmFuc2xhdG9yLmdldENoaWxkcmVuKHRhcmdldCwgdmVyc2lvbik7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgc3RhcnRIaW50IDwgY2hpbGRyZW4ubGVuZ3RoKSB7Ci0KLQkJCQkJLyogTG9vayBmb3IgdGhlIG5leHQgQXR0cmlidXRlIFRyYW5zbGF0b3IgKi8KLQkJCQkJaW5kZXggPSB0cmFuc2xhdG9yRmlsdGVyLnNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgaW5kZXgpOwotCi0JCQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAKLQkJCQkJCSAqIGFoZWFkIG9uIHRoZSBuZXh0IGludm9jYXRpb24gKDMpIGVzY2FwZSB0aGUgVkFSSUFCTEVfVFJBTlNMQVRPUlMKLQkJCQkJCSAqIHByb2Nlc3NpbmcKLQkJCQkJCSAqLwotCQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5baW5kZXhdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogRE8gTk9UIEJSRUFLIHdlIHdpbGwgZGVmYXVsdCB0byBWQVJJQUJMRSBUUkFOU0xBVE9SUyBNT0RFIHNvIHdlIG11c3QgcmVzZXQKLQkJCQkJICogdGhlIHN0YXJ0SGludCBhcHByb3ByaWF0ZWx5Ci0JCQkJCSAqLwotCQkJCQlzdGFydEhpbnQgPSAtMTsKLQkJCQl9Ci0KLQkJCWNhc2UgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJaGludHNbTU9ERV9ISU5UX0lORFhdID0gVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERTsKLQkJCQkvKgotCQkJCSAqIFJlc2V0IHRoZSBpbmRleC4KLQkJCQkgKi8KLQkJCQlpbmRleCA9IHN0YXJ0SGludDsKLQkJCQljaGlsZHJlbiA9IHRyYW5zbGF0b3IuZ2V0VmFyaWFibGVDaGlsZHJlbih0YXJnZXQsIHZlcnNpb24pOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgc3RhcnRIaW50IDwgY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQkJCWluZGV4ID0gdHJhbnNsYXRvckZpbHRlci5zY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIGluZGV4KTsKLQkJCQkJcmVzdWx0ID0gKGluZGV4ID49IDApID8gY2hpbGRyZW5baW5kZXhdIDogbnVsbDsKLQkJCQl9Ci0JCX0KLQotCQloaW50c1tORVhUX1NUQVJUX0hJTlRfSU5EWF0gPSAocmVzdWx0ID09IG51bGwgJiYgY2hpbGRyZW4gIT0gbnVsbCkgPyBjaGlsZHJlbi5sZW5ndGggOiBpbmRleDsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGFic3RyYWN0IGludCBzY2FuTmV4dFRyYW5zbGF0b3IoVHJhbnNsYXRvcltdIGNoaWxkcmVuLCBpbnQgc3RhcnQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRNb2RlKCkgewotCQlyZXR1cm4gbW9kZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUGF0aC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODQzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvclBhdGggewotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gbWFwSW5mb1BhdGg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBhcnJheSBvZiBUcmFuc2xhdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBwYXRoIHRvIGZvbGxvdyBmcm9tIGFuIG9iamVjdCB0bwotCSAqIGFub3RoZXIgb2JqZWN0Ci0JICovCi0JcHVibGljIFRyYW5zbGF0b3JQYXRoKFRyYW5zbGF0b3JbXSBwYXRoKSB7Ci0JCW1hcEluZm9QYXRoID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBmaW5kT2JqZWN0cyhFT2JqZWN0IHN0YXJ0T2JqZWN0KSB7Ci0JCU9iamVjdCBjdXIgPSBzdGFydE9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBJbmZvUGF0aC5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvciBjdXJNYXAgPSBtYXBJbmZvUGF0aFtpXTsKLQkJCWlmIChjdXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGN1ckF0dHIgPSBjdXJNYXAuZ2V0RmVhdHVyZSgpOwotCQkJCWlmIChjdXJBdHRyID09IFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpIHsKLQkJCQkJY3VyQXR0ciA9ICgoRU9iamVjdCkgY3VyKS5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQkJCWN1ciA9ICgoRU9iamVjdCkgY3VyKS5lQ29udGFpbmVyKCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJBdHRyID09IFRyYW5zbGF0b3IuUk9PVF9GRUFUVVJFKSB7Ci0JCQkJCWN1ciA9ICgoVHJhbnNsYXRvclJlc291cmNlKSBzdGFydE9iamVjdC5lUmVzb3VyY2UoKSkuZ2V0Um9vdE9iamVjdCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1ciA9ICgoRU9iamVjdCkgY3VyKS5lR2V0KGN1ckF0dHIpOwotCQkJCX0KLQkJCQlpZiAoY3VyTWFwLmlzTXVsdGlWYWx1ZWQoKSkgewotCQkJCQlyZXR1cm4gKExpc3QpIGN1cjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBmaW5kT2JqZWN0KEVPYmplY3Qgc3RhcnRPYmplY3QsIE9iamVjdCBtYXRjaFZhbHVlKSB7Ci0JCUxpc3Qgb2JqZWN0cyA9IGZpbmRPYmplY3RzKHN0YXJ0T2JqZWN0KTsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmluZE9iamVjdChvYmplY3RzLCBnZXRMYXN0TWFwKCksIG1hdGNoVmFsdWUpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGZpbmRPYmplY3QoTGlzdCBvYmplY3RMaXN0LCBUcmFuc2xhdG9yIG1hcCwgT2JqZWN0IG1hdGNoVmFsdWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbW9mT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGN1ck1hdGNoVmFsdWUgPSBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKTsKLQkJCWlmIChtYXRjaFZhbHVlLmVxdWFscyhjdXJNYXRjaFZhbHVlKSkKLQkJCQlyZXR1cm4gbW9mT2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldExhc3RNYXAoKSB7Ci0JCXJldHVybiBtYXBJbmZvUGF0aFttYXBJbmZvUGF0aC5sZW5ndGggLSAxXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNuID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpID0gY24ubGFzdEluZGV4T2YoJy4nKTsKLQkJY24gPSBjbi5zdWJzdHJpbmcoKytpLCBjbi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZChjbik7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQobWFwSW5mb1BhdGhbMF0pOwotCQlmb3IgKGludCBqID0gMTsgaiA8IG1hcEluZm9QYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCQlzYi5hcHBlbmQobWFwSW5mb1BhdGhbal0pOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmM5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zbGF0b3JSZXNvdXJjZSBleHRlbmRzIFJlZmVyZW5jZWRSZXNvdXJjZSB7Ci0JLyoKLQkgKiBtdXN0IG1ha2UgYSBzdWJjbGFzcyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBmb3IgRVN0cnVjdHVyYWxGZWF0dXJlIGlzIHByb3RlY3RlZAotCSAqLwotCXN0YXRpYyBjbGFzcyBEb2NUeXBlRmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgewotCQlwcm90ZWN0ZWQgRG9jVHlwZUZlYXR1cmUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0KLQlFU3RydWN0dXJhbEZlYXR1cmUgRE9DX1RZUEVfRkVBVFVSRSA9IG5ldyBEb2NUeXBlRmVhdHVyZSgpOwotCi0JLyoqCi0JICogVGhlIHB1YmxpYyBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LCBpZiBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldFB1YmxpY0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCUVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOwotCi0JLyoqCi0JICogVGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LCBpZiBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWQgYW5kIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHB1YmxpYy9zeXN0ZW0gaWRzIGlmIG5lY2Vzc2FyeQotCSAqLwotCXZvaWQgc2V0RGVmYXVsdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIGluIHRoZSBkb2N1bWVudCB0eXBlIGhlYWRlciBvZiB0aGUgc2VyaWFsaXplZCB4bWwgZmlsZQotCSAqLwotCVN0cmluZyBnZXREb2N0eXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBYTUwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0JICovCi0JU3RyaW5nIGdldFhNTFZlcnNpb24oKTsKLQotCVRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKTsKLQotCS8qKgotCSAqIEVudGl0eSByZXNvbHZlciB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gdXNpbmcgc3RhbmRhcmQgcGFyc2VycyB0byByZWFkIHRoZSByZXNvdXJjZQotCSAqLwotCUVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCk7Ci0KLQlib29sZWFuIHVzZXNEVEQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLQl2b2lkIHNldFZlcnNpb25JRChpbnQgaSk7Ci0KLQlSZW5kZXJlciBnZXRSZW5kZXJlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhNDUwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5Lkxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBSZW5kZXJlckZhY3RvcnkgcmVuZGVyZXJGYWN0b3J5OwotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSwgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlbmRlcmVyRmFjdG9yeSA9IGFSZW5kZXJlckZhY3Rvcnk7Ci0JCXNldExpc3RlbmluZ0ZvclVwZGF0ZXMobGlzdGVuaW5nRm9yVXBkYXRlcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJdGhpcyhhUmVuZGVyZXJGYWN0b3J5LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5pbmdGb3JVcGRhdGVzKGJvb2xlYW4gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0KLQkJaWYgKHRoaXMubGlzdGVuaW5nRm9yVXBkYXRlcyBeIHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQkJaWYgKCFzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpCi0JCQkJUmVuZGVyZXJGYWN0b3J5Lk5vdGlmaWNhdGlvbkVuZ2luZS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWVsc2UKLQkJCQlSZW5kZXJlckZhY3RvcnkuTm90aWZpY2F0aW9uRW5naW5lLmFkZExpc3RlbmVyKHRoaXMpOwotCi0JCQl0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXMgPSBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmluZ0ZvclVwZGF0ZXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXM7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZW5kZXJlciBhUmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIoKTsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5Lkxpc3RlbmVyI3VwZGF0ZVJlbmRlcmVyRmFjdG9yeShjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRpbmcgcmVuZGVyZXIgZmFjdG9yeSIpOwotCQlyZW5kZXJlckZhY3RvcnkgPSBuZXdSZW5kZXJlckZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTI1MjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsIGV4dGVuZHMgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFRyYW5zbGF0b3JSZXNvdXJjZSwgSVJvb3RPYmplY3RSZXNvdXJjZXsKLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBJRF9GRUFUVVJFID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NfRUlEQXR0cmlidXRlKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZFUlNJT04gPSAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBSZW5kZXJlciByZW5kZXJlcjsKLQkvKioKLQkgKiBUaGUgcHVibGljIElkIHRvIHVzZSBhdCB0aGUgaGVhZCBvZiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQkvKioKLQkgKiBUaGUgc3lzdGVtIElkIHRvIHVzZSBhdCB0aGUgaGVhZCBvZiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbFZlcnNpb247Ci0JLy8gRGVmYXVsdCB0aGUgcmVzb3VyY2VzIHRvIEoyRUUgMS40Ci0JcHJvdGVjdGVkIGludCB2ZXJzaW9uSUQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI5LzIwMDMgLSB1c2VkIGZvciBjb21wYXRpYmlsaXR5IFN1YmNsYXNzZXMgc2hvdWxkCi0JICogICAgICAgICAgICAgYmUgdXNpbmcgdGhlIFJlbmRlcmVycyBhbmQgdHJhbnNsYXRvciBmcmFtZXdvcmsKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI5LzIwMDMgLSB1c2VkIGZvciBjb21wYXRpYmlsaXR5IFN1YmNsYXNzZXMgc2hvdWxkCi0JICogICAgICAgICAgICAgYmUgdXNpbmcgdGhlIFJlbmRlcmVycyBhbmQgdHJhbnNsYXRvciBmcmFtZXdvcmsKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXNldFJlbmRlcmVyKGFSZW5kZXJlcik7Ci0JCXZlcnNpb25JRCA9IGdldERlZmF1bHRWZXJzaW9uSUQoKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UmVuZGVyZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJaWYgKHN1cGVyLmdldEVuY29kaW5nKCkgPT0gbnVsbCkKLQkJCXNldEVuY29kaW5nKERFRkFVTFRfRU5DT0RJTkcpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RW5jb2RpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRU9iamVjdCkgZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIGFQdWJsaWNJZCwgU3RyaW5nIGFTeXN0ZW1JZCkgewotCQlib29sZWFuIGNoYW5nZWQgPSAhKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHB1YmxpY0lkLCBhUHVibGljSWQpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCBhU3lzdGVtSWQpKTsKLQkJcHVibGljSWQgPSBhUHVibGljSWQ7Ci0JCXN5c3RlbUlkID0gYVN5c3RlbUlkOwotCQlpZiAoY2hhbmdlZCkgewotCQkJZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBudWxsLCBudWxsKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkgewotCQkJCQlyZXR1cm4gRE9DX1RZUEVfRkVBVFVSRTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkgewotCQkJCQlyZXR1cm4gVHJhbnNsYXRvclJlc291cmNlSW1wbC50aGlzOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgeG1sVmVyc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MVmVyc2lvbigpIHsKLQkJaWYgKHhtbFZlcnNpb24gPT0gbnVsbCkKLQkJCXhtbFZlcnNpb24gPSBERUZBVUxUX1ZFUlNJT047Ci0JCXJldHVybiB4bWxWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHhtbFZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIHhtbFZlcnNpb24KLQkgKiAgICAgICAgICAgIFRoZSB4bWxWZXJzaW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTFZlcnNpb24oU3RyaW5nIHhtbFZlcnNpb24pIHsKLQkJdGhpcy54bWxWZXJzaW9uID0geG1sVmVyc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY0RvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJYm9vbGVhbiBpc1RyYWNraW5nTW9kcyA9IGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmIChpc1RyYWNraW5nTW9kcykKLQkJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbihmYWxzZSk7Ci0JCQlyZW5kZXJlci5kb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQl9Ci0JCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIHJlY29yZFRpbWUoIkxvYWQiLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVuZGVyZXIudXNlU3RyZWFtc0ZvcklPKCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnNhdmUob3B0aW9ucyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZnlBYm91dFRvU2F2ZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb1NhdmUoKE91dHB1dFN0cmVhbSludWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICBub3RpZnlTYXZlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgbm90aWZ5U2F2ZUZhaWxlZCgpOwotICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMueG1pLmhlbHBlcnMuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCNkb1NhdmUoT3V0cHV0U3RyZWFtLAotCSAqICAgICAgTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZW5kZXJlci5kb1NhdmUob3V0cHV0U3RyZWFtLCBvcHRpb25zKTsKLQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkvLyBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyByZWNvcmRUaW1lKCJTYXZlIiwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIHJlY29yZFRpbWUoU3RyaW5nIHR5cGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlx0IiArIHR5cGUgKyAiXHQiICsKLQkvLyAoZW5kIC0gc3RhcnQpICsKLQkvLyAiXHRcdFx0bXMiICsgIlx0IiArICgoIHRoaXMuZ2V0VmVyc2lvbklEKCkpIC8gMTAuMCkgKyAiXHQiICsgdGhpcyk7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkvLyB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9VbmxvYWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQlyZW5kZXJlci5wcmVVbmxvYWQoKTsKLQkJc3VwZXIuZG9VbmxvYWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBnZXRVUkkoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbmRlcmVyLgotCSAqIAotCSAqIEByZXR1cm4gUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKSB7Ci0JCXJldHVybiByZW5kZXJlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZW5kZXJlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuZGVyZXIKLQkgKiAgICAgICAgICAgIFRoZSByZW5kZXJlciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JCWlmIChyZW5kZXJlci5nZXRSZXNvdXJjZSgpICE9IHRoaXMpCi0JCQlyZW5kZXJlci5zZXRSZXNvdXJjZSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgY29tcGF0aWJpbGl0eSBvZiBvbGQgc3VidHlwZSByZXNvdXJjZXMsIHJldHVybnMgdGhlIHN1cGVyCi0JICogaW1wbGVtZW50YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByaW1HZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotCQl3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotCQlpZiAoY29udGVudHMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZUNvbnRlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb250ZW50cygpIHsKLQkJY29udGVudHMgPSBuZXcgUmVzb3VyY2VJbXBsLkNvbnRlbnRzRUxpc3QoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotCQkJCXJlbmRlcmVyLnByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJcmVuZGVyZXIucHJlcGFyZVRvQWRkQ29udGVudHMoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCAmJiBwdWJsaWNJZCAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcHViSWQgPSBwdWJsaWNJZCA9PSBudWxsID8gZ2V0RGVmYXVsdFB1YmxpY0lkKCkgOiBwdWJsaWNJZDsKLQkJU3RyaW5nIHN5c0lkID0gc3lzdGVtSWQgPT0gbnVsbCA/IGdldERlZmF1bHRTeXN0ZW1JZCgpIDogc3lzdGVtSWQ7Ci0JCXNldERvY3R5cGVWYWx1ZXMocHViSWQsIHN5c0lkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRFbmNvZGluZyhERUZBVUxUX0VOQ09ESU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG51bGwgYnkgZGVmYXVsdDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2NyZWF0ZUVudGl0eVJlc29sdmVyKCkKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXREZWZhdWx0VmVyc2lvbklEKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiB2ZXJzaW9uSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpIHsKLQkJdmVyc2lvbklEID0gaTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3VzZXNEVEQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVzZXNEVEQoKSB7Ci0JCXJldHVybiBnZXRQdWJsaWNJZCgpICE9IG51bGwgJiYgZ2V0U3lzdGVtSWQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gbm90aWZ5IHdoZW4gdGhlIElEIGdldHMgc2V0OyBuZWVkIHRoaXMgdG8gcHVzaCBpdCBpbnRvCi0JICogdGhlIHJlc291cmNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlI3NldElEKEVPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBpZCkgewotCQlTdHJpbmcgb2xkSWQgPSBnZXRJRChlT2JqZWN0KTsKLQkJc3VwZXIuc2V0SUQoZU9iamVjdCwgaWQpOwotCQllT2JqZWN0LmVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIGVPYmplY3QsIE5vdGlmaWNhdGlvbi5TRVQsIElEX0ZFQVRVUkUsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZXh0ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiByZXNvdXJjZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBsb2FkZWQgb3Igc2F2ZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpZWQoKSB8fCByZW5kZXJlci5pc01vZGlmaWVkKCk7Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZW4gdG8gZ2l2ZSB0aGUgcmVuZGVyZXIgYSBob29rCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQlyZW5kZXJlci5hY2Nlc3NGb3JXcml0ZSgpOwotCQlzdXBlci5hY2Nlc3NGb3JXcml0ZSgpOwotCX0KLQotCS8qCi0JICogT3ZlcnJpZGVuIHRvIGdpdmUgdGhlIHJlbmRlcmVyIGEgaG9vawotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvclJlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JCXJlbmRlcmVyLmFjY2Vzc0ZvclJlYWQoKTsKLQkJc3VwZXIuYWNjZXNzRm9yUmVhZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVuZGVyZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JCXJlbmRlcmVyLnJlbGVhc2VGcm9tV3JpdGUoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21Xcml0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsI3ByZURlbGV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCQlzdXBlci5wcmVEZWxldGUoKTsKLQkJcmVuZGVyZXIucHJlRGVsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NoYXJlZCgpIHx8IHJlbmRlcmVyLmlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2hhcmVkRm9yV3JpdGUoKSB8fCByZW5kZXJlci5pc1NoYXJlZEZvcldyaXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoaXNMb2FkZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiCi0JCQkvLyBUcmFuc2xhdG9yUmVzb3VyY2UubG9hZCgpOiAiICsgdGhpcyk7Ci0JCQlpZiAocmVuZGVyZXIudXNlU3RyZWFtc0ZvcklPKCkpIHsKLQkJCQlzdXBlci5sb2FkKG9wdGlvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAoIWlzTG9hZGVkKSB7Ci0JCQkJbG9hZCgoSW5wdXRTdHJlYW0pIG51bGwsIG9wdGlvbnMpOwotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9VbnN1cHBvcnRlZEZlYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M1ODY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZEZlYXR1cmUgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCB7Ci0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGNhcHR1cmUgZmVhdHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkKEVDbGFzcyBhbkVDbGFzcywgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0KLQkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygiaXNaZXJvUGFyYW1zIikgJiYgYW5FQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscygiTWV0aG9kRWxlbWVudCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFVuc3VwcG9ydGVkRmVhdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0ZWVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgewotCS8qKiBSZXR1cm5zIHdoZXRoZXIgYSBUcmFuc2xhdG9yIHNob3VsZCBiZSBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gRE9NIG5hbWUgKi8KLQlib29sZWFuIGFjY2VwdHMoU3RyaW5nIGRvbU5hbWUpOwotCi0JLyoqIFJldHVybnMgd2hldGhlciBhIFRyYW5zbGF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBmZWF0dXJlICovCi0JYm9vbGVhbiBhY2NlcHRzKE5vdGlmaWNhdGlvbiBub3RpZik7Ci0KLQlUcmFuc2xhdG9yIGNyZWF0ZShOb3RpZmljYXRpb24gbm90aWYpOwotCi0JLyoqIENyZWF0ZXMgYSBuZXcgVHJhbnNsYXRvciBmb3IgdGhlIERPTSBuYW1lICovCi0JVHJhbnNsYXRvciBjcmVhdGUoU3RyaW5nIGRvbU5hbWUpOwotCi0JLyoqIENyZWF0ZXMgdmFyaWFibGUgdHJhbnNsYXRvcnMgZm9yIGFuIEVNRiBvYmplY3QgdG8gYmUgcmVuZGVyZWQgKi8KLQlMaXN0IGNyZWF0ZShOb3RpZmllciB0YXJnZXQpOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvWE1MRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiN2YzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjAsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbmNvZGVyRGVjb2RlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFhNTEVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIElkZW50aWZpZXMgdGhlIGxhc3QgcHJpbnRhYmxlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSByYW5nZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBlbmNvZGluZyB1c2VkIHdpdGggdGhpcyBzZXJpYWxpemVyLiBGb3IgOC1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSBlaXRoZXIgMHg3RSBvciAweEZGLiBGb3IKLQkgKiAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHByaW50YWJsZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcKLQkgKiBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGludCBfbGFzdFByaW50YWJsZSA9IDB4RkZGRTsKLQotCXByb3RlY3RlZCBzdGF0aWMgWE1MRW5jb2RlckRlY29kZXIgX3NpbmdsZXRvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCS8vIE5PVF9JTVBMRU1FTlRFRAotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIGNoYXJbXSBlbmNvZGUoY2hhcltdIHZhbHVlKSB7Ci0JCWJvb2xlYW4gdW5tb2RpZmllZCA9IHRydWU7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgpOwotCQlTdHJpbmcgY2hhclJlZiA9IG51bGw7Ci0JCWNoYXIgY2g7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHsKLQkJCWNoID0gdmFsdWVbaV07Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMKLQkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKLQkJCS8vIHJlZmVyZW5jZXMgaXMgYWxtb3N0IGJ1dCBub3QgaWRlbnRpY2FsIGJldHdlZW4KLQkJCS8vIFhNTCBhbmQgSFRNTC4KLQkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOwotCQkJaWYgKGNoYXJSZWYgIT0gbnVsbCkgewotCQkJCXNidWYuYXBwZW5kKCcmJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoY2hhclJlZik7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCQl1bm1vZGlmaWVkID0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlcgotCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkvLyBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IgbGluZQotCQkJCS8vIHRlcm1pbmF0b3IsIEFTQ0lJIGRlbGV0ZSwgb3IgYWJvdmUgYSBjZXJ0YWluIFVuaWNvZGUKLQkJCQkvLyB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQkJdW5tb2RpZmllZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh1bm1vZGlmaWVkKQotCQkJcmV0dXJuIHZhbHVlOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2J1Zi5sZW5ndGgoKV07Ci0JCXNidWYuZ2V0Q2hhcnMoMCwgc2J1Zi5sZW5ndGgoKSwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIKLQkJCQkvLyByZWZlcmVuY2UuCi0JCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKLQkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlCi0JCQkJLy8gdGhyZXNob2xkLgotCQkJCXNidWYuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2J1Zi5hcHBlbmQoIiYjIik7Ly8kTk9OLU5MUy0xJAotCQkJCXNidWYuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoX3NpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlfc2luZ2xldG9uID0gbmV3IFhNTEVuY29kZXJEZWNvZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9zaW5nbGV0b24uZW5jb2RlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzIGNoYXJhY3RlciB2YWx1ZSwgb3IgbnVsbCBpZiBubyBzdWNoIGVudGl0eQotCSAqIGV4aXN0cy4gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIDx0dD4nJmFtcDsnPC90dD4gd2lsbCByZXR1cm4gPHR0PiImYW1wO2FtcDsiPC90dD4uCi0JICogCi0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICBDaGFyYWN0ZXIgdmFsdWUKLQkgKiBAcmV0dXJuIENoYXJhY3RlciBlbnRpdHkgbmFtZSwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5UmVmKGNoYXIgY2gpIHsKLQkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIKLQkJLy8gcmVmZXJlbmNlcy4KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gImd0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuICJxdW90IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiAiYW1wIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU1NTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgewotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkOTE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5VXRpbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWRhcHRlckZhY3RvcnlVdGlsLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkYXB0TmV3KE5vdGlmaWVyIG5ld09iamVjdCwgTGlzdCBmYWN0b3JpZXMpIHsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWZhY3QgPSAoQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlmYWN0LmFkYXB0TmV3KG5ld09iamVjdCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQWRhcHRlckZhY3RvcmllcyhMaXN0IGRlc2NyaXB0b3JzLCBMaXN0IGZhY3RvcmllcykgewotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYzsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCQlhZGFwdGVyRmFjdCA9IGRlc2MuY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdCAhPSBudWxsKQotCQkJCWZhY3Rvcmllcy5hZGQoYWRhcHRlckZhY3QpOwotCQl9Ci0JCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2I4OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FycmF5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXJyYXlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCQlpZiAoYXJyYXkxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09IGFycmF5Mi5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSkKLQkJCWNvbXBvbmVudFR5cGUgPSBhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWVsc2UKLQkJCWNvbXBvbmVudFR5cGUgPSBPYmplY3QuY2xhc3M7Ci0KLQkJcmV0dXJuIGNvbmNhdChhcnJheTEsIGFycmF5MiwgY29tcG9uZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIsIENsYXNzIGNvbXBvbmVudFR5cGUpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBhcnJheTEubGVuZ3RoICsgYXJyYXkyLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdEFsbChqYXZhLnV0aWwuTGlzdCBhcnJheXMsIENsYXNzIGNvbXBvbmVudFR5cGUpIHsKLQkJaW50IHJlc3VsdExlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXN1bHRMZW5ndGggKz0gKChPYmplY3RbXSkgYXJyYXlzLmdldChpKSkubGVuZ3RoOwotCQl9Ci0JCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgcmVzdWx0TGVuZ3RoKTsKLQkJaW50IHBvcyA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSkgYXJyYXlzLmdldChpKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgcG9zLCBhcnJheS5sZW5ndGgpOwotCQkJcG9zICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDQ3NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbiBjb2RlLiBUaGUgcHJlZGljYXRlCi0gKiBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90Ci0gKiBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4gc29tZXRoaW5nIGlzCi0gKiBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkCi0gKiBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93biAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotLy8gVGhpcyBjbGFzcyB3YXMsIG9yaWdpbmFsbHksIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvbS5pYm0uaXRwLmNvbW1vbi4KLS8vIEl0IHdhcyBjb3BpZWQgdG8gb3VyIG93biBwYWNrYWdlIGp1c3QgdG8gbWluaW1pemUgbWlub3IgZGVwZW5kZW5jaWVzCi0vLyBvbiBvdGhlciBwYWNrYWdlcyBhbmQgaW50ZXJuYWwgQVBJcy4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbgotCSAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4KLQkgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdAotCSAqIGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQKLQkgKiBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgewotCQlpc05vdE51bGwob2JqZWN0LCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZAotCSAqIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKLQkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKLQkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRjNjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4KLSAqIDxjb2RlPkFzc2VydDwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMgdGhhdCBjYXRjaCBvciBvdGhlcndpc2UKLSAqIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlCi0gKiBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLSAqIDwvcD4KLSAqLwotLy8gVGhpcyBjbGFzcyB3YXMsIG9yaWdpbmFsbHksIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvbS5pYm0uaXRwLmNvbW1vbi4KLS8vIEl0IHdhcyBjb3BpZWQgdG8gb3VyIG93biBwYWNrYWdlIGp1c3QgdG8gbWluaW1pemUgbWlub3IgZGVwZW5kZW5jaWVzCi0vLyBvbiBvdGhlciBwYWNrYWdlcyBhbmQgaW50ZXJuYWwgQVBJcy4KLWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJc3VwZXIoZGV0YWlsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc29jaWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZDBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODoxNSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb24gewotCXByb3RlY3RlZCBPYmplY3Qga2V5OwotCXByb3RlY3RlZCBPYmplY3QgdmFsdWU7Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbihPYmplY3QgYUtleSwgT2JqZWN0IGFWYWx1ZSkgewotCQlzZXRLZXkoYUtleSk7Ci0JCXNldFZhbHVlKGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0tleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShqYXZhLmxhbmcuT2JqZWN0IG5ld0tleSkgewotCQlrZXkgPSBuZXdLZXk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9DbG9uZWFibGVQdWJsaWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9DbG9uZWFibGVQdWJsaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzOWZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZXhwb3NlcyB0aGUgY2xvbmUgbWV0aG9kLCBmb3Igb2JqZWN0cyB0aGF0IG5lZWQgdG8gZ2VuZXJpY2FsbHkgY29weSBvdGhlcgotICogY2xvbmVhYmxlIG9iamVjdHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDbG9uZWFibGVQdWJsaWMgZXh0ZW5kcyBDbG9uZWFibGUsIEFkYXB0ZXIuSW50ZXJuYWwgewotCU9iamVjdCBjbG9uZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db21tYW5kQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNiODgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db21tYW5kQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyNywgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gTW91cnJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kQ29udGV4dCBpbXBsZW1lbnRzIElDb21tYW5kQ29udGV4dCB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQlwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBDb21tYW5kQ29udGV4dChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcyhtb25pdG9yLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uUHJvcGVydGllcwotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBDb21tYW5kQ29udGV4dChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE1hcCBjb25maWd1cmF0aW9uUHJvcGVydGllcywgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJdGhpcy5wcm9wZXJ0aWVzID0gY29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRSZXNvdXJjZVNldCgpCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvcHlHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvcHlHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjM5MjhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvcHkgYSBncm91cCBvZiBSZWZPYmplY3RzIGFuZC9vciBSZXNvdXJjZXMuIFRoaXMgZ3JvdXAgd2lsbCBlbnN1cmUgdGhhdAotICogYWxsIG5vbi1jb21wb3NpdGUgcmVsYXRpb25zaGlwcyBhcmUgZGVmZXJyZWQgdW50aWwgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyBhcmUgY29waWVkLiBUaGlzCi0gKiBhbGxvd3MgeW91IHRvIG1ha2UgY29waWVzIG9mIGEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IG1heSBoYXZlIG5vbi1jb21wb3NpdGUgcmVsYXRpb25zaGlwcyBhbmQKLSAqIGVuc3VyZSB0aGF0IHRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIHBvaW50aW5nIHRvIHRoZSBjb3BpZWQgb2JqZWN0IGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdyb3VwCi0gKiAoZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2ggYSBjb250YWlubWVudCByZWxhdGlvbnNoaXApLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjIxOjE3IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5R3JvdXAgewotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdElkU3VmZml4OwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCBjb3B5Q29udGV4dDsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZXM7Ci0JcHJvdGVjdGVkIExpc3QgcmVmT2JqZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBjb3BpZWRSZXNvdXJjZXM7Ci0JcHJvdGVjdGVkIExpc3QgY29waWVkUmVmT2JqZWN0czsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVzZXJ2ZUlkcyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29weUdyb3VwIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvcHlHcm91cCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gYWRkKGFSZWZPYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCAmJiAhY29udGFpbnNSZWZPYmplY3QoYVJlZk9iamVjdCkpIHsKLQkJCWdldFJlZk9iamVjdHMoKS5hZGQoY3JlYXRlQXNzb2NpYXRpb24oYVJlZk9iamVjdCwgaWRTdWZmaXgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJYWRkKGFSZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWdldFJlc291cmNlcygpLmFkZChjcmVhdGVBc3NvY2lhdGlvbihhUmVzb3VyY2UsIG5ld1VyaSkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb3BpZWQoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwpCi0JCQlnZXRDb3BpZWRSZWZPYmplY3RzKCkuYWRkKGFSZWZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29waWVkKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWdldENvcGllZFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCQkJaWYgKGdldENvcHlDb250ZXh0KCkgIT0gbnVsbCkKLQkJCQlnZXRDb3B5Q29udGV4dCgpLmdldFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnMoTGlzdCBhc3NvY2lhdGlvbnMsIE9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoYW5PYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSBhc3NvY2lhdGlvbnMuc2l6ZSgpOwotCQlBc3NvY2lhdGlvbiBhc3NvYzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWFzc29jID0gKEFzc29jaWF0aW9uKSBhc3NvY2lhdGlvbnMuZ2V0KGkpOwotCQkJaWYgKGFzc29jLmdldEtleSgpID09IGFuT2JqZWN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZgotCSAqIAotCSAqIEBhUmVmT2JqZWN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgZ3JvdXAuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWZPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBjb250YWlucyhnZXRSZWZPYmplY3RzKCksIGFSZWZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmCi0JICogCi0JICogQGFSZXNvdXJjZSBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGdyb3VwLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBjb250YWlucyhnZXRSZXNvdXJjZXMoKSwgYVJlc291cmNlKTsKLQl9Ci0KLQlwcml2YXRlIEFzc29jaWF0aW9uIGNyZWF0ZUFzc29jaWF0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uKGtleSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIFJlZk9iamVjdHMgdGhhdCB3ZXJlIGNvcGllZC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENvcGllZFJlZk9iamVjdHMoKSB7Ci0JCWlmIChjb3BpZWRSZWZPYmplY3RzID09IG51bGwpCi0JCQljb3BpZWRSZWZPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY29waWVkUmVmT2JqZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBSZXNvdXJjZXMgdGhhdCB3ZXJlIGNvcGllZC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENvcGllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvcGllZFJlc291cmNlcyA9PSBudWxsKQotCQkJY29waWVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY29waWVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZXh0IHRvIGFkZCBhbGwgY29waWVkIHJlc291cmNlcyBpbnRvLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA4OjA5OjQ1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCBnZXRDb3B5Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvcHlDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMTo0NDo0MyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0SWRTdWZmaXgoKSB7Ci0JCXJldHVybiBkZWZhdWx0SWRTdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8gRGVmYXVsdHMgdG8gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQcmVzZXJ2ZUlkcygpIHsKLQkJcmV0dXJuIHByZXNlcnZlSWRzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlZk9iamVjdHMoKSB7Ci0JCWlmIChyZWZPYmplY3RzID09IG51bGwpCi0JCQlyZWZPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVmT2JqZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBwcmltR2V0UmVmT2JqZWN0cygpIHsKLQkJcmV0dXJuIHJlZk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgcHJpbUdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsICYmIHByaW1HZXRSZWZPYmplY3RzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0UmVmT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRLZXkoKSA9PSBhUmVmT2JqZWN0KQotCQkJCQlyZXR1cm4gcHJpbUdldFJlZk9iamVjdHMoKS5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIHByaW1HZXRSZXNvdXJjZXMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHByaW1HZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0S2V5KCkgPT0gYVJlc291cmNlKQotCQkJCQlyZXR1cm4gcHJpbUdldFJlc291cmNlcygpLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29udGV4dCB0byBhZGQgYWxsIGNvcGllZCByZXNvdXJjZXMgaW50by4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgODowOTo0NSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q29weUNvbnRleHQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5Db250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weUNvbnRleHQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IG5ld0NvcHlDb250ZXh0KSB7Ci0JCWNvcHlDb250ZXh0ID0gbmV3Q29weUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYW4gSUQgc3VmZml4IGlzIG5vdCBkZWZpbmVkIGZvciBhIEVPYmplY3QgdGhhdCBpcyB0byBiZSBjb3BpZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6NDQ6NDMgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0RlZmF1bHRJZFN1ZmZpeAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRJZFN1ZmZpeChqYXZhLmxhbmcuU3RyaW5nIG5ld0RlZmF1bHRJZFN1ZmZpeCkgewotCQlkZWZhdWx0SWRTdWZmaXggPSBuZXdEZWZhdWx0SWRTdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlkcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZXNlcnZlSWRzID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSByZXF1aXJlIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBhZnRlciB0aGUgZ3JvdXAKLQkgKiBoYXMgYmVlbiBjb3BpZWQuCi0JICogCi0JICogQHBhcmFtIGNvcHlVdGlsCi0JICovCi0JcHVibGljIHZvaWQgcG9zdENvcHkoRXRvb2xzQ29weVV0aWxpdHkgY29weVV0aWwpIHsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NTG9hZE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhZThhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NTG9hZE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDEyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERPTUxvYWRPcHRpb25zIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0phdmFFbmNvZGluZ3M7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxvd0phdmFFbmNvZGluZ3MoKSB7Ci0JCXJldHVybiBhbGxvd0phdmFFbmNvZGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoKSB7Ci0JCXJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsbG93SmF2YUVuY29kaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dKYXZhRW5jb2RpbmdzCi0JICogICAgICAgICAgICBUaGUgYWxsb3dKYXZhRW5jb2RpbmdzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93SmF2YUVuY29kaW5ncyhib29sZWFuIGFsbG93SmF2YUVuY29kaW5ncykgewotCQl0aGlzLmFsbG93SmF2YUVuY29kaW5ncyA9IGFsbG93SmF2YUVuY29kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcwotCSAqICAgICAgICAgICAgVGhlIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMpIHsKLQkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsaWRhdGUuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRlCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgewotCQl0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY5NjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiBkb20gbWFuaXB1bGF0aW9uIGFuZCBzZWFyY2ggZnVuY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRE9NVXRpbGl0aWVzIHsKLQkvLyBIYW5keSBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRfU1RSSU5HID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0xJTkVfU1RSSU5HID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JLy9IYWNrIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgRE9NIGFwaXMgY2hhbmdlIHN1Y2ggdGhhdCB0aGVyZSBpcyBhbiBlYXNpZXIKLQkvL3dheSB0byBmbHVmZiB1cCBhbmQgc2V0IHRoZSBkb2N0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0VOVElUWV9TVFJJTkcgPSAiZHVtbXkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0VOVElUWV9OT0RFX1NUUklORyA9ICI8ZHVtbXkvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZGVmYXVsdERvY3VtZW50QnVpbGRlcjsKLQlwcml2YXRlIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBkZWZhdWx0RW50aXR5UmVzb2x2ZXI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgc3ViIG5vZGVzIG9mIGEgcGF0aC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEl0ZXJhdG9yIGNyZWF0ZVBhdGhJdGVyYXRvcihTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgdFBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IHBhdGguc3Vic3RyaW5nKDEpIDogcGF0aDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodFBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJCXRQYXRoID0gbnVsbDsKLQkJZmluYWwgU3RyaW5nIGFQYXRoID0gdFBhdGg7Ci0KLQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCWludCBwcmV2SW5kZXggPSAwOwotCQkJaW50IGN1ckluZGV4ID0gMDsKLQkJCVN0cmluZyBwYXRoU3RyaW5nID0gYVBhdGg7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIHBhdGhTdHJpbmcgIT0gbnVsbCAmJiBwcmV2SW5kZXggIT0gLTE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQljdXJJbmRleCA9IHBhdGhTdHJpbmcuaW5kZXhPZignLycsIHByZXZJbmRleCk7Ci0JCQkJU3RyaW5nIG5vZGVTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJJbmRleCAhPSAtMSkKLQkJCQkJbm9kZVN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKHByZXZJbmRleCwgY3VySW5kZXgrKyk7Ci0JCQkJZWxzZQotCQkJCQlub2RlU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocHJldkluZGV4KTsKLQkJCQlwcmV2SW5kZXggPSBjdXJJbmRleDsKLQkJCQlyZXR1cm4gbm9kZVN0cmluZzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBmb3IgdGhlIHBhc3NlZCBpbiBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dChOb2RlIG5vZGUpIHsKLQkJVGV4dCB0ZXh0Tm9kZSA9IGdldENoaWxkVGV4dE5vZGUobm9kZSk7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIHRleHROb2RlLmdldERhdGEoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFzc2VkIGluIG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBUZXh0IGdldENoaWxkVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCU5vZGUgdGV4dE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKHRleHROb2RlICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUodGV4dE5vZGUpKSB7Ci0JCQlpZiAoIWlzV2hpdGVzcGFjZSh0ZXh0Tm9kZSkpCi0JCQkJcmV0dXJuIChUZXh0KSB0ZXh0Tm9kZTsKLQkJCXRleHROb2RlID0gdGV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIG9mIHRoZSBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEluZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJUmV2aXNpdC50b0RvKCk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGFzdCBub24tdGV4dCBjaGlsZCBvZiBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBsYXN0IG5vbi10ZXh0IGNoaWxkIG5vZGUgb2YKLQkgKiBAbm9kZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRMYXN0Tm9kZUNoaWxkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBub24tdGV4dCBzaWJsaW5nIGFmdGVyIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgbm9kZSBhZnRlcgotCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBuZXh0IG5vbi10ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0TmV4dE5vZGVTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJcmV0dXJuIHNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCBjaGlsZCBOb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICovCi0Jc3RhdGljIHB1YmxpYyBOb2RlIGdldE5vZGVDaGlsZChOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlOb2RlIGNoaWxkID0gbnVsbDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCWNoaWxkID0gbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2VzIHRoZSBwYXRoIHBhc3NlZCBpbiA8cGF0aE5hbWU+LiBUaGUgcGF0aCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybQotCSAqICdub2RlMS9ub2RlMi9ub2RlMycuIFRoaXMgbWV0aG9kIHN0YXJ0cyBhdCBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgTm9kZSBnZXROb2RlQ2hpbGRGb3JQYXRoKE5vZGUgcGFyZW50LCBTdHJpbmcgcGF0aE5hbWUpIHsKLQotCQlOb2RlIGN1ck5vZGUgPSBwYXJlbnQ7Ci0JCUl0ZXJhdG9yIGkgPSBET01VdGlsaXRpZXMuY3JlYXRlUGF0aEl0ZXJhdG9yKHBhdGhOYW1lKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgY2hpbGQgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWN1ck5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGN1ck5vZGUsIGNoaWxkKTsKLQkJCWlmIChjdXJOb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGN1ck5vZGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBOb2RlIGNoaWxkcmVuIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lcwotCSAqLwotCXN0YXRpYyBwdWJsaWMgTGlzdCBnZXROb2RlQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXMpIHsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vZGVOYW1lcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobm9kZU5hbWVzW2pdLmVxdWFscyhuLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZm91bmQpCi0JCQkJCXJlc3VsdHMuYWRkKG4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTm9kZSBjaGlsZHJlbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgTGlzdCBnZXROb2RlQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkKLQkJCQlyZXN1bHRzLmFkZChuKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgbm9uLXRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c05vZGVTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUoc2libGluZykpCi0JCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJcmV0dXJuIHNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCB0ZXh0IG5vZGUgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gTnVsbCBpZiBubyBzdWNoIG5vZGUgZXhpc3QuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgZ2V0UHJldmlvdXNUZXh0KE5vZGUgbm9kZSkgewotCQlUZXh0IHNpYmxpbmcgPSBnZXRQcmV2aW91c1RleHRTaWJsaW5nKG5vZGUpOwotCi0JCWlmIChzaWJsaW5nID09IG51bGwgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCXNpYmxpbmcgPSBnZXRQcmV2aW91c1RleHQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCi0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGdldFByZXZpb3VzVGV4dFNpYmxpbmcoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJTm9kZSBsYXN0VGV4dCA9IG51bGw7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlsYXN0VGV4dCA9IHNpYmxpbmc7Ci0JCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gKFRleHQpIGxhc3RUZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFRleHQgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXREYXRhKCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgaSA9IHRleHQubGVuZ3RoKCkgLSAxOwotCQlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZXh0LnN1YnN0cmluZygrK2kpOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgPG5ld05vZGU+aW50byA8cGFyZW50PmFmdGVyIDxyZWZOb2RlPi4gSWYgPHJlZk5vZGU+aXMgbnVsbCB0aGVuIHRoZSBub2RlIGlzIGluc2VydGVkCi0JICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyZW50J3MgY2hpbGQgbm9kZXMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0QWZ0ZXJOb2RlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgewotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCQlpZiAocmVmTm9kZSAhPSBudWxsKSB7Ci0JCQlpbnNlcnRCZWZvcmVOb2RlID0gcmVmTm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCWVsc2UKLQkJCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgYSA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YmVmb3JlIDxyZWZOb2RlPi4gVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0Ci0JICogdGhlIGluc2VydGlvbiBkb2VzIG5vdCByZXN1bHQgaW4gdHdvIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZSBET00gbW9kZWwgZG9lcyBub3QgaGFuZGxlCi0JICogYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhleSBtdXN0IGJlIGpvaW5lZCB0b2dldGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dCB0ZXh0TmV3Tm9kZSA9IChUZXh0KSBuZXdOb2RlOwotCi0JCQkvLyBJZiB0aGUgaW5zZXJ0IGJlZm9yZSBub2RlIGlzIHRleHQsIGpvaW4gaXQgd2l0aCB0aGUgbmV3IG5vZGUuCi0JCQlpZiAocmVmTm9kZSAhPSBudWxsICYmIHJlZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHQgdGV4dFJlZk5vZGUgPSAoVGV4dCkgcmVmTm9kZTsKLQkJCQl0ZXh0UmVmTm9kZS5zZXREYXRhKHRleHROZXdOb2RlLmdldERhdGEoKSArIHRleHRSZWZOb2RlLmdldERhdGEoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gSWYgdGhlIG5vZGUgd2UgYXJlIGluc2VydGluZyBhZnRlciBpcyB0ZXh0LAotCQkJLy8gam9pbiBpdCB3aXRoIHRoZSBuZXcgbm9kZS4KLQkJCU5vZGUgaW5zZXJ0QWZ0ZXJOb2RlID0gKHJlZk5vZGUgPT0gbnVsbCkgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiByZWZOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKGluc2VydEFmdGVyTm9kZSAhPSBudWxsICYmIGluc2VydEFmdGVyTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dCB0ZXh0SW5zZXJ0QWZ0ZXJOb2RlID0gKFRleHQpIGluc2VydEFmdGVyTm9kZTsKLQkJCQl0ZXh0SW5zZXJ0QWZ0ZXJOb2RlLnNldERhdGEodGV4dEluc2VydEFmdGVyTm9kZS5nZXREYXRhKCkgKyB0ZXh0TmV3Tm9kZS5nZXREYXRhKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBUaGVyZSBpcyBubyB0ZXh0IG5vZGUgdG8gam9pbiB0bywgc2ltcGxlIGluc2VydCB0aGUgbm9kZS4KLQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgYSA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YmVmb3JlIDxyZWZOb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGluc2VydCB0aGUgbm9kZSBiZWZvcmUKLQkgKiBhbnkgd2hpdGVzcGFjZSBub2RlcyB0aGF0IGFwcGVhciBpbiB0aGUgdHJlZSBiZWZvcmUgPHJlZk5vZGU+LiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gZW5zdXJlCi0JICogdGhhdCB0aGUgaW5zZXJ0aW9uIGRvZXMgbm90IHJlc3VsdCBpbiB0d28gYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhlIERPTSBtb2RlbCBkb2VzIG5vdCBoYW5kbGUKLQkgKiBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGV5IG11c3QgYmUgam9pbmVkIHRvZ2V0aGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJTm9kZSBjdXJOb2RlID0gKHJlZk5vZGUgPT0gbnVsbCkgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiByZWZOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlIGxhc3ROb2RlID0gcmVmTm9kZTsKLQotCQl3aGlsZSAoY3VyTm9kZSAhPSBudWxsICYmIChET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKGN1ck5vZGUpIHx8IERPTVV0aWxpdGllcy5pc0NvbW1lbnQoY3VyTm9kZSkpKSB7Ci0JCQlsYXN0Tm9kZSA9IGN1ck5vZGU7Ci0JCQljdXJOb2RlID0gY3VyTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCi0JCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBsYXN0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGVudGlyZWx5IGNvbW1lbnQgb3Igbm90LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyB3aGl0ZXNwYWNlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCXJldHVybiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgZW50aXJlbHkgd2hpdGVwYWNlIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgd2hpdGVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVRleHQgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Tm9kZS5nZXREYXRhKCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgY2hpbGRyZW4gb2YgPG5vZGU+Ci0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlub2RlLnJlbW92ZUNoaWxkKGxpc3QuaXRlbShpKSk7Ci0JCX0KLQl9Ci0KLQkvLyB0cmF2ZXJzZXMgdGhlIERPTSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIHJldHVybnMgYSBsaXN0Ci0JLy8gb2Ygbm9kZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBzdHJpbmcKLQotCXN0YXRpYyBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCUFycmF5TGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlTdHJpbmdbXSBub2RlTmFtZXMgPSB7bm9kZU5hbWV9OwotCQlmaW5kQWxsTm9kZXMobm9kZSwgbm9kZU5hbWVzLCBub2RlTGlzdCk7Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8vIHRyYXZlcnNlcyB0aGUgRE9NIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgcmV0dXJucyBhIGxpc3QKLQkvLyBvZiBub2RlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHN0cmluZ3MKLQotCXN0YXRpYyBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzQXJyYXkpIHsKLQkJQXJyYXlMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaW5kQWxsTm9kZXMobm9kZSwgbm9kZU5hbWVzQXJyYXksIG5vZGVMaXN0KTsKLQotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JLy8gcmVjdXJzaXZlIGhlbHBlciBmb3IgZ2V0QWxsTm9kZXMKLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGZpbmRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lcywgQXJyYXlMaXN0IHJlc3VsdHMpIHsKLQotCQlOb2RlTGlzdCBub2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2RlTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5vZGVzLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWVzW2pdKSkgewotCQkJCQkJcmVzdWx0cy5hZGQobm9kZXMuaXRlbShpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluZEFsbE5vZGVzKG5vZGVzLml0ZW0oaSksIG5vZGVOYW1lcywgcmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gZGVmaW5lZCBKQVhQIGRvY3VtZW50IGJ1aWxkZXIKLQkgKi8KLQlzdGF0aWMgcHVibGljIERvY3VtZW50QnVpbGRlciBuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKERPTUxvYWRPcHRpb25zIG9wdGlvbnMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCWRiZi5zZXRWYWxpZGF0aW5nKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKTsKLQkJZGJmLnNldE5hbWVzcGFjZUF3YXJlKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKTsKLQkJLyoKLQkJICogQ2F1c2VzIGVycm9ycyBpbiBJQk0gSkRLIHRyeSB7IGRiZi5zZXRBdHRyaWJ1dGUoUmVuZGVyZXIuSkFYUF9TQ0hFTUFfTEFOR1VBR0UsCi0JCSAqIFJlbndkZXJlci5XM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJICovCi0JCXRyeSB7Ci0JCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCBuZXcgQm9vbGVhbihvcHRpb25zLmlzQWxsb3dKYXZhRW5jb2RpbmdzKCkpKTsgLy8kTk9OLU5MUy0xJAkgICAgICAgIAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5nc1wiLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIG5ldyBCb29sZWFuKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJZGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZGJmLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMob3B0aW9ucy5pc0V4cGFuZEVudGl0eVJlZmVyZXJlbmNlcygpKTsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJcmVzdWx0LnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCXRocm93IGFyZzA7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJdGhyb3cgYXJnMDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhhcmcwKTsKLQkJCX0KLQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3R1YiBkb2N1bWVudCwgd2hlcmUgdGhlIERvY3VtZW50VHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlTmV3RG9jdW1lbnQoU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RGVmYXVsdERvY3VtZW50QnVpbGRlcigpOwotCQlJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgdHJ1ZSk7Ci0JCURvY3VtZW50IHJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaW4pOwotCQlyZW1vdmVEdW1teUVudGl0eShyZXN1bHQpOwotCQlyZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgRE9NTG9hZE9wdGlvbnMgb3B0aW9ucywgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBET01VdGlsaXRpZXMubmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihvcHRpb25zKTsKLQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0JCURvY3VtZW50IHJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaW4pOwotCQlyZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoZSBET00gTGV2ZWwgMiBBUElzIGFyZSBub3QgYWR2YW5jZWQgZW5vdWdoIGZvciBzZXR0aW5nIHRoZQotCSAqIGRvY3VtZW50IHR5cGU7IHNvIHRoZSBvbmx5IHBhcnNlciBpbmRlcGVuZGVudCB3YXkgb2YgYWNjb21wbGlzaGluZyB0aGlzIGlzIGJ5IGNyZWF0aW5nIGEKLQkgKiBzdHJlYW0gYW5kIHBhcnNpbmcgaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJcmV0dXJuIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgZmFsc2UpOwotCX0KLQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBib29sZWFuIGluY2x1ZGVEdW1teSkgewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0JCS8vIFRoZSBwcmlvciBjb2RlICh3aGljaCBpcyBzdGlsbCBpbiB0aGUgY2F0Y2ggYmxvY2spLCB1c2VzCi0JCS8vIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZyBbU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIildOwotCQkvLyBvbiBaL09TIHRoaXMgaXMgQ3AxMDQ3LiBUaGUgY29tYmluYXRpb24gb2YgIlVURi04IiBpbiB0aGUgaGVhZGVyCi0JCS8vIGFuZCAiQ3AxMDQ3IiBpbiB0aGUgd3JpdGVyIGNyZWF0ZSBhbiB1bnVzYWJsZSBpbnB1dCBzdHJlYW0uCi0KLQkJUHJpbnRXcml0ZXIgd3JpdGVyOwotCi0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0V3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFdyaXRlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIChlYXJsaWVyIGNvZGUpCi0JCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0U3RyZWFtKTsgCi0JCX0KLQotCQl3cml0ZUhlYWRlcih3cml0ZXIsIGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCWlmIChpbmNsdWRlRHVtbXkpCi0JCQlhZGREdW1teUVudGl0eSh3cml0ZXIpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gb3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUhlYWRlcihQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQl3cml0ZXIud3JpdGUoIjw/eG1sIHZlcnNpb249XCIiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiXCIgZW5jb2Rpbmc9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCJcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oKTsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQl3cml0ZXIud3JpdGUoIjwhRE9DVFlQRSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKGRvY3R5cGUpOwotCQkJd3JpdGVyLndyaXRlKCIgUFVCTElDIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShwdWJsaWNJZCk7Ci0JCQl3cml0ZXIud3JpdGUoIlwiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShzeXN0ZW1JZCk7Ci0JCQl3cml0ZXIud3JpdGUoIlwiPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREdW1teUVudGl0eShQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCXdyaXRlci5wcmludGxuKERVTU1ZX0VOVElUWV9OT0RFX1NUUklORyk7Ci0JCS8vTWFqb3IgaGFjayBiZWNhdXNlIHdlIGNhbiBub3QgcGFyc2UgYW4gZW1wdHkgZG9jdW1lbnQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUR1bW15RW50aXR5KERvY3VtZW50IGRvYykgewotCQlkb2MucmVtb3ZlQ2hpbGQoZ2V0Tm9kZUNoaWxkKGRvYywgRFVNTVlfRU5USVRZX1NUUklORykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKERvY3VtZW50IGRvYykgewotCQkvL2Fub3RoZXIgbWFqb3IgaGFjayBiZWNhdXNlIG9mIGEgYnVnIGluIFhNTDRKIDQuMC43IHRoYXQgYWRkZWQgYWxsIHRoZQotCQkvL2NvbW1lbnRzIGZyb20gdGhlIGR0ZCB0byB0aGUgZG9jdW1lbnQuIENhbiBiZSByZW1vdmVkIGFmdGVyIHdlIG1vdmUgdXAKLQkJLy9YZXJjZXMgbGV2ZWxzCi0JCU5vZGUgYU5vZGUgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBuZXh0Tm9kZSA9IGFOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkKLQkJCQlkb2MucmVtb3ZlQ2hpbGQoYU5vZGUpOwotCQkJYU5vZGUgPSBuZXh0Tm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgY2FjaGUgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIEpBWFAgcmVnaXN0ZXJlZCBkb2N1bWVudCBidWlsZGVyLiBWYWxpZGF0aW9uCi0JICogaXMgZGlzYWJsZWQgZm9yIHRoaXMgaW5zdGFuY2UuIElmIHlvdSBuZWVkIHZhbGlkYXRpb24sIHVzZQotCSAqIHtAbGluayAjbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihib29sZWFuLCBib29sZWFuLCBib29sZWFuKX0KLQkgKiAKLQkgKiBAcmV0dXJuIERvY3VtZW50QnVpbGRlcgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIEpBWFAgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RGVmYXVsdERvY3VtZW50QnVpbGRlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGRlZmF1bHREb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkgewotCQkJRE9NTG9hZE9wdGlvbnMgb3B0cyA9IG5ldyBET01Mb2FkT3B0aW9ucygpOwotCQkJb3B0cy5zZXRBbGxvd0phdmFFbmNvZGluZ3ModHJ1ZSk7Ci0JCQlvcHRzLnNldEV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyh0cnVlKTsKLQkJCW9wdHMuc2V0VmFsaWRhdGUoZmFsc2UpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlciA9IG5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIob3B0cyk7Ci0JCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGRlZmF1bHRFbnRpdHlSZXNvbHZlcik7Ci0JCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JCXJldHVybiBkZWZhdWx0RG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudGl0eVJlc29sdmVyIGdldERlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRFbnRpdHlSZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKEVudGl0eVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCWRlZmF1bHRFbnRpdHlSZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RhbmdsaW5nSFJFRkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RhbmdsaW5nSFJFRkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJkMDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMTIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIHByb3h5IGNhbiBub3QgYmUgcmVzb2x2ZWQKLSAqLwotcHVibGljIGNsYXNzIERhbmdsaW5nSFJFRkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQotCXB1YmxpYyBEYW5nbGluZ0hSRUZFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NjY5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDI6NDk6NDkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRURfQ09OVkVSU0lPTl9QQVRURVJOID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOwotCi0JLyoqCi0JICogRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgQm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Jvb2xlYW4oT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Cb29sZWFuX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBCeXRlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvQnl0ZShPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gQnl0ZS52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBCeXRlKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkJ5dGVfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIENoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0NoYXJhY3RlcihPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpIGFWYWx1ZSkubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKCgoU3RyaW5nKSBhVmFsdWUpLmNoYXJBdCgwKSk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQ2hhcmFjdGVyX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBEb3VibGUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Eb3VibGUoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBEb3VibGUudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdERvdWJsZSgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRG91YmxlX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBFRW51bUxpdGVyYWwuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9FbnVtKE9iamVjdCBhVmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9IG51bGw7Ci0JCUVFbnVtIGVlbnVtID0gKEVFbnVtKSBhRmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoU3RyaW5nKSBhVmFsdWUpOwotCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoKEludGVnZXIpIGFWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVFbnVtTGl0ZXJhbCkKLQkJCWxpdGVyYWwgPSAoRUVudW1MaXRlcmFsKSBhVmFsdWU7Ci0KLQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FbnVtZXJhdGlvbl9VSV8pOwotCi0JCXJldHVybiBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBGbG9hdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Zsb2F0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gRmxvYXQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdEZsb2F0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEZsb2F0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkZsb2F0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBJbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvSW50ZWdlcihPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdEludGVnZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5JbnRlZ2VyX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBKYXZhIE9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0phdmFPYmplY3QoT2JqZWN0IGFWYWx1ZSkgewotCQlyZXR1cm4gYVZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgTG9uZy4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0xvbmcoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBMb25nLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRMb25nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIExvbmcpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTG9uZ19VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgTW9mT2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvTW9mT2JqZWN0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTW9mT2JqZWN0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBTaG9ydC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb1Nob3J0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gU2hvcnQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFNob3J0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFNob3J0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLlNob3J0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBTdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSkgewotCQlyZXR1cm4gYVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYW5BdHRyaWJ1dGUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQotCQlFQ2xhc3NpZmllciBtZXRhID0gYW5BdHRyaWJ1dGUuZ2V0RVR5cGUoKTsKLQkJaWYgKG1ldGEuZUNsYXNzKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFRW51bSgpKQotCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7Ci0JCWlmIChtZXRhLmdldEVQYWNrYWdlKCkgaW5zdGFuY2VvZiBFY29yZVBhY2thZ2UpCi0JCXsKLQkJCXN3aXRjaCAobWV0YS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTVFJJTkcgOgotCQkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU5fT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTiA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Cb29sZWFuKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVEVHRVJfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FSU5UIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0ludGVnZXIoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVRfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVQgOgotCQkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUkFDVEVSX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVIgOgotCQkJCQlyZXR1cm4gY29udmVydFRvQ2hhcmFjdGVyKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkdfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FTE9ORyA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Mb25nKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEVfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQllURSA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRV9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEUgOgotCQkJCQlyZXR1cm4gY29udmVydFRvRG91YmxlKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0KGFWYWx1ZSk7Ci0JCQkJLy8JCWNhc2UgRWNvcmVQYWNrYWdlLkVFTlVNOgotCQkJCS8vCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRU9CSkVDVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Nb2ZPYmplY3QoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FSkFWQV9PQkpFQ1QgOgotCQkJCQlyZXR1cm4gY29udmVydFRvSmF2YU9iamVjdChhVmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1ldGEuZ2V0RVBhY2thZ2UoKSBpbnN0YW5jZW9mIFhNTFR5cGVQYWNrYWdlKQotCQl7Ci0JCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU1RSSU5HIDoKLQkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJPT0xFQU5fT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQk9PTEVBTiA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0Jvb2xlYW4oYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5UX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVEVHRVIgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlQgOgotCQkJCXJldHVybiBjb252ZXJ0VG9JbnRlZ2VyKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUIDoKLQkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuTE9OR19PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5MT05HIDoKLQkJCQlyZXR1cm4gY29udmVydFRvTG9uZyhhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CWVRFX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJZVEUgOgotCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkRPVUJMRV9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5ET1VCTEUgOgotCQkJCXJldHVybiBjb252ZXJ0VG9Eb3VibGUoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlRfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlQgOgotCQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydChhVmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYUZlYXR1cmUuCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpZiAoYVZhbHVlID09IG51bGwgfHwgYUZlYXR1cmUgPT0gbnVsbCB8fCAhKGFGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkpCi0JCQlyZXR1cm4gYVZhbHVlOyAvL25vdGhpbmcgdG8gY29udmVydAotCQlyZXR1cm4gY29udmVydFZhbHVlKGFWYWx1ZSwgKEVBdHRyaWJ1dGUpIGFGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRG91YmxlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgZGVmYXVsdERvdWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IEZsb2F0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBGbG9hdCBkZWZhdWx0RmxvYXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBJbnRlZ2VyIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGRlZmF1bHRJbnRlZ2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgTG9uZyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9uZyBkZWZhdWx0TG9uZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IFNob3J0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTaG9ydCBkZWZhdWx0U2hvcnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZhaWxlZCB0byBjb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZhaWxlZFRvQ29udmVydChPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN0cmluZykgewotCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoRkFJTEVEX0NPTlZFUlNJT05fUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FWYWx1ZS50b1N0cmluZygpLCBhU3RyaW5nfSk7Ci0JCXRocm93IG5ldyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdjMGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBHTE9CQUxfRkFDVE9SWSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKERFRkFVTFRfRVhURU5TSU9OKSk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIG51bGwpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSwgU3RyaW5nIGNvbnRlbnRUeXBlKQotCXsKLQkJT2JqZWN0IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJU3RyaW5nIHByb3RvY29sID0gdXJpLnNjaGVtZSgpOwotCQkJcmVzb3VyY2VGYWN0b3J5ID0gcHJvdG9jb2xUb0ZhY3RvcnlNYXAuZ2V0KHByb3RvY29sKTsKLQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJCVN0cmluZyBleHRlbnNpb24gPSB1cmkuZmlsZUV4dGVuc2lvbigpOwotCQkJCXJlc291cmNlRmFjdG9yeSA9IGV4dGVuc2lvblRvRmFjdG9yeU1hcC5nZXQoZXh0ZW5zaW9uKTsKLQkJCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gZGVsZWdhdGVkR2V0RmFjdG9yeSh1cmkpOwotCQkJCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IEdMT0JBTF9GQUNUT1JZKSB7Ci0JCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBleHRlbnNpb25Ub0ZhY3RvcnlNYXAuZ2V0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04pOwotCQkJCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKQotCQkJCQkJCXJlc291cmNlRmFjdG9yeSA9IEdMT0JBTF9GQUNUT1JZOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2VGYWN0b3J5IGluc3RhbmNlb2YgUmVzb3VyY2UuRmFjdG9yeS5EZXNjcmlwdG9yID8gKChSZXNvdXJjZS5GYWN0b3J5LkRlc2NyaXB0b3IpIHJlc291cmNlRmFjdG9yeSkuY3JlYXRlRmFjdG9yeSgpIDogKFJlc291cmNlLkZhY3RvcnkpIHJlc291cmNlRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCNkZWxlZ2F0ZWRHZXRGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIEZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCXJldHVybiBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWY2NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MjU6NDMgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCXByb3RlY3RlZCBPYmplY3QgcmVmZXJlbmNlVmFsdWU7Ci0JcHJvdGVjdGVkIEVPYmplY3QgY29weUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkU3VmZml4OwotCi0JLyoqCi0JICogRGVmZXJyZWRDb3B5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIE9iamVjdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCXJlZmVyZW5jZSA9IGFSZWZlcmVuY2U7Ci0JCXJlZmVyZW5jZVZhbHVlID0gYVZhbHVlOwotCQlpZFN1ZmZpeCA9IGFTdWZmaXg7Ci0JCWNvcHlDb250YWluZXIgPSBhQ29weUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNi8yMDAwIDk6MzI6MjggQU0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBnZXRDb3B5Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29weUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MzQ6NTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWRTdWZmaXgoKSB7Ci0JCXJldHVybiBpZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MzQ6NTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlVmFsdWUoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtQWN0aW9uKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmUwNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhbiBpbnRlcmZhY2UgdG8gYW4gb2JqZWN0IHdoaWNoIGNhbiBlbmNvZGUgYW5kIGRlY29kZSB2YWx1ZXMuIFRoaXMgdHlwaWNhbGx5IGludm9sdmVzCi0gKiBjcnlwdG9ncmFwaHkgYWxnb3JpdGhtcy4gVGhpcyBpbnRlcmZhY2UsIGFsb25nIHdpdGggdGhlIHN1cHBsaWVkIGFkYXB0ZXJzIHByb3ZpZGUgYW4gZXh0ZW5zaW9uCi0gKiBtZWNoYW5pc20gZm9yIHBsdWdnYWJsZSBjcnl0b2dyYXBoeSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gc3RvcmluZyBhbmQgcmV0cmlldmluZyBhdHRyaWJ1dGUKLSAqIHZhbHVlcywgYW5kIGlzIHVzZWQgcHJldmFsZW50bHkgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwYXNzd29yZCB2YWx1ZXMgb2YgbW9mIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW5jb2RlckRlY29kZXIgewotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGIzMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9ucwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTUxMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFJlZ2lzdHJ5IGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHZhbHVlIGRlY29kZXJzIGFuZCBlbmNvZGVycy4gVXNhZ2UgRXhhbXBsZToKLSAqIAotICogPHByZT4KLSAqIAotICogCi0gKiAvLyBVc2UgdGhlIHN0YW5kYXJkIFdlYlNwaGVyZSBwYXNzd29yZCB2YWx1ZSBlbmNvZGVyL2RlY29kZXIuCi0gKiBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmdldERlZmF1bHRSZWdpc3RyeSgpLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgY29tLmlibS5lanMuc2VjdXJpdHkudXRpbC5XQVNFbmNvZGVyRGVjb2RlcigpKTsKLSAqIC8vIEJlZ2luIHRyYWNraW5nIGNoYW5nZXMuLi4KLSAqIFdyaXRlQmFja0hlbHBlci5iZWdpbigpOwotICogLy8gTG9hZCBhIHJlc291cmNlIHdoaWNoIG1heSBoYXZlIHVuLWVuY29kZWQgdmFsdWVzLi4uCi0gKiAvLyBOb3RlOiBUaGUgV0NDTSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHVuLWVuY29kZWQgdmFsdWVzLiAgSWYgdW5lbmNvZGVkIHZhbHVlcwotICogLy8gYXJlIGZvdW5kLCB0aGUgdmFsdWUgd2lsbCBiZSBlbmNvZGVkLCBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gKiAvLyBXcml0ZUJhY2tIZWxwZXIuCi0gKiBSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5sb2FkKCZxdW90O215UmVzb3VyY2UmcXVvdDspOwotICogLy8gRW5zdXJlIHRoYXQgYW55IGNoYW5nZXMgZHVlIHRvIGVuY29kaW5nIGFyZSB3cml0dGVuIGJhY2sgb3V0LgotICogV3JpdGVCYWNrSGVscGVyLmVuZCgpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgX2RlZmF1bHRJbnN0YW5jZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kZXJEZWNvZGVyIElOSVRJQUxfREVGQVVMVF9FTkNPREVSID0gUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5JTlNUQU5DRTsKLQlwcm90ZWN0ZWQgTWFwIGVuY29kZXJzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRFbmNvZGVyS2V5OwotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJSZWdpc3RyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplRGVmYXVsdEVuY29kZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMi8yLzIwMDEgMTI6NDM6MzEgQU0pCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW5jb2RlckRlY29kZXIoRW5jb2RlckRlY29kZXIgZW5jb2RlckRlY29kZXIpIHsKLQkJZW5jb2RlcnMucHV0KGVuY29kZXJEZWNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlbmNvZGVyRGVjb2Rlcik7Ci0JCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQotCQkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyIGdldERlZmF1bHRFbmNvZGVyRGVjb2RlcigpIHsKLQkJaWYgKGRlZmF1bHRFbmNvZGVyS2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFbmNvZGVyRGVjb2RlcikgZW5jb2RlcnMuZ2V0KGRlZmF1bHRFbmNvZGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IHRvIHVzZSBmb3IgcmV0cmlldmluZyB2YWx1ZSBlbmNvZGVycyBhbmQgZGVjb2RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgZ2V0RGVmYXVsdFJlZ2lzdHJ5KCkgewotCQlpZiAoX2RlZmF1bHRJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfZGVmYXVsdEluc3RhbmNlID0gbmV3IEVuY29kZXJEZWNvZGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gX2RlZmF1bHRJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyIGdldEVuY29kZXJEZWNvZGVyKE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIChFbmNvZGVyRGVjb2RlcikgZW5jb2RlcnMuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBzdGFuZGFyZCBzZXQgb2YgZW5jb2Rlci9kZWNvZGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdEVuY29kZXJzKCkgewotCQlzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoSU5JVElBTF9ERUZBVUxUX0VOQ09ERVIpOwotCQlhZGRFbmNvZGVyRGVjb2RlcihuZXcgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbmNvZGVyL2RlY29kZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7Ci0JCWlmIChlbmNvZGVycy5jb250YWluc0tleShrZXkpKSB7Ci0JCQllbmNvZGVycy5yZW1vdmUoa2V5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2Rlci9kZWNvZGVyIGJ5IGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoRW5jb2RlckRlY29kZXIgZW5jb2RlcikgewotCQlkZWZhdWx0RW5jb2RlcktleSA9IGVuY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWlmICghZW5jb2RlcnMuY29udGFpbnNLZXkoZGVmYXVsdEVuY29kZXJLZXkpKSB7Ci0JCQlhZGRFbmNvZGVyRGVjb2RlcihlbmNvZGVyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA4MDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyNTo1OSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRXRvb2xzQ29weVNlc3Npb24gZXh0ZW5kcyBFdG9vbHNDb3B5VXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQ09QSUVEID0gNTAwOwotCXByaXZhdGUgRXRvb2xzQ29weVV0aWxpdHkgcGFyZW50Q29weVV0aWxpdHk7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50Q29weVJlc291cmNlOwotCi0JLyoqCi0JICogRXRvb2xzQ29weVNlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRXRvb2xzQ29weVNlc3Npb24oRXRvb2xzQ29weVV0aWxpdHkgYUNvcHlVdGlsaXR5KSB7Ci0JCXBhcmVudENvcHlVdGlsaXR5ID0gYUNvcHlVdGlsaXR5OwotCQlzZXRQcmVzZXJ2ZUlkcyhhQ29weVV0aWxpdHkucHJlc2VydmVJZHMoKSk7Ci0JCXNldENvcHlBZGFwdGVycyhhQ29weVV0aWxpdHkuaXNDb3B5QWRhcHRlcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bwotCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQotCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICogCi0JICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKLQkJCWNvcHlSZXNvdXJjZXMoYUdyb3VwKTsKLQkJCWNvcHlSZWZPYmplY3RzKGFHcm91cCk7Ci0JCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQkJYUdyb3VwLnBvc3RDb3B5KHRoaXMpOwotCQkJbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKGFHcm91cCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGNvbnRhaW5tZW50Q29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWV4ZWN1dGVEZWZlcnJlZENvcHlBY3Rpb25zKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGlzIG1ldGhvZCBvbmx5IGNvcGllcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBhdHRyaWJ1dGVzLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGUgY29waWVkIFJlc291cmNlIHdpbGwgaGF2ZSBhIFVSSSBlcXVhbCB0byA8Y29kZT5uZXdVcmk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlSZXNvdXJjZSBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQljb3B5TW9kaWZpY2F0aW9uRmxhZyhhUmVzb3VyY2UsIGNvcGllZCk7Ci0JCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKENvcHlHcm91cCBncm91cCkgewotCQlMaXN0IGNvcGllZCA9IGdyb3VwLmdldENvcGllZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcGllZC5zaXplKCk7IGkrKykgewotCQkJbm90aWZ5TmV3UmVzb3VyY2VDb3BpZWQoKFJlc291cmNlKSBjb3BpZWQuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlQ29waWVkKFJlc291cmNlIGNvcGllZCkgewotCQljb3BpZWQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChSRVNPVVJDRV9DT1BJRUQsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNwcmltQ29weU9iamVjdChFT2JqZWN0LAotCSAqICAgICAgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29weSA9IHN1cGVyLnByaW1Db3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJY29weUlkSWZOZWNlc3NhcnkoYVJlZk9iamVjdCwgY29weSwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SWRJZk5lY2Vzc2FyeShFT2JqZWN0IG9iaiwgRU9iamVjdCBjb3B5LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJaWYgKChpZFN1ZmZpeCA9PSBudWxsICYmICFwcmVzZXJ2ZUlkcykgfHwgY3VycmVudFJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpZCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJRChvYmopOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWQgPSBpZFN1ZmZpeCA9PSBudWxsID8gaWQgOiBpZCArIGlkU3VmZml4OwotCQljdXJyZW50Q29weVJlc291cmNlLnNldElEKGNvcHksIGlkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCBkZWxpdmVyeSBiYWNrIG9uIGZvciBhbGwgdGhlIGNhY2hlZCBvYmplY3RzIGFuZCBwdXNoIHRoZW0gdG8gdGhlIHBhcmVudENvcHlVdGlsaXR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlJdGVyYXRvciBpdCA9IGdldENvcGllZE9iamVjdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcCBwYXJlbnRDb3BpZXMgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcGllZE9iamVjdHMoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlFT2JqZWN0IGNvcHk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJY29weSA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJY29weS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJCXBhcmVudENvcGllcy5wdXQoZW50cnkuZ2V0S2V5KCksIGNvcHkpOwotCQl9Ci0JCWNvcGllZE9iamVjdHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBhbk9iamVjdCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcHkoYW5PYmplY3QpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzA0LzAxIDExOjI4OjA3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5Ci0JICovCi0JcHJvdGVjdGVkIEV0b29sc0NvcHlVdGlsaXR5IGdldFBhcmVudENvcHlVdGlsaXR5KCkgewotCQlyZXR1cm4gcGFyZW50Q29weVV0aWxpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIEVPYmplY3QgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGFzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IG5ld0luc3RhbmNlKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlFT2JqZWN0IG5ld1R5cGUgPSBzdXBlci5uZXdJbnN0YW5jZShhUmVmT2JqZWN0KTsKLQkJbmV3VHlwZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCXJldHVybiBuZXdUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5I25ld0luc3RhbmNlKFJlc291cmNlLCBTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlSZXNvdXJjZSBjb3B5ID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWN1cnJlbnRSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYVJlc291cmNlOwotCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgY29weTsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRSZXNvdXJjZSA9IG51bGw7Ci0JCQljdXJyZW50Q29weVJlc291cmNlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkOTFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxMDo1NSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRXRvb2xzQ29weVV0aWxpdHkgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVOVU1MSVRFUkFMX1RZUEVfTkFNRSA9ICJFRW51bUxpdGVyYWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBFY29yZVBhY2thZ2UgcGtnID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQotCXByaXZhdGUgZmluYWwgRVR5cGVkRWxlbWVudCBNRVRBRU5BTUUgPSBwa2cuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCBjb3BpZWRPYmplY3RzOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOwotCXByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlSWRzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29weUFkYXB0ZXJzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY29waWVkQWRhcHRlcnM7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uIGV4dGVuZHMgRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uIHsKLQkJcHVibGljIERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIE9iamVjdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCQlzdXBlcihhUmVmZXJlbmNlLCBhVmFsdWUsIGFTdWZmaXgsIGFDb3B5Q29udGFpbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0JCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIGdldFJlZmVyZW5jZVZhbHVlKCk7Ci0JCQlnZXRDb3B5Q29udGFpbmVyKCkuZVNldChnZXRSZWZlcmVuY2UoKSwgZ2V0Q29weUlmRm91bmQodmFsdWUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uIGV4dGVuZHMgRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uIHsKLQkJcHVibGljIERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBMaXN0IGFWYWx1ZSwgU3RyaW5nIGFTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKLQkJCXN1cGVyKGFSZWZlcmVuY2UsIGFWYWx1ZSwgYVN1ZmZpeCwgYUNvcHlDb250YWluZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgZ2V0Q29weUNvbnRhaW5lcigpLmVHZXQoZ2V0UmVmZXJlbmNlKCkpOwotCQkJSXRlcmF0b3IgaXQgPSAoKExpc3QpIGdldFJlZmVyZW5jZVZhbHVlKCkpLml0ZXJhdG9yKCk7Ci0JCQlFT2JqZWN0IG5leHQ7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmV4dCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJY29weUxpc3QuYWRkKGdldENvcHlJZkZvdW5kKG5leHQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxNDoyNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgRXRvb2xzQ29weVV0aWxpdHkoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+RGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbjwvY29kZT4gYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBkZWZlcnJlZAotCSAqIGNvcHkgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBMaXN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuYWRkKG5ldyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uKHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5EZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb248L2NvZGU+IGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgZGVmZXJyZWQKLQkgKiBjb3B5IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuYWRkKG5ldyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24ocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcikpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhbiBhbHJlYWR5IGNvcGllZCBvYmplY3QgZmlyc3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgY29udGFpbm1lbnRDb3B5KEVPYmplY3QgYW5PYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBwcmltQ29weShhbk9iamVjdCwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhbiBhbHJlYWR5IGNvcGllZCBvYmplY3QgZmlyc3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgY29udGFpbm1lbnRDb3B5T2JqZWN0KEVPYmplY3QgYW5PYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBwcmltQ29weU9iamVjdChhbk9iamVjdCwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBjb250YWlubWVudENvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCS8qIGNvcGllZCByZXNvdXJjZXMgYXJlIG5ldmVyIGNhY2hlZCAqLwotCQlyZXR1cm4gcHJpbUNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQkJc2Vzc2lvbi5zZXRQcmVzZXJ2ZUlkcyhhR3JvdXAuZ2V0UHJlc2VydmVJZHMoKSk7Ci0JCQlzZXNzaW9uLmNvcHkoYUdyb3VwKTsKLQkJCXNlc3Npb24uZmx1c2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBjb3B5KGFSZWZPYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhpcyBtZXRob2Qgb25seSBjb3BpZXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gd2l0aCBpdHMgcHJvcGVydGllcywgbm90Ci0JICogcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGUgY29waWVkIFJlc291cmNlIHdpbGwgaGF2ZSBhIFVSSSBlcXVhbCB0byA8Y29kZT5uZXdVcmk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlSZXNvdXJjZSBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYW4gYXR0cmlidXRlIGlzIHNldCBhbmQgaXRzIHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBwZXJmb3JtIGNvcHkKLQkgKiA8Y29kZT5hdHRyaWJ1dGU8L2NvZGU+IHZhbHVlIGZyb20gPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gdG8gPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogTnVsbCBpcyBhIHZhbGlkIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoIWF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSkKLQkJCXJldHVybjsgLy9pZ25vcmUKLQkJaWYgKGF0dHJpYnV0ZS5pc01hbnkoKSkgewotCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWNvcHlNYW55QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfSBlbHNlIGlmIChhUmVmT2JqZWN0LmVJc1NldChhdHRyaWJ1dGUpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQljb3B5U2luZ2xlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfSBlbHNlIGlmIChhdHRyaWJ1dGUgPT0gTUVUQUVOQU1FKSB7Ci0JCQkvL3NldCBuYW1lIHRvIHRoZSBJRCAodGhpcyBpcyBjb21wdXRlZCBhcyBhIGRlZmF1bHQpLCBvbmx5IGdldCBoZXJlIGlmIGlzU2V0TmFtZSBpcwotCQkJLy8gZmFsc2UuCi0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY2VpdmVyIGFuZCBjb3B5IGVhY2ggYXR0cmlidXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXJyZW50QXR0cmlidXRlcyhFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCUxpc3QgYXR0cmlidXRlcyA9IGFSZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0JCQlFQXR0cmlidXRlIHJhOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJhID0gKEVBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCQljb3B5QXR0cmlidXRlKHJhLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIERvIG5vdGhpbmcgaWYgdGhlIHJlZmVyZW5jZSBlcXVhbHMgdGhlIG1ldGFFQ29udGFpbmVyIG9yIG1ldGFFQ29udGFpbnMgcmVmZXJlbmNlcy4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXJyZW50UmVmZXJlbmNlcyhFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IGFSZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JCQlFUmVmZXJlbmNlIHJyOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJyID0gKEVSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc2hvdWxkQ29weVJlZmVyZW5jZShycikpCi0JCQkJCWNvcHlSZWZlcmVuY2UocnIsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgb3ZlciA8Y29kZT5hbkV4dGVudDwvY29kZT4gYW5kIGNvcHkgZWFjaCBlbGVtZW50IHRvIDxjb2RlPmNvcHlFeHRlbnQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlFeHRlbnQoRUxpc3QgYW5FeHRlbnQsIEVMaXN0IGNvcHlFeHRlbnQpIHsKLQkJSXRlcmF0b3IgaXQgPSBhbkV4dGVudC5pdGVyYXRvcigpOwotCQlFT2JqZWN0IHJlZk9iamVjdDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVmT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWNvcHlFeHRlbnQuYWRkKGNvbnRhaW5tZW50Q29weShyZWZPYmplY3QsIG51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBtYW55IHZhbHVlIGF0dHJpYnV0ZSB3aGljaCBpcyB0cmVhdGVkIGFzIGEgbWFueSB2YWx1ZWQgcmVmZXJlbmNlLgotCSAqIAotCSAqIFRlc3RzOgotCSAqIAotCSAqIDEuIElmIHRoZSB0eXBlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHNldCB0aGUgdmFsdWUgb24KLQkgKiA8Y29kZT5jb3B5UmVmPC9jb2RlPiB3aXRob3V0IG1ha2luZyBhIGNvcHkuIDIuIElmIHRoZSB0eXBlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0JICogb2J0YWluIHRoZSBsaXN0IGZyb20gPGNvZGU+Y29weVJlZjwvY29kZT4gYW5kIGFkZCBhIGNvcHkgb2YgZWFjaCB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbAotCSAqIGxpc3QgdG8gaXQuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TWFueUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgTGlzdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpID09IG51bGwpCi0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOwotCQllbHNlIHsKLQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgY29weVJlZi5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlJdGVyYXRvciBpdCA9IGFWYWx1ZS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IG5leHQ7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobmV4dCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCWNvcHlMaXN0LmFkZChjb250YWlubWVudENvcHkoKEVPYmplY3QpIG5leHQsIGlkU3VmZml4KSk7Ci0JCQkJZWxzZQotCQkJCQljb3B5TGlzdC5hZGQobmV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIElmIHRoZSByZWZlcmVuY2UgaXMgbWFueSwgb2J0YWluIHRoZSBsaXN0IGZyb20gdGhlIHJlY2VpdmluZyBvYmplY3QgYW5kIG1ha2UgYSBjb3B5Ci0JICogb2YgZWFjaCB2YWx1ZSBpZiB0aGUgcmVmZXJlbmNlIGlzIGNvbXBvc2l0ZSBiZWZvcmUgYWRkaW5nIHRvIHRoZSBsaXN0OyBvdGhlcndpc2UsIGp1c3QgYWRkCi0JICogZWFjaCB2YWx1ZSB0byB0aGUgb2YgdGhlIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1hbnlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBMaXN0IGFMaXN0LCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmICghYUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGNvcHlSZWYuZUdldChhUmVmZXJlbmNlKTsKLQkJCQlJdGVyYXRvciBpdCA9IGFMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJRU9iamVjdCB0YXJnZXRWYWx1ZTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRhcmdldFZhbHVlID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJY29weUxpc3QuYWRkKGNvbnRhaW5tZW50Q29weSh0YXJnZXRWYWx1ZSwgaWRTdWZmaXgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlhZGREZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5KGFSZWZlcmVuY2UsIGFMaXN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcGVyZm9ybSB0aGUgY29weS4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHZhbHVlID0gKExpc3QpIGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWNvcHlNYW55UmVmZXJlbmNlKGFSZWZlcmVuY2UsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYVJlZmVyZW5jZSkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWNvcHlTaW5nbGVSZWZlcmVuY2UoYVJlZmVyZW5jZSwgKEVPYmplY3QpIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZWZPYmplY3RzIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZSBjb3B5IGJhY2sgdG8gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmT2JqZWN0cyhDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQlFT2JqZWN0IHJlZk9iamVjdDsKLQkJU3RyaW5nIGlkU3VmZml4OwotCQlpZiAoYUdyb3VwLnByaW1HZXRSZWZPYmplY3RzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhR3JvdXAucHJpbUdldFJlZk9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJcmVmT2JqZWN0ID0gKEVPYmplY3QpIGFzc29jaWF0aW9uLmdldEtleSgpOwotCQkJCWlkU3VmZml4ID0gKFN0cmluZykgYXNzb2NpYXRpb24uZ2V0VmFsdWUoKTsKLQkJCQlpZiAoaWRTdWZmaXggPT0gbnVsbCkKLQkJCQkJaWRTdWZmaXggPSBhR3JvdXAuZ2V0RGVmYXVsdElkU3VmZml4KCk7Ci0JCQkJYUdyb3VwLmFkZENvcGllZChjb250YWlubWVudENvcHkocmVmT2JqZWN0LCBpZFN1ZmZpeCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZSBjb3B5IGJhY2sgdG8gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVzb3VyY2VzKENvcHlHcm91cCBhR3JvdXApIHsKLQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCVJlc291cmNlIHJlc291cmNlOwotCQlTdHJpbmcgdXJpOwotCQlpZiAoYUdyb3VwLnByaW1HZXRSZXNvdXJjZXMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGFHcm91cC5wcmltR2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCXJlc291cmNlID0gKFJlc291cmNlKSBhc3NvY2lhdGlvbi5nZXRLZXkoKTsKLQkJCQl1cmkgPSAoU3RyaW5nKSBhc3NvY2lhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCVJlc291cmNlIGNvcGllZCA9IGNvbnRhaW5tZW50Q29weShyZXNvdXJjZSwgdXJpKTsKLQkJCQljb3B5TW9kaWZpY2F0aW9uRmxhZyhyZXNvdXJjZSwgY29waWVkKTsKLQkJCQlhR3JvdXAuYWRkQ29waWVkKGNvcGllZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgc2luZ2xlIHZhbHVlIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBUZXN0czoKLQkgKiAKLQkgKiAxLiBJZiBhbiBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBpdCBpcyBhbiBvYmplY3QgdHlwZSBhbmQgaXQgbXVzdCBiZQotCSAqIGNvcGllZC4gRG8gbm90IGNvcHkgdGhlIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYW4gRW51bWVyYXRpb24gdHlwZS4gMi4gSWYgYW4gYXR0cmlidXRlCi0JICogdHlwZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGNvcHkgdGhlIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uCi0JICogPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2luZ2xlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSA9PSBudWxsKSB7Ci0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy9NT0YxMDgKLQkJCS8vIGlmIChhdHRyaWJ1dGUuaXNPYmplY3RUeXBlKCkpCi0JCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpCi0JCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgY29udGFpbm1lbnRDb3B5KChFT2JqZWN0KSBhVmFsdWUsIGlkU3VmZml4KSk7Ci0JCQllbHNlCi0JCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKLQkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKiAKLQkgKiBUZXN0czogMS4gSWYgdGhlIHJlZmVyZW5jZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiBtYW55LCBtYWtlIGEgY29weSBvZiB0aGUgdmFsdWUgaWYgdGhlCi0JICogcmVmZXJlbmNlIGlzIGNvbXBvc2l0ZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCA8Y29kZT5jb3B5UmVmPC9jb2RlPjsgb3RoZXJ3aXNlLCBqdXN0Ci0JICogc2V0IHRoZSB2YWx1ZSBhcyBpcy4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlTaW5nbGVSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQkvL0V4Y2VwdGlvbmFsIGNhc2U7IHRoZSByZWxhdGlvbnNoaXAgaXMgbm90IHRoZSBjb250YWluZXIgcmVsYXRpb25zaGlwCi0JCS8vQW5kIGlzIG5vdCBuYXZpZ2FibGUgaW4gdGhlIG90aGVyIGRpcmVjdGlvbjsgZ28gYWhlYWQgYW5kIGNvcHkKLQkJaWYgKGFWYWx1ZSAhPSBhUmVmT2JqZWN0LmVDb250YWluZXIoKSB8fCBhUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCWlmIChhUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkKLQkJCQljb3B5UmVmLmVTZXQoYVJlZmVyZW5jZSwgY29udGFpbm1lbnRDb3B5KGFWYWx1ZSwgaWRTdWZmaXgpKTsKLQkJCWVsc2UKLQkJCQlhZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkoYVJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgd2l0aGluIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGVtIHRvCi0JICogPGNvZGU+YUdyb3VwPC9jb2RlPi4gTm9uIGNvbXBvc2l0ZSByZWZlcmVuY2VzIHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgYWxsIG9iamVjdHMgYXJlCi0JICogY29waWVkIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKiAKLQkgKiBDb3B5IFJlc291cmNlcyBmaXJzdCBhbmQgdGhlbiBjb3B5IFJlZk9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXV0aWxpdHkuY29weShhR3JvdXApOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlPYmplY3QpIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHlDdXJyZW50QXR0cmlidXRlcyhhUmVmT2JqZWN0LCBudWxsLCBjb3B5T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZwotCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvcHkoYVJlZk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQlyZXR1cm4gdXRpbGl0eS5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gdXNpbmcgPGNvZGU+bmV3VXJpPC9jb2RlPiBmb3IgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZUNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJcmV0dXJuIHV0aWxpdHkuY29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKSB7Ci0JCWlmIChwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLml0ZXJhdG9yKCk7Ci0JCQlEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gYWN0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFjdGlvbiA9IChEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24pIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb24ucGVyZm9ybUFjdGlvbigpOwotCQkJfQotCQkJcHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxNzozNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGdldENvcGllZE9iamVjdHMoKSB7Ci0JCWlmIChjb3BpZWRPYmplY3RzID09IG51bGwpCi0JCQljb3BpZWRPYmplY3RzID0gbmV3IEhhc2hNYXAoMjAwKTsKLQkJcmV0dXJuIGNvcGllZE9iamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGdldENvcGllZEFkYXB0ZXJzKCkgewotCQlpZiAoY29waWVkQWRhcHRlcnMgPT0gbnVsbCkKLQkJCWNvcGllZEFkYXB0ZXJzID0gbmV3IEhhc2hNYXAoMjAwKTsKLQkJcmV0dXJuIGNvcGllZEFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoYW5PYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGdldENvcGllZE9iamVjdHMoKS5nZXQoYW5PYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LCBpZiBub25lLCByZXR1cm4gdGhlIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHlJZkZvdW5kKEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJcmV0dXJuIGNvcGllZCA9PSBudWxsID8gYW5PYmplY3QgOiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjExOjMyIEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSB7Ci0JCWlmIChkZWZlcnJlZFJlZmVyZW5jZUNvcGllcyA9PSBudWxsKQotCQkJZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0JCXJldHVybiBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRU9iamVjdCB0aGF0IGlzIHRoZSBzYW1lIHR5cGUgYXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIEVPYmplY3QgbmV3SW5zdGFuY2UoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRVBhY2thZ2UgZXBrZyA9IChFUGFja2FnZSkgYVJlZk9iamVjdC5lQ2xhc3MoKS5lQ29udGFpbmVyKCk7Ci0JCUVGYWN0b3J5IGZhY3RvcnkgPSBlcGtnLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRUNsYXNzIHJlZk9iaiA9IGFSZWZPYmplY3QuZUNsYXNzKCk7Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZShyZWZPYmopOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBSZXNvdXJjZSB0aGF0IHVzZXMgdGhlIHNhbWUgUmVzb3VyY2VGYWN0b3J5IGFzIHRoZSBvbmUgdXNlZCBieQotCSAqIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uIElmIDxjb2RlPm5ld1VyaTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB1c2UgdGhlIFVSSQotCSAqIGZyb20gPGNvZGU+YVJlc291cmNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbmV3SW5zdGFuY2UoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlSZXNvdXJjZSBuZXdSZXNvdXJjZTsKLQkJU3RyaW5nIG9yaWdpbmFsVXJpID0gYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCW5ld1VyaSA9IG5ld1VyaSA9PSBudWxsID8gb3JpZ2luYWxVcmkgOiBuZXdVcmk7Ci0KLQkJUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGFSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IG51bGwpCi0JCQlmYWN0b3J5ID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkob3JpZ2luYWxVcmkpKTsKLQkJZWxzZQotCQkJZmFjdG9yeSA9IGFSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKG9yaWdpbmFsVXJpKSk7Ci0KLQotCQluZXdSZXNvdXJjZSA9IGZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShuZXdVcmkpKTsKLQkJcmV0dXJuIG5ld1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/IERlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlc2VydmVJZHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZwotCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4gSWYgYW4gaWRTdWZmaXggZG9lcyBub3QgZXhpc3QsIGRvIG5vdCBzZXQgYW4gaWQgb24gdGhlIGNvcGllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgcHJpbUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJaWYgKGFSZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFT2JqZWN0IGNvcHlSZWYgPSBwcmltQ29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0KLQkJY29weUN1cnJlbnRSZWZlcmVuY2VzKGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJcmV0dXJuIGNvcHlSZWY7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUgY29udGFpbm1lbnQKLQkgKiB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgSURzIG9mCi0JICogY29waWVkIG9iamVjdHMuIElmIGFuIGlkU3VmZml4IGRvZXMgbm90IGV4aXN0LCBkbyBub3Qgc2V0IGFuIGlkIG9uIHRoZSBjb3BpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb3B5UmVmID0gbmV3SW5zdGFuY2UoYVJlZk9iamVjdCk7Ci0KLQkJcmVjb3JkQ29weShhUmVmT2JqZWN0LCBjb3B5UmVmKTsKLQkJY29weUN1cnJlbnRBdHRyaWJ1dGVzKGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJaWYgKGlzQ29weUFkYXB0ZXJzKCkpCi0JCQljb3B5QWRhcHRlcnMoYVJlZk9iamVjdCwgY29weVJlZik7Ci0JCXJldHVybiBjb3B5UmVmOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlBZGFwdGVycyhFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IGFkYXB0ZXJzID0gYVJlZk9iamVjdC5lQWRhcHRlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5zaXplKCk7IGkrKykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLmdldChpKTsKLQkJCWNvcHlBZGFwdGVyKGFSZWZPYmplY3QsIGNvcHlSZWYsIGFkYXB0ZXIpOwotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QWRhcHRlcihFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weVJlZiwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBDbG9uZWFibGVQdWJsaWMpKQotCQkJcmV0dXJuOwotCQlDbG9uZWFibGVQdWJsaWMgY29weUFkYXB0ZXIgPSAoQ2xvbmVhYmxlUHVibGljKSBnZXRDb3BpZWRBZGFwdGVycygpLmdldChhZGFwdGVyKTsKLQkJaWYgKGNvcHlBZGFwdGVyID09IG51bGwpIHsKLQkJCWNvcHlBZGFwdGVyID0gKENsb25lYWJsZVB1YmxpYykgKChDbG9uZWFibGVQdWJsaWMpIGFkYXB0ZXIpLmNsb25lKCk7Ci0JCQlnZXRDb3BpZWRBZGFwdGVycygpLnB1dChhZGFwdGVyLCBjb3B5QWRhcHRlcik7Ci0JCX0KLQkJaWYgKGNvcHlBZGFwdGVyICE9IG51bGwpCi0JCQljb3B5UmVmLmVBZGFwdGVycygpLmFkZChjb3B5QWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIHByaW1Db3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgY29weVJlc291cmNlID0gbmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCQljb3B5RXh0ZW50KGFSZXNvdXJjZS5nZXRDb250ZW50cygpLCBjb3B5UmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCXJldHVybiBjb3B5UmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1vZGlmaWNhdGlvbkZsYWcoUmVzb3VyY2UgYVJlc291cmNlLCBSZXNvdXJjZSBjb3BpZWQpIHsKLQkJaWYgKGFSZXNvdXJjZS5pc01vZGlmaWVkKCkpCi0JCQljb3BpZWQuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjExOjMyIEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpIHsKLQkJcmV0dXJuIGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29yZENvcHkoRU9iamVjdCBhU291cmNlLCBFT2JqZWN0IGFDb3B5KSB7Ci0JCWdldENvcGllZE9iamVjdHMoKS5wdXQoYVNvdXJjZSwgYUNvcHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29yZENvcHkoQWRhcHRlciBhU291cmNlLCBBZGFwdGVyIGFDb3B5KSB7Ci0JCWdldENvcGllZEFkYXB0ZXJzKCkucHV0KGFTb3VyY2UsIGFDb3B5KTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSWRzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlc2VydmVJZHMgPSB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRDb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSkgewotCQlyZXR1cm4gYVJlZmVyZW5jZS5pc0NoYW5nZWFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb3B5QWRhcHRlcnMoKSB7Ci0JCXJldHVybiBjb3B5QWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogRmxhZyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgYWRhcHRlcnMgc2hvdWxkIGJlIGNvcGllZCBhcyB3ZWxsLiBJbiBvcmRlciBmb3IgYW4gYWRhcHRlciB0bwotCSAqIGJlIGNvcGllZCwgaXQgbXVzdCBpbXBsZW1lbnQgdGhlIHtAbGluayBDbG9uZWFibGVQdWJsaWN9aW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlBZGFwdGVycyhib29sZWFuIGIpIHsKLQkJY29weUFkYXB0ZXJzID0gYjsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXhjZXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjI5YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gZmFjdG9yIGNvbW1vbiBjb2RlIGZvciBpbXBsZW1lbnRlcnMgb2YgSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IZWxwZXIgewotCi0JLyoqCi0JICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByaXZhdGUgRXhjZXB0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcyhJV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JCW1lc3NhZ2VzLmFkZChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4Y2VwdGlvbi5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQobmVzdGVkLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgSVdGVFdyYXBwZWRFeGNlcHRpb24pCi0JCQkJbmVzdGVkID0gKChJV0ZUV3JhcHBlZEV4Y2VwdGlvbikgbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCWVsc2UKLQkJCQluZXN0ZWQgPSBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXNzYWdlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMKLQkgKiAgICAgICAgICAgICAgICBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyhJV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZChtZXNzYWdlc1tpXSk7Ci0JCQlpZiAoaSA8IG1lc3NhZ2VzLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4dGVuZGVkRWNvcmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Y2Y5MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4dGVuZGVkRWNvcmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbC5FQWRhcHRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVjb3JlVXRpbCBleHRlbmRzIEVjb3JlVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgRklMRV9OT1RfRk9VTkRfREVURUNUT1I7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5BTUVfQVRUUklCVVRFX1NUUklORyA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgaW50ZXJmYWNlIEZpbGVOb3RGb3VuZERldGVjdG9yIHsKLQkJYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVOb3RGb3VuZERldGVjdG9yKEZpbGVOb3RGb3VuZERldGVjdG9yIGRldGVjdG9yKSB7Ci0JCUZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID0gZGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlTm90Rm91bmREZXRlY3RvciBnZXRGaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJaWYgKEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID09IG51bGwpIHsKLQkJCUZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID0gbmV3IEZpbGVOb3RGb3VuZERldGVjdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCQkJCWlmIChnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbih3cmFwcGVkRXgpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCWlmICh3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJcmV0dXJuIChGaWxlTm90Rm91bmRFeGNlcHRpb24pIHdyYXBwZWRFeC5leGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmICh3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24oKFdyYXBwZWRFeGNlcHRpb24pIHdyYXBwZWRFeC5leGNlcHRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVTZXRPckFkZChFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQllU2V0T3JBZGQob2JqLCBmZWF0dXJlLCB2YWx1ZSwgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVTZXRPckFkZChFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChuZXdJbmRleCA+PSAwKQotCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZChuZXdJbmRleCwgdmFsdWUpOwotCQkJZWxzZQotCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZVVuc2V0T3JSZW1vdmUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCB8fCBmZWF0dXJlLmlzTWFueSgpKQotCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkucmVtb3ZlKHZhbHVlKTsKLQkJZWxzZQotCQkJb2JqLmVVbnNldChmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoVVJJIHNvdXJjZVVyaSwgVVJJIHRlc3RVcmkpIHsKLQkJLy9UT0RPIFdhaXRpbmcgb24gbmV3IGVtZiBVUkkgQVBJCi0JCVN0cmluZ1tdIHNvdXJjZVNlZ21lbnRzID0gc291cmNlVXJpLnNlZ21lbnRzKCk7Ci0JCVN0cmluZ1tdIHRlc3RTZWdtZW50cyA9IHRlc3RVcmkuc2VnbWVudHMoKTsKLQkJaW50IGkgPSB0ZXN0U2VnbWVudHMubGVuZ3RoOwotCQlpbnQgaiA9IHNvdXJjZVNlZ21lbnRzLmxlbmd0aDsKLQkJaWYgKGogPj0gaSkgewotCQkJYm9vbGVhbiB0ZXN0ID0gdHJ1ZTsKLQotCQkJd2hpbGUgKHRlc3QgJiYgaSA+IDApIHsKLQkJCQlpLS07Ci0JCQkJai0tOwotCQkJCXRlc3QgPSB0ZXN0U2VnbWVudHNbaV0uZXF1YWxzKHNvdXJjZVNlZ21lbnRzW2pdKTsKLQkJCX0KLQkJCXJldHVybiB0ZXN0OwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRU5hbWVkRWxlbWVudCkKLQkJCXJldHVybiAoKEVOYW1lZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQlMaXN0IGFsbEF0dHMgPSBvYmouZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBhbGxBdHRzLnNpemUoKTsKLQkJRUF0dHJpYnV0ZSBhdHQsIG5hbWVBdHRyaWJ1dGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJYXR0ID0gKEVBdHRyaWJ1dGUpIGFsbEF0dHMuZ2V0KGkpOwotCQkJaWYgKE5BTUVfQVRUUklCVVRFX1NUUklORy5lcXVhbHMoYXR0LmdldE5hbWUoKSkpIHsKLQkJCQluYW1lQXR0cmlidXRlID0gYXR0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lQXR0cmlidXRlICE9IG51bGwpCi0JCQlyZXR1cm4gKFN0cmluZykgb2JqLmVHZXQobmFtZUF0dHJpYnV0ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZExvYWRpbmdUYWcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy9yZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoSXNMb2FkaW5nRGV0ZWN0b3IuSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxvYWRpbmdUYWcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy9yZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoSXNMb2FkaW5nRGV0ZWN0b3IuSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyBjdXJyZW50bHkgYmVpbmcgbG9hZGVkLiBUaGlzIGlzIGRldGVybWluZWQgYnkgY2hlY2tpbmcgZm9yIHRoZQotCSAqIElzTG9hZGluZ0RlY3RvciBpbiB0aGUgbGlzdCBvZiBlQWRhcHRlcnMgb24gdGhlIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIEBzZWUgYWRkTG9hZGluZ1RhZyhSZXNvdXJjZSkKLQkgKiBAc2VlIHJlbW92ZUxvYWRpbmdUYWcoUmVzb3VyY2UpCi0JICogIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgUmVzb3VyY2UuSW50ZXJuYWwjaXNMb2FkaW5nKCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9hZGluZyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCA/ICgoUmVzb3VyY2UuSW50ZXJuYWwpcmVzb3VyY2UpLmlzTG9hZGluZygpIDogZmFsc2U7IAotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyRm9yTG9hZGluZyhBZGFwdGVyIHRhcmdldEFkYXB0ZXIsIEVPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlcyA9IHRhcmdldE9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsIHx8IGlzTG9hZGluZyhyZXMpKQotCQkJcmV0dXJuIG5ldyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIodGFyZ2V0QWRhcHRlciwgdGFyZ2V0T2JqZWN0KTsKLQkJcmV0dXJuIHRhcmdldEFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByZVJlZ2lzdGVyUGFja2FnZShTdHJpbmcgbnNQcmVmaXgsIEVQYWNrYWdlLkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoIUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmNvbnRhaW5zS2V5KG5zUHJlZml4KSkKLQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChuc1ByZWZpeCwgZGVzY3JpcHRvcik7Ci0JfQotCS8qKgotCSAgICogUmV0dXJucyB0aGUgYWRhcHRlciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogQHBhcmFtIGFuT2JqZWN0IAotCSAgICogQHBhcmFtIGFkYXB0ZXJzIGxpc3Qgb2YgYWRhcHRlcnMgdG8gc2VhcmNoLgotCSAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgYWRhcHRlci4KLQkgICAqIEByZXR1cm4gYW4gYWRhcHRlciBmcm9tIHRoZSBsaXN0IG9yIG51bGwuCi0JICAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgYW5PYmplY3QsIExpc3QgYWRhcHRlcnMsIE9iamVjdCB0eXBlKSB7Ci0KLQkJICAJT2JqZWN0IFtdIGFkYXB0QXJyYXkgPSAoKEVBZGFwdGVyTGlzdClhZGFwdGVycykuZGF0YSgpOwotCQkgIAlpZiAoYWRhcHRBcnJheSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdEFycmF5W2ldOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBhZGFwdGVyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGlzIG9iamVjdCBmcm9tIGl0J3MgY29udGFpbmVyLCBhbmQgbWFrZSBpdCBhbmQgYWxsIGl0J3MgY2hpbGRyZW4KLQkgKiBwcm94aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVubG9hZChFT2JqZWN0IHJvb3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gcm9vdC5lUmVzb3VyY2UoKTsKLQkJRU9iamVjdCBjb250YWluZXIgPSByb290LmVDb250YWluZXIoKTsKLQkJLyogTWFraW5nIHN1cmUgdGhlIHByb3h5IGlzIGNyZWF0ZWQgZmlyc3QgYmVmb3JlIHVubG9hZGluZyAqLwotCQlpZiAocm9vdCAhPSBudWxsICYmIHJlcyAhPSBudWxsKQotCQkJYmVjb21lUHJveHkocm9vdCwgcmVzKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShyb290KTsKLQkJCWVsc2UgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gcm9vdC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJZVVuc2V0T3JSZW1vdmUoY29udGFpbmVyLCBmZWF0dXJlLCByb290KTsKLQkJCX0KLQkJCi0JfQotCi0JLyoqCi0JICogVHVybnMgdGhpcyBvYmplY3QgYW5kIGFsbCBpdCdzIGNoaWxkcmVuIHRvIHByb3hpZXMsIGFuZCByZW1vdmVzIGFkYXB0ZXJzIHByZWNvbmRpdGlvbjogVGhlCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdCdzIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWNvbWVQcm94eShFT2JqZWN0IHJvb3QsIFJlc291cmNlIHJlcykgewotCQlJdGVyYXRvciBpdGVyID0gcm9vdC5lQWxsQ29udGVudHMoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXMpOwotCQl9Ci0JCWRvQmVjb21lUHJveHkoKEludGVybmFsRU9iamVjdCkgcm9vdCwgcmVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZG9CZWNvbWVQcm94eShJbnRlcm5hbEVPYmplY3QgcCwgUmVzb3VyY2UgcmVzKSB7Ci0JCVN0cmluZyBpZCA9IHJlcy5nZXRVUklGcmFnbWVudChwKTsKLQkJcC5lU2V0UHJveHlVUkkocmVzLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLG51bGwpOwotCQl9Ci0JCXAuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKLQkJfQotCQlkb1JlbW92ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvUmVtb3ZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgewotCQlTdHJpbmcgaWQgPSBwLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLCBpZCk7Ci0JCX0KLQkJcC5lU2V0UHJveHlVUkkobnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbnN1cmVzIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG5vdCBhIHByb3h5OyBpZiBpdCBpcywgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBiYWQKLQkgKiBIUkVGLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIGRvZXMgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQcm94eShFT2JqZWN0IG9iamVjdCkgdGhyb3dzIERhbmdsaW5nSFJFRkV4Y2VwdGlvbiB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCAhb2JqZWN0LmVJc1Byb3h5KCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBtc2cgPSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuREFOR0xJTkdfSFJFRl9FUlJPUl8sIG5ldyBPYmplY3RbXXsoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KS5lUHJveHlVUkkoKX0pOwotCQl0aHJvdyBuZXcgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgbzEgYW5kIG8yIGFyZSBub3QgdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGF0Ci0JICogZWl0aGVyIHBhcmFtZXRlciBjYW4gYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbzEKLQkgKiBAcGFyYW0gbzIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlQ2hhbmdlZChPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlyZXR1cm4gKG8xID09IG51bGwgXiBvMiA9PSBudWxsKSB8fCAobzEgPT0gbnVsbCB8fCAhbzEuZXF1YWxzKG8yKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNWExZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YTY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSAyOjQ2OjU0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZVZhbHVlQ29udmVydGVyIHsKLQlzdGF0aWMgZmluYWwgRmVhdHVyZVZhbHVlQ29udmVydGVyIERFRkFVTFQgPSBuZXcgRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYUZlYXR1cmUuCi0JICovCi0JT2JqZWN0IGNvbnZlcnRWYWx1ZShPYmplY3QgYVZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDgxN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kIHsKLQotCS8qCi0JICogVGhpcyB3aWxsIGNvbnRhaW4gdGhlIG11bHRpLXNlbGVjdGlvbiBvZiBvYmplY3RzIHRvIGRlcGxveS4gVGhpcyBzZWxlY3Rpb24gY291bGQgYmUgdXNlZCB0bwotCSAqIGZpbHRlciBlbGVtZW50cyB3aXRoaW4gYSBNb2R1bGUuIEFueSBvdGhlciBzZXR1cCBjb2RlIHNob3VsZCBiZSBkb25lIGhlcmUuLi4KLQkgKi8KLQl2b2lkIGluaXQoT2JqZWN0W10gc2VsZWN0aW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBkZWx0YQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSUNvbW1hbmRDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDI3MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gTW91cnJhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRDb250ZXh0IHsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSURVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSURVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODk4NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJRFV0aWwgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB0byBhc3NpZ24gYSB1bmlxdWUgSUQgdG8gdGhlIG9iamVjdC4gVGhlIG9iamVjdCBtdXN0IGJlIGNvbnRhaW5lZCBpbiBhCi0JICogcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2lnbklEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIGFSZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKQotCQkJYXNzaWduSUQob2JqZWN0LCAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPckFzc2lnbklEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIGFSZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKQotCQkJcmV0dXJuIGdldE9yQXNzaWduSUQob2JqZWN0LCAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9yQXNzaWduSUQoRU9iamVjdCBvYmplY3QsIFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlTdHJpbmcgaWQgPSBhUmVzb3VyY2UuZ2V0SUQob2JqZWN0KTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gYXNzaWduSUQob2JqZWN0LCBhUmVzb3VyY2UpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduSUQoRU9iamVjdCBvYmplY3QsIFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IGdldEJhc2VJREZvckFzc2lnbm1lbnQob2JqZWN0KTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgaWQgPSBlbnN1cmVVbmlxdWVJRChhUmVzb3VyY2UsIG5hbWUpOwotCQlhUmVzb3VyY2Uuc2V0SUQob2JqZWN0LCBpZCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBlbnN1cmVVbmlxdWVJRChYTUxSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBiYXNlSUROYW1lKSB7Ci0JCWJhc2VJRE5hbWUgKz0gIl8iOyAvLyROT04tTkxTLTEkCi0JCS8vQ2hhbmdlIHRvIHVzZSB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQgb2YgaW5jcmVtZW50YWwgbnVtYmVycyB0byBoZWxwCi0JCS8vc3VwcG9ydCB0ZWFtIGRldmVsb3BtZW50LgotCQlsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVN0cmluZyBpZCA9IGJhc2VJRE5hbWUgKyBjdXJyZW50VGltZTsKLQkJd2hpbGUgKGFSZXNvdXJjZS5nZXRFT2JqZWN0KGlkKSAhPSBudWxsKSB7Ci0JCQkrK2N1cnJlbnRUaW1lOwotCQkJaWQgPSBiYXNlSUROYW1lICsgY3VycmVudFRpbWU7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEJhc2VJREZvckFzc2lnbm1lbnQoRU9iamVjdCBvYmplY3QpIHsKLQkJRUNsYXNzIG1ldGFPID0gb2JqZWN0LmVDbGFzcygpOwotCQlyZXR1cm4gbWV0YU8uZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmY1MTNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxNjgwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24gewotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg4MmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVXNlckV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDExNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlCi0gKiBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgSXNMb2FkaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElzTG9hZGluZ0RldGVjdG9yIElOU1RBTkNFID0gbmV3IElzTG9hZGluZ0RldGVjdG9yKCk7Ci0KLQlwcml2YXRlIElzTG9hZGluZ0RldGVjdG9yKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCX0KLQotCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1Yjg2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSXNMb2FkaW5nUHJveHlBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBBZGFwdGVyIHRhcmdldEFkYXB0ZXI7Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldE9iamVjdDsKLQotCXB1YmxpYyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIoQWRhcHRlciBhVGFyZ2V0QWRhcHRlciwgRU9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7Ci0JCXRhcmdldEFkYXB0ZXIgPSBhVGFyZ2V0QWRhcHRlcjsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkvL2xpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0JCQlpZiAobXNnLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEICYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJcmVtb3ZlUHJveHlTdXBwb3J0KCk7Ci0JCQkJcmVzZXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjYWNoZVJlc291cmNlKCkpIHsKLQkJCXRhcmdldEFkYXB0ZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSByZXNvdXJjZSB2YXJpYWJsZSBhbmQgcmV0dXJuIHRydWUgaWYgd2UgcmVtb3ZlZCB0aGUgcHJveHkgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVSZXNvdXJjZSgpIHsKLQkJaWYgKGdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBnZXRUYXJnZXQoKTsKLQkJCXJlc291cmNlID0gZU9iai5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmlzTG9hZGluZyhyZXNvdXJjZSkpCi0JCQkJCXJlc291cmNlLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQllbHNlIHsKLQkJCQkJdGFyZ2V0T2JqZWN0LmVBZGFwdGVycygpLmFkZCh0YXJnZXRBZGFwdGVyKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3h5U3VwcG9ydCgpIHsKLQkJZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl0YXJnZXRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKHRhcmdldEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJcmVzb3VyY2UgPSBudWxsOwotCQl0YXJnZXRBZGFwdGVyID0gbnVsbDsKLQkJdGFyZ2V0T2JqZWN0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0YTczNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5zVVJJOwotCi0KLQlwdWJsaWMgTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMubnNVUkkgPSB1cmk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROc1VSSSgpIHsKLQkJcmV0dXJuIG5zVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5zVVJJKFN0cmluZyBzdHJpbmcpIHsKLQkJbnNVUkkgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBzdHJpbmcpIHsKLQkJcHJlZml4ID0gc3RyaW5nOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkYWM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIGhvbGQgbmFtZXNwYWNlcyBwYXJzZWQgZnJvbSBhbiBYTUwgZmlsZSB1c2luZyB0aGUgeG1sbnM6cHJlZml4PSJhVVJJIgotICogc3ludGF4Ci0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDbG9uZWFibGVQdWJsaWMgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9UWVBFID0gTmFtZXNwYWNlQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHJvdGVjdGVkIE1hcCBwcmVmaXhlc1RvTlM7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlczsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIE5PVElGSUNBVElPTl9GRUFUVVJFID0gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwoKSB7Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JCSAqIEBwYXJhbSBvbGRWYWx1ZQotCQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkJICovCi0JCXB1YmxpYyBOb3RpZmljYXRpb24oaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKGV2ZW50VHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmUoKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkgewotCQkJcmV0dXJuIE5PVElGSUNBVElPTl9GRUFUVVJFOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7Ci0JfQotCi0JLyoqCi0JICogRmFjYWRlIG1ldGhvZCBmb3IgcmVzb2x2aW5nIHByZWZpeGVzIHRvIGFuIGFjdHVhbCBuYW1lc3BhY2UgVVJJLiBVc2VkIGZvciBvYmplY3RzIGNvbnRhaW5lZAotCSAqIGJ5IGluc3RhbmNlcyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2V9LiBXYWxrcyB1cCB0aGUgb2JqZWN0Ci0JICogY29udGFpbm1lbnQgcGF0aCB1bnRpbCBhIG5hbWVzcGFjZSBpcyBmb3VuZCwgb3IgcmV0dXJucyBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc29sdmVkTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iajsKLQkJU3RyaW5nIG5zVVJJOwotCQl3aGlsZSAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCW5zVVJJID0gZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBjb250YWluZXIpOwotCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJcmV0dXJuIG5zVVJJOwotCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VVUklBdFRoaXNMZXZlbChTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXROYW1lc3BhY2VzKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihvYmopOwotCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAoTmFtZXNwYWNlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihvYmosIEFEQVBURVJfVFlQRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUFkYXB0ZXIob2JqKSA6IGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJYWRhcHRlci5zZXRUYXJnZXQob2JqKTsKLQkJb2JqLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0JCWlmIChuYW1lc3BhY2VzID09IG51bGwpCi0JCQluYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCi0JCQlwcmVmaXhlc1RvTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByZWZpeGVzVG9OUy5wdXQocHJlZml4LCBucyk7Ci0JCW5hbWVzcGFjZXMuYWRkKG5zKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uQURELCBudWxsLCBucyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgewotCQlOYW1lc3BhY2UgbnMgPSBudWxsOwotCQlpZiAocHJlZml4ZXNUb05TICE9IG51bGwpCi0JCQlucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKLQotCQlpZiAobnMgIT0gbnVsbCkKLQkJCW5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFLCBucywgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgcHJlZml4ZXNUb05TLmdldChwcmVmaXgpOwotCQlpZiAobnMgIT0gbnVsbCkKLQkJCXJldHVybiBucy5nZXROc1VSSSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfVFlQRS5lcXVhbHModHlwZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5hbWVzcGFjZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVOb3RpZmljYXRpb24oaW50IHR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCXRhcmdldC5lTm90aWZ5KG5ldyBOb3RpZmljYXRpb24odHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhbmFtZXNwYWNlcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLkNsb25lYWJsZVB1YmxpYyNjbG9uZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJTmFtZXNwYWNlQWRhcHRlciByZXN1bHQgPSBuZXcgTmFtZXNwYWNlQWRhcHRlcigpOwotCQlpZiAoaGFzTmFtZXNwYWNlcygpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBuYW1lc3BhY2VzLmdldChpKTsKLQkJCQlyZXN1bHQuYWRkTmFtZXNwYWNlKG5zLmdldFByZWZpeCgpLCBucy5nZXROc1VSSSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N0aHJ1RW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODQwNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N0aHJ1RW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBIHBhc3N0aHJ1IEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXNzdGhydUVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGFzc3RocnVFbmNvZGVyRGVjb2RlciBJTlNUQU5DRSA9IG5ldyBQYXNzdGhydUVuY29kZXJEZWNvZGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFBhc3N0aHJ1RW5jb2RlckRlY29kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkQ2lwaGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkQ2lwaGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM3MTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgUGFzc3dvcmRDaXBoZXJVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbXSA9IHsieG9yIn07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtc1tdOwotCi0JcHVibGljIFBhc3N3b3JkQ2lwaGVyVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNpcGhlcihieXRlIGFieXRlMFtdLCBTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQlpZiAocy5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TWzBdKSkKLQkJCWFieXRlMSA9IHhvcihhYnl0ZTApOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQotCQlpZiAoYWJ5dGUxID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIGFieXRlMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNpcGhlcihieXRlIGFieXRlMFtdLCBTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQlpZiAocy5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TWzBdKSkKLQkJCWFieXRlMSA9IHhvcihhYnl0ZTApOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQotCQlpZiAoYWJ5dGUxID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1zKCkgewotCQlyZXR1cm4gX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10geG9yKGJ5dGUgYWJ5dGUwW10pIHsKLQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7Ci0JCWlmIChhYnl0ZTAgIT0gbnVsbCkgewotCQkJYWJ5dGUxID0gbmV3IGJ5dGVbYWJ5dGUwLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFieXRlMC5sZW5ndGg7IGkrKykKLQkJCQlhYnl0ZTFbaV0gPSAoYnl0ZSkgKDB4NWYgXiBhYnl0ZTBbaV0pOwotCQl9Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0Jc3RhdGljIHsKLQkJX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9IG51bGw7Ci0JCWlmIChfc3VwcG9ydGVkX2NyeXB0b19hbGdvcml0aG1zID09IG51bGwpCi0JCQlfc3VwcG9ydGVkX2NyeXB0b19hbGdvcml0aG1zID0gREVGQVVMVF9TVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZEVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgyY2VkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZEVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFBhc3N3b3JkRW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgaW1wbGVtZW50cyBFbmNvZGVyRGVjb2RlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gInBhc3N3b3JkLXNlY3VyaXR5LWNvZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFBhc3N3b3JkRW5jb2RlckRlY29kZXIoKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFBhc3N3b3JkVXRpbC5wYXNzd29yZERlY29kZShzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlyZXR1cm4gUGFzc3dvcmRVdGlsLnBhc3N3b3JkRW5jb2RlKHMpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gS0VZOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmYyYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZFV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19DT05WRVJTSU9OX0NPREUgPSAiVVRGOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX0JZVEVfQVJSQVkgPSBuZXcgYnl0ZVswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NSWVBUT19BTEdPUklUSE07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQkFTRTY0X0VOQ09ERV9NQVBbXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEJBU0U2NF9ERUNPREVfTUFQW107Ci0KLQlwdWJsaWMgUGFzc3dvcmRVdGlsKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKLQkJU3RyaW5nIHMxID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOwotCi0JCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQotCQlTdHJpbmcgczIgPSBkZWNvZGVfcGFzc3dvcmQocmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKHMpLCBzMSk7Ci0JCWlmIChzMiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBzMjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlyZXR1cm4gZW5jb2RlKHMsIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgczEpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQotCQlpZiAoZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQotCQlTdHJpbmcgczIgPSBlbmNvZGVfcGFzc3dvcmQocy50cmltKCksIHMxLnRyaW0oKSk7Ci0JCWlmIChzMiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBzMjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcnlwdG9BbGdvcml0aG0oU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJcyA9IHMudHJpbSgpOwotCQkJaWYgKHMubGVuZ3RoKCkgPj0gMikgewotCQkJCWludCBpID0gcy5pbmRleE9mKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWludCBqID0gcy5pbmRleE9mKCJ9IiwgKytpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaiA+IDApCi0JCQkJCQlpZiAoaSA8IGopCi0JCQkJCQkJczEgPSBzLnN1YnN0cmluZyhpLCBqKS50cmltKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJczEgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJU3RyaW5nIHMyID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczIgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHMyLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMyKTsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQkJczEgPSBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG0oU3RyaW5nIHMpIHsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJcyA9IHMudHJpbSgpOwotCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TLmxlbmd0aDsgaSsrKQotCQkJCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW2ldKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtVGFnKFN0cmluZyBzKSB7Ci0JCXJldHVybiBpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKGdldENyeXB0b0FsZ29yaXRobShzKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmREZWNvZGUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgczEgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7Ci0JCWlmIChzMSA9PSBudWxsKQotCQkJcmV0dXJuIHM7Ci0JCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlY29kZV9wYXNzd29yZChyZW1vdmVDcnlwdG9BbGdvcml0aG1UYWcocyksIHMxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXNzd29yZEVuY29kZShTdHJpbmcgcykgewotCQlyZXR1cm4gcGFzc3dvcmRFbmNvZGUocywgREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXNzd29yZEVuY29kZShTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgczIgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7Ci0JCWlmIChzMiAhPSBudWxsKSB7Ci0JCQlpZiAoczIuZXF1YWxzSWdub3JlQ2FzZShzMS50cmltKCkpKQotCQkJCXJldHVybiBzLnRyaW0oKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBlbmNvZGVfcGFzc3dvcmQocy50cmltKCksIHMxLnRyaW0oKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKFN0cmluZyBzKSB7Ci0JCVN0cmluZyBzMSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMgPSBzLnRyaW0oKTsKLQkJCWlmIChzLmxlbmd0aCgpID49IDIpIHsKLQkJCQlpbnQgaSA9IHMuaW5kZXhPZigieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlpbnQgaiA9IHMuaW5kZXhPZigifSIsICsraSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGogPiAwKQotCQkJCQkJaWYgKCsraiA8IHMubGVuZ3RoKCkpCi0JCQkJCQkJczEgPSBzLnN1YnN0cmluZyhqKS50cmltKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJczEgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29udmVydF90b19ieXRlcyhTdHJpbmcgcykgewotCQlieXRlIGFieXRlMFtdID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJYWJ5dGUwID0gRU1QVFlfQllURV9BUlJBWTsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlhYnl0ZTAgPSBzLmdldEJ5dGVzKFNUUklOR19DT05WRVJTSU9OX0NPREUpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdW5zdXBwb3J0ZWRlbmNvZGluZ2V4Y2VwdGlvbikgewotCQkJCQlhYnl0ZTAgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIGFieXRlMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydF90b19zdHJpbmcoYnl0ZSBhYnl0ZTBbXSkgewotCQlTdHJpbmcgcyA9IG51bGw7Ci0JCWlmIChhYnl0ZTAgIT0gbnVsbCkKLQkJCWlmIChhYnl0ZTAubGVuZ3RoID09IDApCi0JCQkJcyA9IEVNUFRZX1NUUklORzsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlzID0gbmV3IFN0cmluZyhhYnl0ZTAsIFNUUklOR19DT05WRVJTSU9OX0NPREUpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdW5zdXBwb3J0ZWRlbmNvZGluZ2V4Y2VwdGlvbikgewotCQkJCQlzID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb252ZXJ0X3ZpZXdhYmxlX3RvX2J5dGVzKFN0cmluZyBzKSB7Ci0JCWJ5dGUgYWJ5dGUwW10gPSBudWxsOwotCQlpZiAocyAhPSBudWxsKQotCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkKLQkJCQlhYnl0ZTAgPSBFTVBUWV9CWVRFX0FSUkFZOwotCQkJZWxzZQotCQkJCXRyeSB7Ci0JCQkJCWFieXRlMCA9IGJhc2U2NERlY29kZShjb252ZXJ0X3RvX2J5dGVzKHMpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWFieXRlMCA9IG51bGw7Ci0JCQkJfQotCQlyZXR1cm4gYWJ5dGUwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjREZWNvZGUoYnl0ZSBhYnl0ZTBbXSkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gYWJ5dGUwLmxlbmd0aDsgYWJ5dGUwWy0taV0gPT0gNjE7KTsKLQkJYnl0ZSBhYnl0ZTFbXSA9IG5ldyBieXRlWyhpICsgMSkgLSBhYnl0ZTAubGVuZ3RoIC8gNF07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYWJ5dGUwLmxlbmd0aDsgaisrKQotCQkJYWJ5dGUwW2pdID0gQkFTRTY0X0RFQ09ERV9NQVBbYWJ5dGUwW2pdXTsKLQkJaW50IGsgPSBhYnl0ZTEubGVuZ3RoIC0gMjsKLQkJaW50IGwgPSAwOwotCQlpbnQgaTE7Ci0JCWZvciAoaTEgPSAwOyBsIDwgazsgaTEgKz0gNCkgewotCQkJYWJ5dGUxW2xdID0gKGJ5dGUpIChhYnl0ZTBbaTFdIDw8IDIgJiAweGZmIHwgYWJ5dGUwW2kxICsgMV0gPj4+IDQgJiAweDMpOwotCQkJYWJ5dGUxW2wgKyAxXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMV0gPDwgNCAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAyXSA+Pj4gMiAmIDB4Zik7Ci0JCQlhYnl0ZTFbbCArIDJdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAyXSA8PCA2ICYgMHhmZiB8IGFieXRlMFtpMSArIDNdICYgMHgzZik7Ci0JCQlsICs9IDM7Ci0JCX0KLQkJaWYgKGwgPCBhYnl0ZTEubGVuZ3RoKSB7Ci0JCQlhYnl0ZTFbbCsrXSA9IChieXRlKSAoYWJ5dGUwW2kxXSA8PCAyICYgMHhmZiB8IGFieXRlMFtpMSArIDFdID4+PiA0ICYgMHgzKTsKLQkJCWlmIChsIDwgYWJ5dGUxLmxlbmd0aCkKLQkJCQlhYnl0ZTFbbF0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDFdIDw8IDQgJiAweGZmIHwgYWJ5dGUwW2kxICsgMl0gPj4+IDIgJiAweGYpOwotCQl9Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRfdmlld2FibGVfdG9fc3RyaW5nKGJ5dGUgYWJ5dGUwW10pIHsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpCi0JCQlpZiAoYWJ5dGUwLmxlbmd0aCA9PSAwKQotCQkJCXMgPSBFTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJcyA9IGNvbnZlcnRfdG9fc3RyaW5nKGJhc2U2NEVuY29kZShhYnl0ZTApKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCXMgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJhc2U2NEVuY29kZShieXRlIGFieXRlMFtdKSB7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBuZXcgYnl0ZVsoKGFieXRlMC5sZW5ndGggKyAyKSAvIDMpICogNF07Ci0JCWludCBpID0gMDsKLQkJaW50IGogPSAwOwotCQlmb3IgKDsgaSA8IGFieXRlMC5sZW5ndGggLSAyOyBpICs9IDMpIHsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2ldID4+PiAyICYgMHgzZl07Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMV0gPj4+IDQgJiAweGYgfCBhYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDJdID4+PiA2ICYgMHgzIHwgYWJ5dGUwW2kgKyAxXSA8PCAyICYgMHgzZl07Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMl0gJiAweDNmXTsKLQkJfQotCQlpZiAoaSA8IGFieXRlMC5sZW5ndGgpIHsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2ldID4+PiAyICYgMHgzZl07Ci0JCQlpZiAoaSA8IGFieXRlMC5sZW5ndGggLSAxKSB7Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdID4+PiA0ICYgMHhmIHwgYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKLQkJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMV0gPDwgMiAmIDB4M2ZdOwotCQkJfSBlbHNlIHsKLQkJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA8PCA0ICYgMHgzZl07Ci0JCQl9Ci0JCX0KLQkJZm9yICg7IGogPCBhYnl0ZTEubGVuZ3RoOyBqKyspCi0JCQlhYnl0ZTFbal0gPSA2MTsKLQkJcmV0dXJuIGFieXRlMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlX3Bhc3N3b3JkKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHMxLmxlbmd0aCgpID09IDApIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQocyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnl0ZSBhYnl0ZTBbXSA9IGNvbnZlcnRfdmlld2FibGVfdG9fYnl0ZXMocyk7Ci0JCQkJaWYgKGFieXRlMCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoYWJ5dGUwLmxlbmd0aCA+IDApIHsKLQkJCQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhYnl0ZTEgPSBQYXNzd29yZENpcGhlclV0aWwuZGVjaXBoZXIoYWJ5dGUwLCBzMSk7Ci0JCQkJCX0gY2F0Y2ggKEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbiBpbnZhbGlkcGFzc3dvcmRjaXBoZXJleGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB1bnN1cHBvcnRlZGNyeXB0b2FsZ29yaXRobWV4Y2VwdGlvbikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGFieXRlMSAhPSBudWxsICYmIGFieXRlMS5sZW5ndGggPiAwKQotCQkJCQkJczIgPSBjb252ZXJ0X3RvX3N0cmluZyhhYnl0ZTEpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzMiAhPSBudWxsICYmIHMyLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMyKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZV9wYXNzd29yZChTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHMxLmxlbmd0aCgpID09IDApIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIn0iKS5hcHBlbmQocyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczEpLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnl0ZSBhYnl0ZTBbXSA9IGNvbnZlcnRfdG9fYnl0ZXMocyk7Ci0JCQkJaWYgKGFieXRlMC5sZW5ndGggPiAwKSB7Ci0JCQkJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYWJ5dGUxID0gUGFzc3dvcmRDaXBoZXJVdGlsLmVuY2lwaGVyKGFieXRlMCwgczEpOwotCQkJCQl9IGNhdGNoIChJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gaW52YWxpZHBhc3N3b3JkY2lwaGVyZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gdW5zdXBwb3J0ZWRjcnlwdG9hbGdvcml0aG1leGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhYnl0ZTEgIT0gbnVsbCAmJiBhYnl0ZTEubGVuZ3RoID4gMCkgewotCQkJCQkJczIgPSBjb252ZXJ0X3ZpZXdhYmxlX3RvX3N0cmluZyhhYnl0ZTEpOwotCQkJCQkJaWYgKHMyID09IG51bGwpCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoczIgIT0gbnVsbCAmJiBzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCVNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNUyA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5nZXRTdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1zKCk7Ci0JCURFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSA9IFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXTsKLQkJYnl0ZSBhYnl0ZTBbXSA9IHs2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDMsIDQ3fTsKLQkJQkFTRTY0X0VOQ09ERV9NQVAgPSBhYnl0ZTA7Ci0JCUJBU0U2NF9ERUNPREVfTUFQID0gbmV3IGJ5dGVbMTI4XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFNjRfREVDT0RFX01BUC5sZW5ndGg7IGkrKykKLQkJCUJBU0U2NF9ERUNPREVfTUFQW2ldID0gLTE7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgQkFTRTY0X0VOQ09ERV9NQVAubGVuZ3RoOyBqKyspCi0JCQlCQVNFNjRfREVDT0RFX01BUFtCQVNFNjRfRU5DT0RFX01BUFtqXV0gPSAoYnl0ZSkgajsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1NDhkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvciBleHRlbmRzIEVycm9yIHsKLQotCS8vVE9ETyBEZWxldGUgbWUKLQlwdWJsaWMgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IoKSB7Ci0JCXN1cGVyKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLlBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmY2NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgR0xPQkFMX0RFUEVOREVOQ0lFUyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RFUEVOREVOQ1lfVFlQRSA9ICJSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBNYXAgbG9jYWxEZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJUmVzb3VyY2UgZGVwZW5kZW50UmVzb3VyY2U7Ci0KLQkJUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZSBhRGVwZW5kZW50UmVzb3VyY2UpIHsKLQkJCWRlcGVuZGVudFJlc291cmNlID0gYURlcGVuZGVudFJlc291cmNlOwotCQkJZGVwZW5kZW50UmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBSRVNPVVJDRV9ERVBFTkRFTkNZX1RZUEUuZXF1YWxzKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkvL0xpc3RlbiBmb3IgdW5sb2FkcyBhbmQgcmVtb3ZlcwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpKSB7Ci0JCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEIDoKLQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpICE9IGRlcGVuZGVudFJlc291cmNlICYmIG1zZy5nZXRPbGRCb29sZWFuVmFsdWUoKSAmJiAhbXNnLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKQotCQkJCQkJZGVwZW5kZW50UmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1JFU09VUkNFX1NFVCA6Ci0JCQkJCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSAhPSBudWxsICYmIG1zZy5nZXROZXdWYWx1ZSgpID09IG51bGwpIHsKLQkJCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBkZXBlbmRlbnRSZXNvdXJjZSkKLQkJCQkJCQkoKFJlc291cmNlKSBnZXRUYXJnZXQoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJUmVzb3VyY2VTZXQgc2V0ID0gZGVwZW5kZW50UmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJCQkJCXNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoZGVwZW5kZW50UmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VTZXRMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCi0JCQkJcHJvY2Nlc3NBZGRlZFJlc291cmNlKChSZXNvdXJjZVNldCkgbXNnLmdldE5vdGlmaWVyKCksIChSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIFVSSXMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFVUklTdHJpbmcsIGlzIHRoZSBvbmUgdGhhdAotCSAqIGRlcGVuZGVudFVyaVN0cmluZyBkZXBlbmRzIG9uLgotCSAqIAotCSAqIEBwYXJhbSBhVXJpU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlcGVuZGVudFVyaVN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckRlcGVuZGVuY3koVVJJIHRhcmdldFVSSSwgVVJJIGRlcGVuZGVudFVSSSkgewotCQlpZiAodGFyZ2V0VVJJICE9IG51bGwgJiYgZGVwZW5kZW50VVJJICE9IG51bGwpIHsKLQkJCUdMT0JBTF9ERVBFTkRFTkNJRVMucHV0KGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaW5pdGlhbGl6ZShhUmVzb3VyY2VTZXQpOwotCX0KLQotCi0JUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIFJlc291cmNlU2V0IGNhbm5vdCBiZSBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhhUmVzb3VyY2VTZXQpOwotCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVycyhhUmVzb3VyY2VTZXQpOwotCQlzZXR1cFJlc291cmNlU2V0TGlzdGVuZXIoYVJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBSZXNvdXJjZVNldExpc3RlbmVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcnMoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmICghYVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBsb2NhbERlcGVuZGVuY2llcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlNYXAuRW50cnkgZW50cnk7Ci0JCQlVUkkgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJZGVwZW5kZW50VVJJID0gKFVSSSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdGFyZ2V0VVJJID0gKFVSSSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKGFSZXNvdXJjZVNldCwgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEBwYXJhbSBkZXBlbmRlbnRVUkkKLQkgKiBAcGFyYW0gdGFyZ2V0VVJJCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBVUkkgZGVwZW5kZW50VVJJLCBVUkkgdGFyZ2V0VVJJKSB7Ci0JCVJlc291cmNlIGRlcGVuZGVudCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkZXBlbmRlbnRVUkksIGZhbHNlKTsKLQkJaWYgKGRlcGVuZGVudCAhPSBudWxsKQotCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihkZXBlbmRlbnQsIHRhcmdldFVSSSwgYVJlc291cmNlU2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlIGRlcGVuZGVudCwgVVJJIHRhcmdldFVSSSwgUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCVJlc291cmNlIHRhcmdldCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh0YXJnZXRVUkksIGZhbHNlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJdGFyZ2V0ID0gYVJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHRhcmdldFVSSSk7Ci0JCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQobmV3IFJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIoZGVwZW5kZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IGFSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhVUklDb252ZXJ0ZXIgYUNvbnZlcnRlcikgewotCQlJdGVyYXRvciBpdCA9IEdMT0JBTF9ERVBFTkRFTkNJRVMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAgcmVzb2x2ZWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVVSSSBrZXksIHZhbHVlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChVUkkpIGVudHJ5LmdldEtleSgpOwotCQkJdmFsdWUgPSAoVVJJKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJa2V5ID0gbm9ybWFsaXplKGtleSwgYUNvbnZlcnRlciwgcmVzb2x2ZWQpOwotCQkJdmFsdWUgPSBub3JtYWxpemUodmFsdWUsIGFDb252ZXJ0ZXIsIHJlc29sdmVkKTsKLQkJCWxvY2FsRGVwZW5kZW5jaWVzLnB1dChrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWxhdGl2ZVVSSQotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKiBAcGFyYW0gcmVzb2x2ZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemUoVVJJIHJlbGF0aXZlVVJJLCBVUklDb252ZXJ0ZXIgY29udmVydGVyLCBNYXAgcmVzb2x2ZWQpIHsKLQkJVVJJIHJlc3VsdCA9IChVUkkpIHJlc29sdmVkLmdldChyZWxhdGl2ZVVSSSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29udmVydGVyLm5vcm1hbGl6ZShyZWxhdGl2ZVVSSSk7Ci0JCQlyZXNvbHZlZC5wdXQocmVsYXRpdmVVUkksIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Nlc3NBZGRlZFJlc291cmNlKFJlc291cmNlU2V0IHNldCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVVJJIHRhcmdldFVSSSA9IChVUkkpIGxvY2FsRGVwZW5kZW5jaWVzLmdldChyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCWlmICh0YXJnZXRVUkkgIT0gbnVsbCkKLQkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIocmVzb3VyY2UsIHRhcmdldFVSSSwgc2V0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWYxZjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFJFU09VUkNFX0lTX0xPQURJTkdfQURBUFRFUl9DTEFTUyA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5jbGFzczsKLQotICAgIHB1YmxpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgZmluZEFkYXB0ZXIoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBTeW5jaHJvbml6aW5nIG9uICIgKyBhUmVzb3VyY2UpOwotICAgICAgICAKLSAgICAgICAgLyogU3luY2hyb25pemUgb24gdGhlIFJlc291cmNlICh3aGljaCB3aWxsIGJlIHRoZSB0YXJnZXQgb2YgCi0gICAgICAgICAqIHRoZSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cykuCi0gICAgICAgICAqIAotICAgICAgICAgKiByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCkgd2lsbCBjb29yZGluYXRlIHdpdGggdGhpcyAKLSAgICAgICAgICogc3luY2hyb25pemF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkIChhUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIGFkYXB0ZXIgPSAoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihhUmVzb3VyY2UuZUFkYXB0ZXJzKCksIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkYXB0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0gICAgICAgIGlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0gICAgICAgICAgICBpZiAoaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKSByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vdGlmaWNhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldExvYWRlZFJlc291cmNlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCAmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCkgewotCi0gICAgICAgIC8qIFN5bmNocm9uaXplIG9uIHRoZSB0YXJnZXQgb2YgdGhlIEFkYXB0ZXIuIElmIAotICAgICAgICAgKiB0aGUgbGlzdCBvZiBhZGFwdGVycyBpcyBzZWFyY2hlZCBmb3IgYSAKLSAgICAgICAgICogUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIHVzaW5nIHRoZSAKLSAgICAgICAgICogUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKCkgQVBJLCB0aGVuCi0gICAgICAgICAqIHRoZSBhY2Nlc3MgdG8gcmVtb3ZlIHRoZSBBZGFwdGVyIHVzaW5nIHRoaXMgbWV0aG9kIAotICAgICAgICAgKiB3aWxsIGJlIGNvb3JkaW5hdGVkLiAgCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBTeW5jaHJvbml6aW5nIG9uICIgKyBnZXRUYXJnZXQoKSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGdldFRhcmdldCgpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlID09IFJFU09VUkNFX0lTX0xPQURJTkdfQURBUFRFUl9DTEFTUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3JjZVJlbGVhc2UoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk5ZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgewotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkoKTsKLSAgICAgICAgIAotICAgIHB1YmxpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgY3JlYXRlUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXZpc2l0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWM2N2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXZpc2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1wdWJsaWMgY2xhc3MgUmV2aXNpdCB7Ci0KLQkvKioKLQkgKiBSZXZpc2l0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJldmlzaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJldmlzaXQoKSB7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5Db21tZW50KCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0b0RvKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZhY3RvcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRGVwcmVjYXRlZE1ldGhvZCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlTWUoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJldmlld0Rlc2lnbigpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9TdHJpbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYyMzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9TdHJpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdVdGlsIHsKLQkvKioKLQkgKiBFbmhhbmNlZCBlcXVhbGl0eSBjaGVjayBmb3IgdHdvIHN0cmluZyBwYXJhbWV0ZXJzLCB0aGF0IHRha2VzIGludG8gY29uc2lkZXJhdGlvbiBudWxsIHZhbHVlcy4KLQkgKiBJZiBib3RoIHZhbHVlcyBhcmUgbnVsbCwgdGhpcyB3aWxsIHJldHVybiB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBzMQotCSAqIEBwYXJhbSBzMgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzRXF1YWwoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKHMxID09IG51bGwpCi0JCQlyZXR1cm4gczIgPT0gbnVsbDsKLQkJcmV0dXJuIHMxLmVxdWFscyhzMik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllZThiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgVHJhbnNsYXRvck1hbmFnZXIgY2xhc3MgdXNlZCBieSB0aGUgVHJhbnNsYXRvclNlcnZpY2UgaW4gb3JkZXIgdG8gZGlzY292ZXIKLSAqIGFuZCBjYWNoZSBhbGwgb2YgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3JzIHRvIGJlIHVzZWQgYnkgRU1GMkRPTUFkYXB0ZXJJbXBsLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvck1hbmFnZXIgewotCQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gVHJhbnNsYXRvck1hbmFnZXIgaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBUcmFuc2xhdG9yTWFuYWdlcigpOwotCQotCS8qKgotCSAqIENhY2hlIG9mIGFsbCB0aGUgVHJhbnNsYXRvckRlc2NyaXB0b3JzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZXQgdHJhbnNsYXRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIERlZmF1bHQgc3RhdGljIGVtcHR5IGFycmF5IHVzZWQgd2hlbiBubyBkZXNjcmlwdG9ycyBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gTk9fRVhURU5ERURfVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvckRlc2NyaXB0b3JbMF07Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2xhdG9yTWFuYWdlcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvck1hbmFnZXIgSU5TVEFOQ0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvck1hbmFnZXIoKSB7Ci0JCW5ldyBUcmFuc2xhdG9yUmVnaXN0cnkoKS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2ltcGxlIFJlZ2lzdHJ5IFJlYWRlciB1c2VkIGJ5IFRyYW5zbGF0b3IgTWFuYWdlciB0byByZWNvZ25pemUgdGhlIFRyYW5zbGF0b3IgZXh0ZW5zaW9ucwotCSAqLwotCXByaXZhdGUgY2xhc3MgVHJhbnNsYXRvclJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCQkKLQkJLyoqCi0JCSAqIFRoZSBUcmFuc2xhdG9yIGVsZW1lbnQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTEFUT1IgPSAidHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvclJlZ2lzdHJ5KCkgewotCQkJc3VwZXIoRWNvcmVVdGlsaXRpZXNQbHVnaW4uSUQsIEVjb3JlVXRpbGl0aWVzUGx1Z2luLlRSQU5TTEFUT1JfRVhURU5TVElPTl9QT0lOVCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaWYgaXQgbWF0Y2hzIHRoZSBleHBlY3RlZCB0cmFuc2xhdG9yIGVsZW1lbnQgbmFtZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoVFJBTlNMQVRPUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJYWRkVHJhbnNsYXRvckRlc2NyaXB0b3IobmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXNjcmliZXMgYSBUcmFuc2xhdG9yIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50Ci0JICovCi0JcHVibGljIGNsYXNzIFRyYW5zbGF0b3JEZXNjcmlwdG9yIHsKLQkKLQkJLyoqCi0JCSAqIFF1YWxpZmllZCBjbGFzcyBuYW1lIGF0dHJpYnV0ZQotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBUaGUgY29uZmlnIGVsZW1lbnQgZm9yIHRoaXMgRGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLQkJCi0JCS8qKgotCQkgKiB0aGUgY2FjaGVkIHF1YWxpZmllZCBjbGFzc05hbWUgdmFsdWUgb2YgdGhpcyBkZXNjcmlwdG9yCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiBAcGFyYW0gYUNvbmZpZ0VsZW1lbnQKLQkJICovCi0JCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCQljbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3IKLQkJICogQHJldHVybiBTdHJpbmcgY2xhc3NuYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgYWN0dWFsIFRyYW5zbGF0b3IgaW5zdGFuY2UgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCQkgKiBAcmV0dXJuIFRyYW5zbGF0b3IKLQkJICovCi0JCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVRyYW5zbGF0b3IoKSB7Ci0JCQlUcmFuc2xhdG9yIGluc3RhbmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW5zdGFuY2UgPSAoVHJhbnNsYXRvcikgY29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTTkFNRSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBUcmFuc2xhdG9yRGVzY3JpcHRvciB0byB0aGUgY2FjaGUgb2YgZGVzY3JpcHRvciBleHRlbnNpb25zLgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKFRyYW5zbGF0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkZXNjcmlwdG9yKTsKLQkJdHJhbnNsYXRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIGFsbCB0aGUgYXNzb2NpYXRlZCBUcmFuc2xhdG9yRGVzY3JpcHRvcnMgZm9yIHRoZSBUcmFzbGF0b3IgZXh0ZW5zaW9ucyBkZWZpbmVkLgotCSAqIEByZXR1cm4gVHJhbnNsYXRvckRlc2NyaXB0b3JbXQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGZpbmRUcmFuc2xhdG9ycygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVRyYW5zbGF0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIHRyYW5zbGF0b3JzSXRyID0gdHJhbnNsYXRvcnMuaXRlcmF0b3IoKTsgdHJhbnNsYXRvcnNJdHIuaGFzTmV4dCgpOykgewotCQkJZGVzY3JpcHRvciA9IChUcmFuc2xhdG9yRGVzY3JpcHRvcikgdHJhbnNsYXRvcnNJdHIubmV4dCgpOwotCQkJcmVzdWx0LmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fRVhURU5ERURfVFJBTlNMQVRPUlM7Ci0JCX0KLQkJcmV0dXJuIChUcmFuc2xhdG9yRGVzY3JpcHRvcltdKSByZXN1bHQudG9BcnJheShuZXcgVHJhbnNsYXRvckRlc2NyaXB0b3JbcmVzdWx0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTJhN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5UcmFuc2xhdG9yTWFuYWdlci5UcmFuc2xhdG9yRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzZXJ2aWNlIGNsYXNzIHRvIGRlbGl2ZXIgQVBJIHRvIHVzZSB0byByZXRyaWV2ZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMgZnJvbQotICogdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGFuZCBpdHMgUmVnaXN0cnlSZWFkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yU2VydmljZSB7Ci0KLQkvKioKLQkgKiBTdGF0aWMgS2V5IHZhbHVlIHBhaXIgb2YgZGVzY3JpcHRvcnMgYXMga2V5cyBhbmQgVHJhbnNsYXRvciBpbnN0YW5jZXMgYXMgdmFsdWVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHRyYW5zbGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBTdGF0aWMgZW1wdHkgYXJyYXkgdXNlZCB3aGVuIG5vIGV4dGVuc2lvbnMgZm91bmQKLQkgKi8KLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gTk9fVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvclswXTsKLQkKLQkvKioKLQkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zbGF0b3Igc2VydmljZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JTZXJ2aWNlIElOU1RBTkNFID0gbmV3IFRyYW5zbGF0b3JTZXJ2aWNlKCk7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvclNlcnZpY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvclNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB3aWxsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBleHRlbnNpb24gcG9pbnQgVHJhbnNsYXRvckRlc2NyaXB0b3Igb2JqZWN0cyBmcm9tIHRoZSBtYW5hZ2VyCi0JICogQHJldHVybiBUcmFuc2xhdG9yRGVzY3JpcHRvcltdCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZ2V0VHJhbnNsYXRvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gVHJhbnNsYXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5maW5kVHJhbnNsYXRvcnMoKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogVGhpcyByZXRyaWV2ZXMgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3JzIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgbWFuYWdlciBhbmQgZGVzY3JpcHRvcnMKLSAgICAgKiBAcmV0dXJuIFRyYW5zbGF0b3JbXSAoTm90ZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgY29udGFpbiBudWxsIGVudHJpZXMuKQotICAgICAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0VHJhbnNsYXRvcnMoKSB7Ci0JCVRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUcmFuc2xhdG9yRGVzY3JpcHRvcnMoKTsKLQkJVHJhbnNsYXRvcltdIHJlc3VsdCA9IG5ldyBUcmFuc2xhdG9yW2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCS8vVGhlIHJlc3VsdCBpbmRleCBjb3VsZCBkaWZmZXIgZnJvbSB0aGUgZGVzY3JpcHRvcnMgaW5kZXguCi0JCWludCByZXN1bHRJbmRleCA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IGdldFRyYW5zbGF0b3IoZGVzY3JpcHRvcnNbaV0pOwotCQkJaWYgKGluc3RhbmNlIT1udWxsKSB7Ci0JCQkJcmVzdWx0W3Jlc3VsdEluZGV4XSA9IGluc3RhbmNlOwotCQkJCXJlc3VsdEluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsgIAotICAgIH0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXNzb2NpYXRlZCBUcmFuc2xhdG9yIGluc3RhbmNlIGZvciB0aGUgZGVzY3JpcHRvciwgb3IgY3JlYXRlIGEgbmV3Ci0JICogb25lIGFuZCBjYWNoZSBvbiB0aGUgU2V0LgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdG9yRGVzY3JpcHRvcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3JEZXNjcmlwdG9yIHRyYW5zbGF0b3JEZXNjcmlwdG9yKSB7Ci0JCVRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IChUcmFuc2xhdG9yKSB0cmFuc2xhdG9ycy5nZXQodHJhbnNsYXRvckRlc2NyaXB0b3IpOwotCQlpZiAodHJhbnNsYXRvciAhPSBudWxsKQotCQkJcmV0dXJuIHRyYW5zbGF0b3I7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRyYW5zbGF0b3JzKSB7Ci0JCQl0cmFuc2xhdG9yID0gdHJhbnNsYXRvckRlc2NyaXB0b3IuY3JlYXRlVHJhbnNsYXRvcigpOwotCQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCQl0cmFuc2xhdG9ycy5wdXQodHJhbnNsYXRvckRlc2NyaXB0b3IsIHRyYW5zbGF0b3IpOwotCQl9Ci0JCXJldHVybiB0cmFuc2xhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWM2NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNjMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBXRlRVdGlsc1Jlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndmdHV0aWxzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEQU5HTElOR19IUkVGX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlZ2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGYWlsZWRfdG9fY29udmVydF9fMF9fdG9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bWVyYXRpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3J0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvdWJsZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXJfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG9hdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnl0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2FybmluZ19fQ291bGRfbm90X3dyaXRlX2JfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZk9iamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGFhNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyB3aWxsIGJlIGRlbGV0ZWQuIElmIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLCBwbGVhc2UgY29udGFjdCB0aGUKLSAqICAgICAgICAgICAgIFdDQ00gdGVhbS4gQSBjbGFzcyB3aGljaCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEVuY29kZXIvRGVjb2RlcnMgdG8gc2F2ZQotICogICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoZXkgYXJlIG1hZGUgZGlydHkgYnkgYXV0b21hdGljIGVuY29kaW5nIHN1cHBvcnQuIFVzYWdlIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqIAotICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgotICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7Ci0gKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCi0gKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKLSAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgotICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKLSAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICogLy8gV3JpdGVCYWNrSGVscGVyLgotICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKLSAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KLSAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgV3JpdGVCYWNrSGVscGVyIHsKLQlwcml2YXRlIFNldCBkaXJ0eU9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgYm9vbGVhbiB0cmFja2luZ0NoYW5nZXMgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBXcml0ZUJhY2tIZWxwZXIgX2luc3RhbmNlOwotCXN0YXRpYyB7Ci0JCS8vRGVwcmVjYXRlZCBjbGFzcwotCQlSZXZpc2l0LmRlbGV0ZU1lKCk7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBlbnN1cmVzIHByb3BlciB1c2FnZSB0aHJvdWdoIHNpbmdsZXRvbi4KLQkgKi8KLQlwcml2YXRlIFdyaXRlQmFja0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXJ0eU9iamVjdChFT2JqZWN0IGRpcnR5T2JqZWN0KSB7Ci0JCWRpcnR5T2JqZWN0cy5hZGQoZGlydHlPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGNvbGxlY3Rpbmcgb2JqZWN0cyB3aGljaCBoYXZlIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW4oKSB7Ci0JCXRyYWNraW5nQ2hhbmdlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gc2F2ZSBhbGwgZGlydHkgcmVzb3VyY2VzIChpZiBwb3NzaWJsZSksIHRoZW4gbWFya3MgdGhlIHJlc291cmNlcyBhcyBub24tZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgZW5kKCkgewotCQlzYXZlRGlydHlSZXNvdXJjZXMoKTsKLQkJcmVzZXQoKTsKLQkJdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGNoYW5nZXMgdG8gbW9mIG9iamVjdHMgYXJlIGN1cnJlbnRseSBiZWluZyB0cmFja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdHJhY2tpbmdDaGFuZ2VzOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgbGlzdCBvZiBkaXJ0eSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCWRpcnR5T2JqZWN0cy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIHNhdmUgYWxsIGRpcnR5IHJlc291cmNlcyAoaWYgcG9zc2libGUpLCB0aGVuIG1hcmtzIHRoZSByZXNvdXJjZXMgYXMgbm9uLWRpcnR5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVEaXJ0eVJlc291cmNlcygpIHsKLQkJU2V0IGRpcnR5UmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgZGlydHlPYmpJdGVyID0gZGlydHlPYmplY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkaXJ0eU9iakl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGRpcnR5T2JqZWN0ID0gKEVPYmplY3QpIGRpcnR5T2JqSXRlci5uZXh0KCk7Ci0JCQlpZiAoZGlydHlPYmplY3QuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhZGlydHlSZXNvdXJjZXMuY29udGFpbnMoZGlydHlPYmplY3QpKSB7Ci0JCQkJZGlydHlSZXNvdXJjZXMuYWRkKGRpcnR5T2JqZWN0LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlJdGVyYXRvciBkaXJ0eUl0ZXIgPSBkaXJ0eVJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZGlydHlJdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgZGlydHlSZXNvdXJjZSA9IChSZXNvdXJjZSkgZGlydHlJdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJZGlydHlSZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXdhcm4oZGlydHlSZXNvdXJjZSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRlQmFja0hlbHBlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFdyaXRlQmFja0hlbHBlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogV2FybiB0aGUgdXNlciBvZiBwcm9ibGVtcyBkdXJpbmcgc2F2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3YXJuKFJlc291cmNlIHJlcywgRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXywgbmV3IE9iamVjdFtde3Jlcy5nZXRVUkkoKX0pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhMWQyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBbiBYTUwgdmFsdWUgZXNjYXBpbmcgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbHVlRW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgaW1wbGVtZW50cyBFbmNvZGVyRGVjb2RlciB7Ci0JLyoqCi0JICogSWRlbnRpZmllcyB0aGUgbGFzdCBwcmludGFibGUgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIHJhbmdlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQotCSAqIGVuY29kaW5nIHVzZWQgd2l0aCB0aGlzIHNlcmlhbGl6ZXIuIEZvciA4LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIGVpdGhlciAweDdFIG9yIDB4RkYuIEZvcgotCSAqIDE2LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIDB4RkZGRi4gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcHJpbnRhYmxlIHdpbGwgYmUgZXNjYXBlZCB1c2luZwotCSAqIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgaW50IF9sYXN0UHJpbnRhYmxlID0gMHg3RTsKLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFZhbHVlRW5jb2RlckRlY29kZXIgX3NpbmdsZXRvbjsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQkvLyBOT1RfSU1QTEVNRU5URUQKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOwotCQljaGFyIGNoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKLQkJCWNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCi0JCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5Ci0JCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCi0JCQkvLyBYTUwgYW5kIEhUTUwuCi0JCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKLQkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKLQkJCQlzYnVmLmFwcGVuZCgnJicpOwotCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlciByZWZlcmVuY2UuCi0JCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKLQkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlIHRocmVzaG9sZC4KLQkJCQlzYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9zaW5nbGV0b24uZW5jb2RlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzIGNoYXJhY3RlciB2YWx1ZSwgb3IgbnVsbCBpZiBubyBzdWNoIGVudGl0eQotCSAqIGV4aXN0cy4gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIDx0dD4nJmFtcDsnPC90dD4gd2lsbCByZXR1cm4gPHR0PiImYW1wO2FtcDsiPC90dD4uCi0JICogCi0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICBDaGFyYWN0ZXIgdmFsdWUKLQkgKiBAcmV0dXJuIENoYXJhY3RlciBlbnRpdHkgbmFtZSwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5UmVmKGNoYXIgY2gpIHsKLQkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gImd0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuICJxdW90IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiAiYW1wIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJlMmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fPUlXQUUwMDA4VyBXYXJuaW5nOiBDb3VsZCBub3Qgd3JpdGUgYmFjayB7MH0KLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXz1JV0FFMDAwOUUgU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoKLUVudW1lcmF0aW9uX1VJXz1FbnVtZXJhdGlvbgotRG91YmxlX1VJXz1Eb3VibGUKLUZsb2F0X1VJXz1GbG9hdAotTG9uZ19VSV89TG9uZwotU2hvcnRfVUlfPVNob3J0Ci1Cb29sZWFuX1VJXz1Cb29sZWFuCi1JbnRlZ2VyX1VJXz1JbnRlZ2VyCi1DaGFyYWN0ZXJfVUlfPUNoYXJhY3RlcgotQnl0ZV9VSV89Qnl0ZQotRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfPUlXQUUwMDE0RSBGYWlsZWQgdG8gY29udmVydCB7MH0gdG8gezF9LgotREFOR0xJTkdfSFJFRl9FUlJPUl89SVdBRTAwMDFFIFVuYWJsZSB0byByZXNvbHZlIEhSRUYgezB9LiBDaGVjayB0aGUgZGVzY3JpcHRvciBmaWxlcyBhbmQgZW5zdXJlIHRoZSBpZHMgYXJlIHZhbGlkLgotTW9mT2JqZWN0X1VJXz1Nb2ZPYmplY3RfVUlfCi1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wPVBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzAKLUVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wPUVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wCi0KLVJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyX0VSUk9SXzA9SVdBRTAwMDJFIFRoZSBSZXNvdXJjZVNldCBjYW5ub3QgYmUgbnVsbC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0NTE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qZW0vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTQ2NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWVtZndvcmtiZW5jaGVkaXQuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZjAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0NjhmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjA2OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjYwM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OGFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGMxY2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FTUZfUmVzb3VyY2VfRWRpdF9Nb2RlbD1FTUYgUmVzb3VyY2UgRWRpdCBNb2RlbAotRWRpdF9Nb2RlbF9FeHRlbnNpb25zPUVkaXQgTW9kZWwgRXh0ZW5zaW9ucwotQWRhcHRlcl9GYWN0b3J5X0V4dGVuc2lvbj1BZGFwdGVyIEZhY3RvcnkgRXh0ZW5zaW9uCi1Nb2RpZmllckhlbHBlckZhY3Rvcnk9TW9kaWZpZXJIZWxwZXJGYWN0b3J5Ci1wbHVnaW5OYW1lPUVNRiBXb3JrYmVuY2ggRWRpdCBQbHVnLWluCi1wbHVnaW5WZW5kb3I9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3M2I1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0TW9kZWwiIG5hbWU9IiVFTUZfUmVzb3VyY2VfRWRpdF9Nb2RlbCIgc2NoZW1hPSJzY2hlbWEvZWRpdE1vZGVsLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbmFtZT0iJUVkaXRfTW9kZWxfRXh0ZW5zaW9ucyIgc2NoZW1hPSJzY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFkYXB0ZXJGYWN0b3J5IiBuYW1lPSIlQWRhcHRlcl9GYWN0b3J5X0V4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvYWRhcHRlckZhY3RvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBuYW1lPSIlTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwuaW50ZXJuYWxXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSI+Ci0gICAgICA8ZmFjdG9yeUNsYXNzCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSI+Ci0gICAgICA8L2ZhY3RvcnlDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSJlbWZWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgbmFtZT0iZW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+Ci0gICAgICA8dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLSAgICAgICAgaWQ9ImVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBoYW5kbGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBzZWxlY3Rpb25UeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iCi0gICAgICBwcm9wZXJ0aWVzPSJlbWZQYWNrYWdlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJWYWxpZGF0ZUVkaXRDb250ZXh0IgotICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dCIKLSAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDFkNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guZWRpdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGUiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotCi0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1mdG9zZWQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q4NGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVW5leHBlY3RlZF9JT19leGNlcHRpb25fb2NjdXJyZWRfY3JlYXRpbmdfeG1sX2RvY3VtZW50XzFfRVhDXz1JV0FFMDAxN0UgVW5leHBlY3RlZCBJTyBleGNlcHRpb24gb2NjdXJyZWQgY3JlYXRpbmcgeG1sIGRvY3VtZW50Ci1FTUYyRE9NU2VkUmVuZGVyZXJfVUlfMD17MH0gc2hvdWxkIG5vdCB1c2UgYW4gT3V0cHV0U3RyZWFtIGZvciBsb2FkaW5nCi1FTUYyRE9NU2VkUmVuZGVyZXJfVUlfMT17MH0gc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1md29ya2JlbmNoZWRpdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzFkMWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUR5bmFtaWNBZGFwdGVyRmFjdG9yeV9FUlJPUl8wPUlXQUUwMDEwRSBBIG51bGwgRVBhY2thZ2Ugd2lsbCBub3QgYmUgdGllZCB0byBhbnkgQWRhcHRlciBGYWN0b3J5LgotQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMD1UaGVyZSBhcmUgYXQgbGVhc3QgezB9IGltcHJvcGVybHkgcmVsZWFzZWQgZWRpdCBtb2RlbHMuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xPVRoaXMgZXhjZXB0aW9uIHdhcyBnZW5lcmF0ZWQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCB1c2FnZSBvZiByZWZlcmVuY2UgY291bnRzLlxuIFR5cGljYWxseSwgdGhpcyBvY2N1cnMgb24gYXR0ZW1wdHMgdG8gb3BlbiBhbiBhbHJlYWR5IG9wZW4gYXJ0aWZhY3QgZWRpdC5cbiBNYWtlIHN1cmUgdGhlIGRpc3Bvc2UgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGRvbmUgYWNjZXNzaW5nLlxuIFBsZWFzZSBleGFtaW5lIHRoZSBzdGFjayB0cmFjZS5cbiBDbGllbnQgQWNjZXNzIEV4Y2VwdGlvbiBvZiB0eXBlIHswfSBcbgotQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAxMUUgS2V5IGFscmVhZHkgdXNlZCB0byBhY2Nlc3MgUmVzb3VyY2UKLUNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzE9SVdBRTAwMTJFIEtleSBoYXMgbm90IHByb3Blcmx5IGFjY2Vzc2VkIFJlc291cmNlLgotRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAxM0UgVGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmb3IgdGhlIEVkaXQgTW9kZWwgXCJ7MH1cIiBjb250YWlucyBhIGN5Y2xlLiBQbGVhc2UgY29ycmVjdCB0aGUgZW50cmllcyBpbiB5b3VyIHBsdWdpbi54bWwgZmlsZXMuCi1FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8xPUlXQUUwMDE0RSBDb3VsZCBub3QgY3JlYXRlIGZhY3RvcnkgYmVjYXVzZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbC4KLUVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzI9SVdBRTAwMTVFIE5vIEVkaXRNb2RlbEZhY3RvcnkgZm9yIGtleSBcInswfVwiCi1TbmFwc2hvdF9FUlJPUl8wPUlXQUUwMDE2RSBMb2NraW5nIEluc3VyYW5jZSBTdGFjayBUcmFjZQotQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzA9SVdBRTAwMTdFIEEgcGFja2FnZVVSSSBpcyByZXF1aXJlZCBmb3IgYWxsIEFkYXB0ZXIgRmFjdG9yaWVzCi1BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMT1JV0FFMDAxOEUgQW4gaWQgaXMgcmVxdWlyZWQgZm9yIGFsbCBBZGFwdGVyIEZhY3Rvcmllcy4gQ2hlY2sgYWxsIGFkYXB0ZXIgZmFjdG9yaWVzIGRlZmluZWQgaW4gXCJ7MH1cIi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9Nb2R1bGVDb3JlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmJkZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBydW50aW1lSmFyPSJ0cnVlIgotICAgIG1vZGVsTmFtZT0iUHJvamVjdE1vZHVsZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdG1vZHVsZS5wcm92aWRlci5Nb2R1bGVDb3JlRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3Rtb2R1bGUucHJlc2VudGF0aW9uLk1vZHVsZUNvcmVFZGl0b3JQbHVnaW4iCi0gICAgcnVudGltZUNvbXBhdGliaWxpdHk9ImZhbHNlIj4KLSAgPGZvcmVpZ25Nb2RlbD5tb2R1bGVDb3JlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+RDpcd29ya1xXVFA8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iTW9kdWxlQ29yZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9Im1vZHVsZUNvcmUuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL3VzZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL2NvbnN1bWVzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1vZHVsZUNvcmUuZWNvcmUjLy9VUkkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9oYW5kbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL2RlcGxveWVkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvcmVzb3VyY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9tb2R1bGVUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9tb2R1bGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL3NvdXJjZVBhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvZGVwbG95ZWRQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL2V4Y2x1c2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL21vZHVsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL01vZHVsZVR5cGUvbWV0YWRhdGFSZXNvdXJjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZS9tb2R1bGVUeXBlSWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL1Byb2plY3RNb2R1bGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1Byb2plY3RNb2R1bGVzL3dvcmtiZW5jaE1vZHVsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZS9oYW5kbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlL2RlcGxveWVkUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUvZGVwZW5kZW5jeVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzBmNWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjUgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1vZHVsZUNvcmUiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJNb2R1bGVDb3JlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAibW9kdWxlY29yZS54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVBIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjM5QUE4NjY2MDE5MCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUIiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBleHQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCNTM0RkQwMjRDIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QyINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjBGQzAzQ0EiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY0Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTA2MDEwNyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjUiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnRibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxNEYwMzFGIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NiINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjNBMjJFNjA4MDMwMyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjciDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjExNTAyQTQiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY4Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ajJjYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MzJFMDM4QyIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJXb3JrYmVuY2hNb2R1bGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhhbmRsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzFENzEwMTVEIg0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ3MUQwMjA4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNjcwMDM5Ig0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvdXJjZVBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNERjk3MDEyOCINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUVDNjQwMDI1QiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUUzREY5RTAxMUUiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1vZHVsZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFFQzFENTEwM0UyIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1ldGFkYXRhUmVzb3VyY2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMURGMDAyMUUiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kdWxlVHlwZUlkIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMjEzNDAzNTciDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJVUkkiDQotCSAgICBxdWlkICAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMyNzA4MDNBQyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlByb2plY3RNb2R1bGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRjU2NkRCMDI1MSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9qZWN0TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3RkQwMjNBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGVwZW5kZW50TW9kdWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUYwMDFDOSINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUZBMDAxNSINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBlbmRlbmN5VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzkyNDMwMTZFIg0KLQkJICAgIHR5cGUgICAgICAgCSJEZXBlbmRlbmN5VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDIwMzk0RjUwMTg1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRlcGVuZGVuY3lUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjQyMDM5NEY1MDE4NSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXx1c2VzPTANCi18Y29uc3VtZXM9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzk5MzgwMThEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3VtZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDM5QTZFMDEzOSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTRCMDFFMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXNvdXJjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRCINCi0JCSAgICBsYWJlbCAgICAgIAkicmVzb3VyY2VzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZVJlc291cmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY2NzAwMzkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRiINCi0JCSAgICBsYWJlbCAgICAgIAkibW9kdWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5ODAyQzIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzFEOTkwMjQxIg0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDUxMDNFMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5OTAyNDMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndvcmtiZW5jaE1vZHVsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMSINCi0JCSAgICBsYWJlbCAgICAgIAkid29ya2JlbmNoTW9kdWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpQcm9qZWN0TW9kdWxlcyINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNTY2REIwMjUxIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgcXVpZCAgICAgICAJIjQyMDE0NkE1MDJFMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDZBNjAyN0YiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW50TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY2QzI0QjAyM0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ2QTYwMjgxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIikpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRTNERjA2MDIxMCINCi0JICAgIHRpdGxlICAgICAgCSJNYWluIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTEwMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6VVJJIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTY0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1ODkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJOTIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJVUkkiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgxNDYwLCAxNjUwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJOTI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTkzOA0KLQkJICAgIGhlaWdodCAgICAgCTI0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMg0KLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDEyNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJNTA4DQotCQkJbGFiZWwgICAgICAJDQotfFRoZSBtb2R1bGUgImhhbmRsZSIgVVJJIHdpbGwgY29udGFpbiB0aGUgc3BlY2lhbCBNb2R1bGUgcHJvdG9jb2wsIHByb2plY3QgbmFtZSwgYW5kIG1vZHVsZSBpZGVudGlmaWVyLCBhbmQgd2lsbCBiZSBmdWxseSByZXNvbHZlZCB0byBhIGZ1bGwgcGxhdGZvcm0gVVJJDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTU2OA0KLQkJICAgIGhlaWdodCAgICAgCTQzMSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDE3NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg3MTQsIDE2MTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjY3MDAzOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg3MTQsIDE2NzQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk1MzEpDQotCQkgICAgd2lkdGggICAgICAJNTc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxMTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTAzMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZVR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ1MTAzRTIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTA5MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTcwMCkNCi0JCSAgICB3aWR0aCAgICAgIAk3MTINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6UHJvamVjdE1vZHVsZXMiIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDM2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDIwNCwgMjg3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUHJvamVjdE1vZHVsZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjZEQjAyNTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMjA0LCAzNDgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MzEpDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OkRlcGVuZGVudE1vZHVsZSIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ4MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDE0NzAsIDM0OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3MDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlcGVuZGVudE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgxNDcwLCA0MTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk3MTUpDQotCQkgICAgd2lkdGggICAgICAJNzI2DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoNzEyLCA2NDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoNzEyLCA3MDcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NzEpDQotCQkgICAgd2lkdGggICAgICAJNDgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQwLCAxMjM1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEIwMUUzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlcyIgQDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDM1NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDEwNzUsIDE1MDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MjY3NzYNCi0JCQkJaGVpZ2h0ICAgICAJMTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRTNFMTREMDMxRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NDAsIDEyMzUpDQotCQkJCSg5NDAsIDE2MDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQwLCAxMjM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQwLCAxNjAxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDg2MSwgMTQ5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzEwMzgzDQotCQkJCWhlaWdodCAgICAgCTc5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGUiIEAxMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgMzU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDEwNDMsIDk3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbW9kdWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMDgyNA0KLQkJCQloZWlnaHQgICAgIAkxMDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEQwMzFGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MCwgMTIzNSkNCi0JCQkJKDk0MCwgODcwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0MCwgMTIzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk0MCwgODcwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJCWxvY2F0aW9uICAgCSg4NjgsIDk3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzA5MzgyDQotCQkJCWhlaWdodCAgICAgCTczDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAxNQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjM0LCA3OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5ODAyQzIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlVHlwZSIgQDE2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIC0xMzcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMjAxMCwgOTc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMTU3Mw0KLQkJCQloZWlnaHQgICAgIAkxNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFQzFEOTkwMjQxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjM0LCA3OTEpDQotCQkJCSgxODU3LCA3OTEpDQotCQkJCSgxODU3LCAxMDE4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTcsIDEwMTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQkJbG9jYXRpb24gICAJKDE4MDQsIDk3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgLTEzNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5OTAyNDMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MzQsIDc5MSkNCi0JCQkJKDExODUsIDc5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjM0LCA3OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg1LCA3OTEpKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDIwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDY1NywgMTA0OCkNCi0JCQkoODI5LCA4NzApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDIxDQotCQkgICAgbG9jYXRpb24gICAJKDM5OSwgNjkxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndvcmtiZW5jaE1vZHVsZXMiIEAyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJCWxvY2F0aW9uICAgCSg0NzYsIDc0NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd29ya2JlbmNoTW9kdWxlcyINCi0JCQkJcGN0RGlzdCAgICAJMC4yNTMyODkNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjEwMTExIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzOTksIDY5MSkNCi0JCQkJKDcwMywgNjkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNjkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAzLCA2OTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0DQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43OTI3NjMNCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEAyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMTAxMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlANQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5OSwgNjkxKQ0KLQkJCQkoMzI1LCA2OTEpDQotCQkJCSgzMjUsIDQ2MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTksIDY5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyNSwgNDYxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyNg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzIyLCA2MzMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNTAyRTIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlcyIgQDI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxMzY3LCA1NDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNDc1NzM2DQotCQkJCWhlaWdodCAgICAgCTcyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE2MDI3RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMiwgNjMzKQ0KLQkJCQkoMTQ2MCwgNTg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxNDI3LCA2NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYzNjA3Nw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNjAyODEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNg0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjIsIDYzMykNCi0JCQkJKDExODUsIDY3NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDMxDQotCQkgICAgbG9jYXRpb24gICAJKDI3ODQsIDQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCWxvY2F0aW9uICAgCSgyMzg3LCAxNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxMA0KLQkJCW1heF93aWR0aCAgCTc1OQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxUaGUgZGVwZW5kZW50IG1vZHVsZSAiaGFuZGxlIiBtdXN0IGJlIHJlc29sdmFibGUgdG8gYSBXb3JrYmVuY2hNb2R1bGUuDQotfA0KLXxUaGUgRGVwbG95ZWRQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgbW9kdWxlIGluIHRoaXMgZGVwbG95bWVudCBzdHJ1Y3R1cmUuDQotfA0KLXxUaGUgZGVwZW5kZW5jeVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgZGVwZW5kZW50IG1vZHVsZSBpcyBhc3NlbWJsZWQuDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTgxOQ0KLQkJICAgIGhlaWdodCAgICAgCTUxMykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW5jeVR5cGUiIEAzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgOTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDg2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlcGVuZGVuY3lUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgODEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAzOTRGNTAxODUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDkyMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTIzNykNCi0JCSAgICB3aWR0aCAgICAgIAkzNjQNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDMxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIxODcsIDQ1NSkNCi0JCQkoMjM3NCwgNDQzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcyM2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kdWxlY29yZSIKLSAgICBuc1VSST0ibW9kdWxlY29yZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtiZW5jaE1vZHVsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZSIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBsb3llZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9tb2R1bGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01vZHVsZVR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXBlbmRlbnRNb2R1bGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGxveWVkUGF0aCIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdXNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrYmVuY2hNb2R1bGUiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrYmVuY2hNb2R1bGUvcmVzb3VyY2VzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZVR5cGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRhZGF0YVJlc291cmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxlVHlwZUlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSSSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0TW9kdWxlcyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtiZW5jaE1vZHVsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya2JlbmNoTW9kdWxlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXBlbmRlbnRNb2R1bGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGUiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwbG95ZWRQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGVuZGVuY3lUeXBlIiBlVHlwZT0iIy8vRGVwZW5kZW5jeVR5cGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZXBlbmRlbmN5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0idXNlcz0wJiN4RDsmI3hBO2NvbnN1bWVzPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InVzZXMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnN1bWVzIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWI0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODgzOSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JICAgIHZhbHVlICAgICAgCSIiKSkNCi0gICAgcXVpZCAgICAgICAJIjNBMEIyNDc0MDI1RiINCi0gICAgZW5mb3JjZUNsb3N1cmVBdXRvTG9hZCAJRkFMU0UNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2QSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyNjkiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0EwQjI0NzQwMjdEIg0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibW9kdWxlQ29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvblxccm9zZVxcbW9kdWxlQ29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiM0EwREI2OEIwMDQ2IikpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBhY2thZ2VWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDM2MCINCi0JCXRpdGxlICAgICAgCSJQYWNrYWdlVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAk2NTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZSIgQDENCi0JCQlsb2NhdGlvbiAgIAkoMzUyLCAzMjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4LCAyMzYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZUNvcmUiKQ0KLQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0EwREI2OEIwMDQ2Ig0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0QiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBCMjQ3OTAzMzgiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKQ0KLQljYXRlZ29yeSAgIAkiTG9naWNhbCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiNDFFQzFDM0IwMEE0IikNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0UiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc0MDI5MSINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInJvc2VJZCINCi0JCXZhbHVlICAgICAgCSI3NTMxMTc1NDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5oIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCS0yKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzVGFzayINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5jb21wbGV0ZVR5cGVTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmtub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiS25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiSUJNIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTb0RBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3Rpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImlub3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIm91dCINCi0JCQkJdmFsdWUgICAgICAJMTA0KSkpKSkpDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0YiKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvYWRhcHRlckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxMDBkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IkFkYXB0ZXIgRmFjdG9yeSBFeHRlbnNpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuIGFkYXB0ZXIgZmFjdG9yeSB3aXRoIHRoZSBkeW5hbWljIGFkYXB0ZXIgZmFjdG9yeS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhZGFwdGVyRmFjdG9yeSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRGVmaW5lcyB0aGUgQWRhcHRlciBGYWN0b3J5IGJlaW5nIGFkZGVkLiBBbGwgYWRkZWQgQWRhcHRlciBGYWN0b3JpZXMgYXJlIHF1ZXJpYWJsZSB3aGVuZXZlciB0aGVpciBGdW5jdGlvbiBHcm91cCBhbmQgb3B0aW9uYWwgVmlld2VyIElkIGFyZSBzcGVjaWZpZWQuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBwYWNrYWdlIFVSSSB0aGF0IHlvdSBhcmUgZXh0ZW5kaW5nIChmb3IgZXhhbXBsZSAmcXVvdDtlamIueG1pJnF1b3Q7KQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEFkYXB0ZXIgRmFjdG9yeSBleHRlbnNpb24uICBUaGlzIHdpbGwgYXNzb2NpYXRlIGl0IHdpdGggb25lIG9yIG1vcmUgZnVuY3Rpb24gZ3JvdXBzIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBncm91cCBwYXR0ZXJucy4gIEZ1bmN0aW9uIEdyb3VwcyBhbGxvdyBDb250ZW50IGFuZCBBY3Rpb25zIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gR2VuZXJhbGx5LCB0aGV5IGFyZSB1c2VkIGJ5IHZlbmRvcnMgd2hvIHdpc2ggdG8gYWRkIGZ1bmN0aW9uYWxpdHkgc3BlY2lmaWMgdG8gdGhlaXIgcHJvZHVjdHMsIGUuZy4gSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXJzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCB2aWV3ZXIgSWQgd2hpY2ggd2lsbCBsaW1pdCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVmaW5lZCBBZGFwdGVyIEZhY3RvcnkgdG8gdGhlIGdpdmVuIHZpZXdlciBpZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NDNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9ImVkaXRNb2RlbCIgbmFtZT0iRU1GIFJlc291cmNlIEVkaXQgTW9kZWwiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRWRpdCBtb2RlbHMgcHJvdmlkZSBhIGZyYW1ld29yayBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgRU1GIHJlc291cmNlcyB3aXRoaW4gYSB1bml0IG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSB3b3Jrc3BhY2Ugb3BlcmF0aW9uIG1heSBhZmZlY3QgYSBjaGFuZ2UgdG8gbXVsdGlwbGUgRU1GIHJlc291cmNlcy4gRWRpdCBtb2RlbHMgcHJvdmlkZSBiYXNpYyBzZXJ2aWNlcyBzdWNoIGFzIGxvYWRzLCBzYXZlcyAod2hlbiBuZWNlc3NhcnkpLCBhbmQgdmFsaWRhdGUgZWRpdCBmb3IgdGhlIG1hbmFnZWQgcmVzb3VyY2VzLiAgRWRpdCBtb2RlbHMgYXJlIHJlZmVyZW5jZSBjb3VudGVkLCB0aGVyZWZvcmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW4gZWRpdCBtb2RlbCBjYW4gYmUgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIG9yIGVkaXRvci4gIEJ5IGRlY2xhcmluZyBhbiBlZGl0IG1vZGVsLCBhIHBsdWdpbiBwcm92aWRlciBlbmFibGVzIG90aGVyIGNvbXBvbmVudHMgdG8gY29udHJpYnV0ZSByZXNvdXJjZXMgdG8gYmUgbWFuYWdlZCBieSB0aGF0IGVkaXQgbW9kZWwuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRNb2RlbCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGZvciBhbiBlZGl0IG1vZGVsIHRvIGJlIHVzZWQgaW4gdGhlIHdvcmtzcGFjZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWxSZXNvdXJjZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlZGl0TW9kZWxJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWRpdCBtb2RlbC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyB1c2VkIGZvciB0aGlzIGVkaXQgbW9kZWwuICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIHRoZW4gYSBnZW5lcmljICZsdDtjb2RlJmd0O0VkaXRNb2RlbCZsdDsvY29kZSZndDsgaXMgY3JlYXRlZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9hZFVua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5IiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50TW9kZWxJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRNb2RlbFJlc291cmNlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGlzIGFuIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIG9mIGEgcmVzb3VyY2UgdG8gdGhlIGVkaXQgbW9kZWwuICBJZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIHRoZSBzYW1lIFVSSSBpcyByZWdpc3RlcmVkIGFnYWluc3QgYW4gZWRpdCBtb2RlbCBpZCwgdGhlIHJlc291cmNlIGlzIHN0aWxsIG9ubHkgbG9hZGVkIG9uY2UuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29udGFpbmVyIGZyb20gd2hpY2ggRU1GIHJlc291cmNlcyBhcmUgbG9hZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvbG9hZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEluZGljYXRvciB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgYXV0b2xvYWRlZCB3aGVuIHRoZSBlZGl0IG1vZGVsIGlzIGNyZWF0ZWQsIG9yIHdoZW4gYW4gSUZpbGUgY29ycmVzcG9uZGluZyB0byB0aGlzIHJlc291cmNlIGlzIGFkZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgDQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VFeHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgYWxsb3dzIHJlZ2lzdHJhdGlvbiBvZiBmaWxlcyBmb3IgYXV0b2xvYWRpbmcgYWNjb3JkaW5nIHRvIGZpbGUgZXh0ZW5zaW9uLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZmlsZSBleHRlbnNpb24gaXRzZWxmICgmcXVvdDtteXhtaSZxdW90OykNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIGlkPSZxdW90O2VkaXRNb2RlbC5hY21lLnBhcmVudCZxdW90Ow0KLSAgICAgICAgIG5hbWU9JnF1b3Q7QWNtZSBQYXJlbnQgRWRpdCBNb2RlbCZxdW90Ow0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCZxdW90OyZndDsNCi0gICAgICAmbHQ7ZWRpdE1vZGVsDQotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9JnF1b3Q7Y29tLmFjbWUuYWNtZXByby5wYXJlbnQuZWRpdE1vZGVsJnF1b3Q7DQotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmcXVvdDsmZ3Q7DQotICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9yZXNvdXJjZTAueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMS54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLQ0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBpZD0mcXVvdDtlZGl0TW9kZWwuYWNtZS5jaGlsZCZxdW90Ow0KLSAgICAgICAgIG5hbWU9JnF1b3Q7QWNtZSBDaGlsZCBFZGl0IE1vZGVsJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWwNCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLmNoaWxkLmVkaXRNb2RlbCZxdW90Ow0KLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5JnF1b3Q7DQotICAgICAgICAgICAgcGFyZW50TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsmZ3Q7DQotICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9yZXNvdXJjZTIueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMy54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEVkaXQgTW9kZWxzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0Jmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbEV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmQyYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGlkPSJlZGl0TW9kZWxFeHRlbnNpb24iIG5hbWU9IkVkaXQgTW9kZWwgRXh0ZW5zaW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgRWRpdCBNb2RlbCBFeHRlbnNpb24gYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gY29udHJpYnV0ZSBleHBlY3RlZCByZXNvdXJjZXMgdG8gRWRpdCBNb2RlbHMuIFRoZSBmdW5jdGlvbkdyb3VwSUQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCB3aGljaCBleHRlbnNpb25zIHRoZXkgY2hvb3NlIHRvIGhhdmUgZW5hYmxlZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJlZGl0TW9kZWwuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsRXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFZGl0IG1vZGVsIGV4dGVuc2lvbnMgYWxsb3cgY29tcG9uZW50cyB0byBjb250cmlidXRlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYW4gZWRpdCBtb2RlbC4gIFdoZW5ldmVyIGFuIGVkaXQgbW9kZWwgaXMgbG9hZGVkLCB0aGUgcmVzb3VyY2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBsb2FkZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwuICBDaGFuZ2VzIHRvIHRoZSByZXNvdXJjZXMgd2lsbCBiZSB0cmFja2VkIGFuZCBzYXZlZCBkdXJpbmcgb3BlcmF0aW9ucyBvciBlZGl0b3Igc2F2ZXMuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdE1vZGVsUmVzb3VyY2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWRpdE1vZGVsSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgZWRpdCBtb2RlbCBiZWluZyBleHRlbmRlZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbi4gIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgZnVuY3Rpb24gZ3JvdXAgcGF0dGVybiBiaW5kaW5nLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRXh0ZW5zaW9uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWxFeHRlbnNpb24NCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtvcmcuc2FtcGxlLmluaGVyaXRhbmNlLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsNCi0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9JnF1b3Q7b3JnLnNhbXBsZS5ncm91cCZxdW90OyZndDsNCi0gICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9leHRlbnNpb24wLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvZXh0ZW5zaW9uMS54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsRXh0ZW5zaW9uJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvbW9kaWZpZXJIZWxwZXJGYWN0b3J5LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMDdkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9Ik1vZGlmaWVySGVscGVyRmFjdG9yeSIgbmFtZT0iTW9kaWZpZXIgSGVscGVyIEZhY3RvcnkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byByZWdpc3RlciBmb3IgdGhlIG1vZGVsIG1vZGlmaWVycy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFja2FnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InBhY2thZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0eXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InR5cGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmZWF0dXJlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmZWF0dXJlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Db21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWUwY2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGV4dGVuZHMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyKSB7Ci0JCXN1cGVyKGFuSW5wdXRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhQ29udGFpbmVyLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXN1cGVyKGFDb250YWluZXIsIGFTeW5jaHJvbml6ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lcikgewotCQlzdXBlcihhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYW5JbnB1dENvbnRhaW5lciwgYW5PdXRwdXRDb250YWluZXIsIGFTeW5jaHJvbml6ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMueG1pLmhlbHBlcnMuQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciNkZU5vcm1hbGl6ZShVUkkpCi0JICovCi0JcHVibGljIFVSSSBkZU5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UGxhdGZvcm1GaWxlKHVyaSk7Ci0JCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IGZpbGVQcm9qZWN0ID0gYUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCS8vSWYgaXQgaXMgbm90IGluIHRoZSBzYW1lIHByb2plY3QgdGhlbiBqdXN0IHJldHVybiB0aGUgVVJJIGFzIGlzLgotCQkJCWlmIChyZXNvdXJjZVNldFN5bmNocm9uaXplci5nZXRQcm9qZWN0KCkgPT0gZmlsZVByb2plY3QpCi0JCQkJCXJldHVybiBnZXRDb250YWluZXJSZWxhdGl2ZVVSSShhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0R5bmFtaWNHcm93dGhNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTlhNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLQotcHVibGljIGNsYXNzIER5bmFtaWNHcm93dGhNb2RlbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fT1BUSU1BTF9TSVpFID0gMTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVNT1JZX1RIUkVTSEhPTEQgPSAxMDA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElDRUFCTEVfQ0hBTkdFID0gNTsKLQkKLQkKLQkvKiBTdG9yZXMgYSBGSUZPIGxpc3Qgb2YgdGhlIEtleSB0eXBlcyAoSVBhdGgpKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOwotCQotCS8qIFdlIHVzZSBhbiBpbnRbXSBhcyB0aGUgdmFsdWUgc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNyZWF0aW5nIEludGVnZXIgb2JqZWN0cyAqLwotCXByaXZhdGUgZmluYWwgTWFwLyogPElQYXRoLCBpbnRbXT4gKi8gdW5pcXVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JCi0JLyoqCi0JICogSW5qZWN0IHRoZSBrZXkgaW50byB0aGUgRHluYW1pY0dyb3d0aE1vZGVsLiBNYXkgb3IgbWF5IG5vdCBhZmZlY3QgdGhlIAotCSAqIGR5bmFtaWMgc2l6ZS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBpbmplY3QgaW50byB0aGUgbW9kZWwKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wdGltYWwgc2l6ZSBjaGFuZ2VkIGdyZWF0aGVyIHRoYW4ge0B2YWx1ZSBOT1RJQ0VBQkxFX0NIQU5HRX0gYXMgYSByZXN1bHQgb2YgdGhlIGluamVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaW5qZWN0S2V5KElQYXRoIGtleSkgewotCQkKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IGdldE9wdGltYWxTaXplKCk7Ci0JCQotCQlpbnRbXSBjb3VudCA9IG51bGw7Ci0JCWlmKCAoY291bnQgPSAoaW50W10pIHVuaXF1ZXNNYXAuZ2V0KGtleSkpICE9IG51bGwgKSB7Ci0JCQkvKiBpbmNyZW1lbnQgdGhlIGNvdW50ICovCi0JCQkrK2NvdW50WzBdOwotCQl9IGVsc2UgewotCQkJLyogaW5zZXJ0IHRoZSBmaXJzdCBjb3VudCAqLwotCQkJdW5pcXVlc01hcC5wdXQoa2V5LCBjb3VudCA9IG5ldyBpbnRbXSB7IDEgfSApOwotCQl9Ci0JCQotCQlpZiggcXVldWUuc2l6ZSgpID09IE1FTU9SWV9USFJFU0hIT0xEICkgewotCQkJCi0JCQkvKiB0YWtlIHRoZSBvbGRlc3QgdmFsdWUgb2ZmIHRoZSBxdWV1ZSAqLwotCQkJSVBhdGggb2xkZXN0S2V5ID0gKElQYXRoKSBxdWV1ZS5yZW1vdmUoMCk7Ci0JCQkKLQkJCS8qIGRldGVybWluZSBpZiBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBvbGRlc3Qga2V5IGlzIHN0aWxsIGluIHRoZSBxdWV1ZSAqLwotCQkJY291bnQgPSAoaW50W10pIHVuaXF1ZXNNYXAuZ2V0KG9sZGVzdEtleSk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNvdW50KTsKLQkJCQotCQkJLyogUmVkdWNlIHRoZSBjb3VudCAqLwotCQkJY291bnRbMF0gLT0gMTsKLQkJCi0JCQkvKiBDb3VudCBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUgKi8KLQkJCUFzc2VydC5pc1RydWUoY291bnRbMF0gPj0gMCk7Ci0JCQkKLQkJCi0JCQkvKiBUaGlzIHVuaXF1ZSBrZXkgaXMgbm8gbG9uZ2VyIGluIHRoZSBxdWV1ZSovCi0JCQlpZihjb3VudFswXSA9PSAwKSB7Ci0JCQkJdW5pcXVlc01hcC5yZW1vdmUob2xkZXN0S2V5KTsKLQkJCX0KLQkJCQotCQkJCi0JCQkKLQkJfQotCQkvKiBBZGQgdGhlIG5ld0tleSB0byBlbmQgb2YgdGhlIGxpc3QqLwotCQlxdWV1ZS5hZGQoa2V5KTsKLQkJCi0JCXJldHVybiBNYXRoLmFicyggb3JpZ2luYWxTaXplIC0gZ2V0T3B0aW1hbFNpemUoKSApID4gTk9USUNFQUJMRV9DSEFOR0U7Ci0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9wdGltYWwgc2l6ZSBpcyBhbiBpbnRlZ2VyIGZyb20gW3tAdmFsdWUgI01JTklNVU1fT1BUSU1BTF9TSVpFfSwge0B2YWx1ZSAjTUVNT1JZX1RIUkVTSEhPTER9XS4gCi0JICogCi0JICogQHJldHVybiB0aGUgb3B0aW1hbCBzaXplIGZvciB0aGUgTFJVIENhY2hlLiAgCi0JICovCi0JcHVibGljIGludCBnZXRPcHRpbWFsU2l6ZSgpIHsJCQotCQlyZXR1cm4gdW5pcXVlc01hcC5zaXplKCkgPiBNSU5JTVVNX09QVElNQUxfU0laRSA/IHVuaXF1ZXNNYXAuc2l6ZSgpIDogTUlOSU1VTV9PUFRJTUFMX1NJWkU7Ci0JfQotCi19CQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmM2YjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHQgZXh0ZW5kcyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBpbXBsZW1lbnRzIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0KLQlwcml2YXRlIE1hcCByZWFkT25seU1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgZWRpdGFibGVNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgcmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZmFsc2U7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQjaW5pdGlhbGl6ZVJlc291cmNlU2V0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlzdXBlci5pbml0aWFsaXplUmVzb3VyY2VTZXQoYVJlc291cmNlU2V0KTsKLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWcgPSBuZXcgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpOwotCQlyZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIGZhY3RvcnkpOwotCQkvLyBhZGQgeG1pIGJlY2F1c2Ugb3RoZXIgcGx1Z2lucyBhcmUgcmVnaXN0ZXJpbmcgaXQgZ2xvYmFsbHkKLQkJcmVnLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieG1pIiwgZmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQKLQkJYVJlc291cmNlU2V0LnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZyk7Ci0JCWFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKS5hZGRFeHRlbmRlcih0aGlzKTsgLy8gYWRkZWQgc28gd2UgY2FuIGJlIGluZm9ybWVkIG9mIGNsb3NlcwotCQkvLyB0byB0aGUgcHJvamVjdC4KLQkJc3RhcnRMaXN0ZW5pbmdUb1Jlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKLQkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEV4aXN0aW5nRWRpdE1vZGVsKGVkaXRNb2RlbElELCBwYXJhbXMsIGZhbHNlKTsKLQkJaWYgKG51bGwgPT0gZWRpdE1vZGVsKSB7Ci0JCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBwYXJhbXMpOwotCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkgfHwgZWRpdE1vZGVsLmlzRGlzcG9zaW5nKCkpIHsKLQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKLQkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKLQkgKiAKLQkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKLQkgKiAgICAgICAgbW9kZWwuCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCXRyeSB7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RXhpc3RpbmdFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIHBhcmFtcywgdHJ1ZSk7Ci0JCQlpZiAobnVsbCA9PSBlZGl0TW9kZWwpIHsKLQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCQkJRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuZ2V0SW5zdGFuY2UoKS5hY2Nlc3MoZWRpdE1vZGVsKTsKLQkJCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWRpdE1vZGVsLmlzRGlzcG9zZWQoKSB8fCBlZGl0TW9kZWwuaXNEaXNwb3NpbmcoKSkgewotCQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQkJfQotCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkuYWNjZXNzKGVkaXRNb2RlbCk7Ci0JCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlZGl0TW9kZWw7Ci0JCX0gZmluYWxseSB7Ci0JCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLm9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKLQkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKLQkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKLQkgKiAKLQkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKLQkgKiAgICAgICAgbW9kZWwuCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RXhpc3RpbmdFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKLQkJCWlmIChpc1JlYWRPbmx5KSB7Ci0JCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcmVhZE9ubHlNb2RlbHMuZ2V0KGdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcykpOwotCQkJfSBlbHNlIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRhYmxlTW9kZWxzLmdldChnZXRDYWNoZUlEKGVkaXRNb2RlbElELCBwYXJhbXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlYWQtb25seSBKMkVFRWRpdE1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgdGhpcywgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEoyRUVFZGl0TW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIHRoaXMsIHBhcmFtcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDEyOjI1OjM5IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZUVkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsLCBNYXAgcGFyYW1zKSB7Ci0JCWVkaXRNb2RlbC5zZXRQYXJhbXMocGFyYW1zKTsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKGVkaXRNb2RlbC5pc1JlYWRPbmx5KCkpCi0JCQkJcmVhZE9ubHlNb2RlbHMucHV0KGdldENhY2hlSUQoZWRpdE1vZGVsLmdldEVkaXRNb2RlbElEKCksIHBhcmFtcyksIGVkaXRNb2RlbCk7Ci0JCQllbHNlCi0JCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCQllZGl0YWJsZU1vZGVscy5wdXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgcGFyYW1zKSwgZWRpdE1vZGVsKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkQWxsRWRpdE1vZGVscygpIHsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCUNvbGxlY3Rpb24gcmVhZE9ubHkgPSByZWFkT25seU1vZGVscy52YWx1ZXMoKTsKLQkJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUFsbENhY2hlZChyZWFkT25seSk7Ci0JCQkJZGlzY2FyZE1vZGVscyhyZWFkT25seSk7Ci0JCQkJZGlzY2FyZE1vZGVscyhlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNjYXJkTW9kZWxzKENvbGxlY3Rpb24gZWRpdE1vZGVscykgewotCQlpZiAoZWRpdE1vZGVscyAhPSBudWxsICYmICFlZGl0TW9kZWxzLmlzRW1wdHkoKSkgewotCQkJLy8gTWFrZSBhIGNvcHkgZm9yIHNhZmV0eSBhZ2FpbnN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQlJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWRpdE1vZGVscykuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkoKEVkaXRNb2RlbCkgaXQubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TW9kZWwoRWRpdE1vZGVsIGVkaXRNb2RlbCwgYm9vbGVhbiByZWFkT25seSkgewotCQkvLyBUaGUgYmVzdCB3YXkgd291bGQgYmUgdG8gcmVjb21wdXRlIHRoZSBjYWNoZSBpZCwgYnV0IHdlIGRvbid0IGNhcmUKLQkJLy8gYmVjYXVzZSB0aGUgZWRpdCBtb2RlbCBzaG91bGQgb25seSBiZSBjYWNoZWQgb25jZSBhbnl3YXkKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXJlYWRPbmx5TW9kZWxzLnZhbHVlcygpLnJlbW92ZShlZGl0TW9kZWwpOwotCQkJZWxzZQotCQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQkJZWRpdGFibGVNb2RlbHMudmFsdWVzKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RWRpdE1vZGVscyhFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChhbkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKLQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQlhTGlzdC5hZGRBbGwocmVhZE9ubHlNb2RlbHMudmFsdWVzKCkpOwotCQkJCWFMaXN0LmFkZEFsbChlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgYUxpc3QuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQllZGl0TW9kZWwucmVzb3VyY2VDaGFuZ2VkKGFuRXZlbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJcmV0dXJuICF0aGlzLnJlYWRPbmx5TW9kZWxzLmlzRW1wdHkoKSB8fCAhdGhpcy5lZGl0YWJsZU1vZGVscy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBnZXRSZXNvdXJjZVNldExpc3RlbmVyKCkgewotCQlpZiAocmVzb3VyY2VTZXRMaXN0ZW5lciA9PSBudWxsKQotCQkJcmVzb3VyY2VTZXRMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCk7Ci0JCXJldHVybiByZXNvdXJjZVNldExpc3RlbmVyOwotCX0KLQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIEBzZWUgQWRhcHRlciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLAotCQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCQlhZGRlZFJlc291cmNlKChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJcmVtb3ZlZFJlc291cmNlcygoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZGVkUmVzb3VyY2UoUmVzb3VyY2UgYWRkZWRSZXNvdXJjZSkgewotCQlpZiAoZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgJiYgKGFkZGVkUmVzb3VyY2UgIT0gbnVsbCkgJiYgKGFkZGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpKQotCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFkZGVkUmVzb3VyY2UpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQlpZiAoc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpKSB7Ci0JCQlFZGl0TW9kZWxFdmVudCBldmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSwgbnVsbCk7Ci0JCQlldmVudC5hZGRSZXNvdXJjZShhZGRlZFJlc291cmNlKTsKLQkJCW5vdGlmeUVkaXRNb2RlbHMoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZFJlc291cmNlKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSkgewotCQlpZiAoc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpKSB7Ci0JCQlFZGl0TW9kZWxFdmVudCBldmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFLCBudWxsKTsKLQkJCWV2ZW50LmFkZFJlc291cmNlKHJlbW92ZWRSZXNvdXJjZSk7Ci0JCQlub3RpZnlFZGl0TW9kZWxzKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWRSZXNvdXJjZXMoTGlzdCByZW1vdmVkUmVzb3VyY2VzKSB7Ci0JCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIG51bGwpOwotCQkJZXZlbnQuYWRkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJbm90aWZ5RWRpdE1vZGVscyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvUmVzb3VyY2VTZXQoKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXNldC5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VTZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlciNwcm9qZWN0Q2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkvLyBkZWZhdWx0IG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlciNwcm9qZWN0Q2xvc2VkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2xvc2VkKCkgewotCQlkaXNjYXJkQWxsRWRpdE1vZGVscygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UjY3JlYXRlVVJJQ29udmVydGVyKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCkKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGNyZWF0ZVVSSUNvbnZlcnRlcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoZ2V0UHJvamVjdCgpLCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRlbXB0IHRvIGNyZWF0ZSByZXNvdXJjZSBzZXQgd2l0aCBudWxsIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsKHByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UjZGVsZXRlRmlsZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRmlsZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoKSB7Ci0JCXJldHVybiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoYm9vbGVhbiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSkgewotCQl0aGlzLmRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDEwNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyNSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlbWZ3b3JrYmVuY2hlZGl0IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTbmFwc2hvdF9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNBZGFwdGVyRmFjdG9yeV9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNiZjIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIGNhY2hlIHRoZSByZWNlbnRseSB1c2VkIGVkaXQgbW9kZWxzLiAgTG9hZGluZyBhbmQgdW5sb2FkaW5nIG9mIGVkaXQgbW9kZWxzIGNhbiBiZQotICogY29zdGx5LCBlc3BlY2lhbGx5IGlmIG9wZXJhdGlvbnMgYW5kL29yIHBvc3Qgb3BlcmF0aW9ucyBoYXZlIGEgbmVlZCB0byByZWxvYWQgdGhlIHNhbWUgZWRpdCBtb2RlbCByZXBlYXRlZGx5LgotICogVGhpcyB3aWxsIGFsbG93IHRob3NlIHJlcGVhdGVkbHkgdXNlZCBlZGl0IG1vZGVscyB0byBiZSBjYWNoZWQsIHRoZXJlYnkgaW1wcm92aW5nIHBlcmZvcm1hbmNlLiAgQnkgZGVzaWduLCB0aGUKLSAqIGVkaXQgbW9kZWxzIGxvYWQgcmVzb3VyY2VzIGFuZCB0aGVzZSByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBtZW1vcnksIHNvIHdlIGRvbid0IHdhbnQgdG8gY2FjaGUgZXZlcnkgZWRpdAotICogbW9kZWwgYWNjZXNzZWQsIHNvIHRoaXMgaXMgYSBsZWFzdCB1c2VkIGNhY2hlIG1lY2hhbmlzbSwgd2hlcmUgdGhlIG1heCBzaXplIGlzIDEwLiAgSWYgYW4gZWRpdCBtb2RlbCBpcyB1c2VkCi0gKiBpdCBpcyBwdXQgdG8gdGhlIGJhY2sgb2YgdGhlIHN0YWNrLCBhbmQgbmV3IGVkaXQgbW9kZWxzIGFjY2Vzc2VkIGFyZSBwdXQgdG8gdGhlIGJhY2sgb2YgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZQotICogdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgZmlyc3QgZWRpdCBtb2RlbCBkaXNwb3NlZCB3aGVuIHRoZSBjYWNoZSBpcyBoaWdoZXIgdGhhbiB0aGUgdGhyZXNoaG9sZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSB7Ci0JCi0JLyoqCi0JICogUHJvdmlkZSBhIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBJTlNUQU5DRSA9IG5ldyBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSgpOwkKLQkKLQkvKioKLQkgKiBUaGUgdGhyZXNob2xkLCBvciBtb3N0IGVkaXQgbW9kZWxzIHdlIHdpbGwga2VlcCBvcGVuIGF0IGEgdGltZSBpcyAxMC4gIFRoaXMgaXMgbG93IGVub3VnaCB0byBub3QKLQkgKiBvdmVyd2hlbG0gd29ya2JlbmNoIG1lbW9yeSBhbmQgaGlnaCBlbm91Z2ggdG8gYWlkIGluIG9wZXJhdGlvbnMgd2hpY2ggY29udGludWFsbHkgcmVsb2FkIDMtNCAKLQkgKiBlZGl0IG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgdGhyZXNoaG9sZCA9IDEwOwotCQotCS8qKgotCSAqICBBIExIUyBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpcyBtYWludGFpbmVkLiBPdGhlcgotCSAqIFNldCBpbXBsZW1lbnRhdGlvbnMgKEhhc2hTZXQsIFRyZWVTZXQpIGRvIG5vdCBwcmVzZXJ2ZSB0aGUgb3JkZXIuIFRoaXMgCi0JICogaXMgY3JpdGljYWwgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBETyBOT1QgQ0hBTkdFIFRISVMuIAotCSAqLwotCXByaXZhdGUgTGlua2VkSGFzaFNldCBscnUgPSBuZXcgTGlua2VkSGFzaFNldCh0aHJlc2hob2xkKTsKLQkKLQkvKioKLQkgKiBBY2Nlc3NvciBmb3IgdGhlIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIElOU1RBTkNFCi0JICogCi0JICogQHJldHVybiB0aGUgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgSU5TVEFOQ0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGxydSB0aGF0IGFyZSBjb250YWluZWQKLQkgKiBpbiA8Y29kZT5hQ29sbGVjdGlvbjwvY29kZT4uICBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZQotCSAqIEVkaXRNb2RlbHMgaW4gdGhlIGFDb2xsZWN0aW9uIHdpbGwgYmUgZGlzY2FyZGVkIGFuZCBpdAotCSAqIHdpbGwgbm90IGF0dGVtcHQgdG8gZGVjcmVtZW10IGl0cyByZWZlcmVuY2UgY291bnQuCi0JICogQHBhcmFtIGFDb2xsZWN0aW9uIC0gQSB7QGxpbmsgQ29sbGVjdGlvbn0gb2Yge0BsaW5rIEVkaXRNb2RlbH0uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsQ2FjaGVkKENvbGxlY3Rpb24gYUNvbGxlY3Rpb24pIHsKLQkJaWYgKGFDb2xsZWN0aW9uICE9IG51bGwpIHsgCi0JCQlscnUucmVtb3ZlQWxsKGFDb2xsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIHtAbGluayBFZGl0TW9kZWx9IGlzIGJlaW5nIGFjY2Vzc2VkIHNvIHdlIHdpbGwgd2FudAotCSAqIHRvIHVwZGF0ZSB0aGUgbHJ1IGFuZCBhY2Nlc3MgdGhlIGVkaXRNb2RlbCB3aGljaCB3aWxsIGhvbGQKLQkgKiBhIHJlZmVyZW5jZSBjb3VudC4KLQkgKiBAcGFyYW0gZWRpdE1vZGVsIC0gVGhlIHtAbGluayBFZGl0TW9kZWx9IHRoYXQgd2Ugd2FudCB0byBwbGFjZQotCSAqIAlpbiB0aGUgbGVhc3QgdXNlZCBjYWNoZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlib29sZWFuIHNob3VsZEFjY2VzcyA9IHRydWU7Ci0JCXN5bmNocm9uaXplZCAobHJ1KSB7Ci0JCQlpZiAobHJ1LmNvbnRhaW5zKGVkaXRNb2RlbCkpIHsKLQkJCQltb3ZlVG9FbmQoZWRpdE1vZGVsKTsKLQkJCQlzaG91bGRBY2Nlc3MgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoc2hvdWxkQWNjZXNzKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxydSkgewotCQkJCWVkaXRNb2RlbC5hY2Nlc3ModGhpcyk7Ci0JCQkJbHJ1LmFkZChlZGl0TW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHdlIGhpdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGxydSB0aGVuIHJlbW92ZSB0aGUgZmlyc3Qgb25lCi0JICogYW5kIHJlbGVhc2UgYWNjZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIG9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCkgewotCQlFZGl0TW9kZWwgbW9kZWwgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGxydSkgewotCQkJaWYgKGxydS5zaXplKCkgPiB0aHJlc2hob2xkKSB7Ci0JCQkJLy8gcmVtb3ZlIG9sZGVzdCBlbGVtZW50IGFuZCByZWxlYXNlIHRoZSBlZGl0IG1vZGVsLgotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbHJ1Lml0ZXJhdG9yKCk7Ci0JCQkJbW9kZWwgPSAoRWRpdE1vZGVsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbHJ1LnJlbW92ZShtb2RlbCk7CQotCQkJCX0KLQkJCX0KLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZSB0aGUgZWRpdE1vZGVsIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgCi0JICogQHBhcmFtIGVkaXRNb2RlbCAtLSBFZGl0TW9kZWwgdG8gYmUgbW92ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVRvRW5kKEVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKLQkJbHJ1LnJlbW92ZShlZGl0TW9kZWwpOwotCQlscnUuYWRkKGVkaXRNb2RlbCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlBhY2thZ2VQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTk0MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKHJlY2VpdmVyID09IG51bGwgfHwgIShyZWNlaXZlciBpbnN0YW5jZW9mIEVPYmplY3QpIHx8IGV4cGVjdGVkVmFsdWUgPT0gbnVsbCB8fCAhKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHJlY2VpdmVyOwotCQlTdHJpbmcgZW1mUGFja2FnZSA9IChTdHJpbmcpZXhwZWN0ZWRWYWx1ZTsKLQkJcmV0dXJuIGVtZlBhY2thZ2UuZXF1YWxzKGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZWYWxpZGF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWY0MmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcjsKLQotCi0vKioKLSAqIEVtZiB2YWxpZGF0aW9uIGV4dGVuc2lvbiBmb3IgdmFsYWRpdGVtZW51YWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWZWYWxpZGF0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFbWZWYWxpZGF0aW9uSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI2dldEJhc2VWYWxpZGF0aW9uVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0QmFzZVZhbGlkYXRpb25UeXBlKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBzZWxlY3Rpb247Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlc291cmNlKTsKLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI3NldFZhbGlkYXRpb25UeXBlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKSB7Ci0JCXRoaXMudmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9QYXNzdGhydVJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9QYXNzdGhydVJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjM2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvUGFzc3RocnVSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci0KLS8qKgotICogVGhpcyBSZXNvdXJjZVNldCBpcyB0byBiZSB1c2VkIGJ5IHBsdWdpbnMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRpbmcgdG8gYSBjYWNoZWQgUmVzb3VyY2VTZXQgdGhhdAotICogYWx3YXlzIGxvYWRzIHJlbGF0aXZlIHRvIHRoZSBXb3JrYmVuY2guIFRoaXMgUmVzb3VyY2VTZXQgd2lsbCBkaXJlY3QgdGhlIGxvYWRzIHRvIHRoZSBhcHByb3ByaWF0ZQotICogUHJvamVjdCBSZXNvdXJjZVNldC4gSXQgd2lsbCBvbmx5IGxvYWQgaW4gdGhpcyBSZXNvdXJjZVNldCBpZiBpdCB3YXMgdW5hYmxlIHRvIGxvYWQgdmlhIHRoZQotICogV29ya3NwYWNlLgotICogCi0gKiBJZiB5b3Ugc2V0IHdhbnQgdG8gdXNlZCB0aGlzIFJlc291cmNlU2V0IHNvIHRoYXQgdGhlIGxvYWRlZCByZXNvdXJjZXMgYXJlIGlzb2xhdGVkIGZyb20gZXZlcnlvbmUKLSAqIGVsc2UsIHlvdSBzaG91bGQgdXNlIHRoZQotICogCi0gKiBAbGluayBQYXNzdGhydVJlc291cmNlU2V0KElQcm9qZWN0KSBjb25zdHJ1Y3Rvci4gVGhpcyB3aWxsIGxvYWQgYWxsIHJlc291cmNlcyBsb2NhbGx5IGFuZCBpdCB3aWxsCi0gKiAgICAgICBub3QgZGVsZWdhdGUgdG8gYW5vdGhlciBQcm9qZWN0UmVzb3VyY2VTZXQuIFRoaXMgd291bGQgYmUgZXF1aXZhbGVudCB0byBjcmVhdGluZyBhCi0gKiAgICAgICBQcm9qZWN0UmVzb3VyY2VTZXQgd2l0aG91dCBzZXR0aW5nIGFueSBoYW5kbGVycy4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFBhc3N0aHJ1UmVzb3VyY2VTZXQgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0lzb2xhdGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgY2xhc3MgUGFzc3RocnVSZXNvdXJjZXNFTGlzdCBleHRlbmRzIFJlc291cmNlU2V0SW1wbC5SZXNvdXJjZXNFTGlzdCB7Ci0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KCgoUmVzb3VyY2UpIG9iamVjdCkuZ2V0VVJJKCkpOwotCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKChSZXNvdXJjZSlvYmplY3QpOwotCi0JCQlyZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7Ci0JCX0KLQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCVJlc291cmNlIHJlczsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jYWNoZVJlc291cmNlKHJlcykpCi0JCQkJCXN1cGVyLmFkZChyZXMpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJaXNJc29sYXRlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBSZXNvdXJjZVNldCBpc29sYXRlZCBmcm9tIHRoZQotCSAqIGFjdHVhbCBjYWNoZWQgUHJvamVjdFJlc291cmNTZXQgZm9yIHRoZSBwYXNzZWQgSVByb2plY3QuCi0JICovCi0JcHVibGljIFBhc3N0aHJ1UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlpc0lzb2xhdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lzb2xhdGVkKCkgewotCQlyZXR1cm4gaXNJc29sYXRlZDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSk7IC8vV2UgZG8gd2FudCB0byBjYWxsIHN1cGVyLmNyZWF0ZVJlc291cmNlIGFuZCBub3QKLQkJLy8gZGVtYW5kQ3JlYXRlUmVzb3VyY2UKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBQYXNzdGhydVJlc291cmNlc0VMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkpCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKCFpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2dldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkksIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEZyb21IYW5kbGVycyh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTY5ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3MgUkVGRVJFTkNFRF9SRVNfQ0xBU1MgPSBSZWZlcmVuY2VkUmVzb3VyY2UuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQotCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gbmV3IEZpbGVBZGFwdGVyKCk7Ci0JCQlhZGFwdGVyLnNldFRhcmdldCh0YXJnZXQpOwotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgYW5kIGlzIHVzZWQgdG8gc3RvcmUgc3RhdGUgb24gdGhlIHJlc291cmNlLCBzcGVjaWZpY2FsbHksIGEgY2FjaGVkCi0JICogcmVmZXJlbmNlIHRvIHRoZSBJRmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBBREFQVEVSX0tFWSA9IEZpbGVBZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBkZWxheSA9IDMwOwotCQlwcml2YXRlIElGaWxlIGZpbGU7Ci0JCXByaXZhdGUgbG9uZyBzeW5jaHJvbml6YXRpb25TdGFtcDsKLQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHByZXZpb3VzUmVzb3VyY2VTZXQ7Ci0JCXByaXZhdGUgSUxvY2sgc2F2ZUxvY2s7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfTk9UX0xPQURFRCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfSU5BQ0NFU1NJQkxFID0gLTE7Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIEFEQVBURVJfS0VZLmVxdWFscyh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIFVwZGF0ZSB0aGUgc3luY2hyb25pemF0aW9uIHN0YW1wIHdoZXJlIGFwcHJvcHJpYXRlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCi0JCQkJCQloYW5kbGVMb2FkZWQoKTsKLQkJCQkJZWxzZQotCQkJCQkJaGFuZGxlVW5sb2FkZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRToKLQkgICAgICAgICAgICAgICAgaGFuZGxlQWJvdXRUb1NhdmUoKTsKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfV0FTX1NBVkVEOgotCSAgICAgICAgICAgICAgICBoYW5kbGVTYXZlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9TQVZFX0ZBSUxFRDoKLQkgICAgICAgICAgICAgICAgaGFuZGxlU2F2ZUZhaWxlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19VUkkgOgotCQkJCQloYW5kbGVVUklDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKCkgewotICAgICAgICAgICAgcmVsZWFzZVNhdmVMb2NrKCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgICAgIGFxdWlyZVNhdmVMb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXF1aXJlU2F2ZUxvY2soKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZU5hbWU6ICIgKyBnZXRGaWxlKCkuZ2V0TmFtZSgpICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jazogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aCIgKyBnZXRTYXZlTG9jaygpLmdldERlcHRoKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlOiIrZ2V0U2F2ZUxvY2soKS5oYXNoQ29kZSgpKTsKLS8vICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGdldFNhdmVMb2NrKCkuYWNxdWlyZSgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXF1aXJlU2F2ZUxvY2sobG9uZyBkZWxheSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jayB3aXRoIGRlbGF5OiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHRoIiArIGdldFNhdmVMb2NrKCkuZ2V0RGVwdGgoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2U6IitnZXRTYXZlTG9jaygpLmhhc2hDb2RlKCkpOwotLy8gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0U2F2ZUxvY2soKS5hY3F1aXJlKGRlbGF5KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VTYXZlTG9jaygpIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlbGVhc2VkU2F2ZUxvY2s6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVwdGgiICsgZ2V0U2F2ZUxvY2soKS5nZXREZXB0aCgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZToiK2dldFNhdmVMb2NrKCkuaGFzaENvZGUoKSk7Ci0vLyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBnZXRTYXZlTG9jaygpLnJlbGVhc2UoKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJTG9jayBnZXRTYXZlTG9jaygpIHsKLSAgICAgICAgICAgIGlmIChzYXZlTG9jayA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNhdmVMb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLSAgICAgICAgICAgIHJldHVybiBzYXZlTG9jazsKLSAgICAgICAgfQotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlVVJJQ2hhbmdlZCgpIHsKLQkJCWZpbGUgPSBudWxsOwotCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX05PVF9MT0FERUQ7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCS8vRmlyc3QgdGVzdCB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWxlLgotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAoIWZpbGUuaXNBY2Nlc3NpYmxlKCkgfHwgcHJldmlvdXNSZXNvdXJjZVNldCAhPSBnZXRSZXNvdXJjZVNldCgpKSkgewotCQkJCWZpbGUgPSBudWxsOwotCQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gRklMRV9OT1RfTE9BREVEOwotCQkJfQotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0VVJJKCkpKSB7Ci0JCQkJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoZ2V0VVJJKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vd2Ugc2hvdWxkIG5vdCBiZSBoZXJlIGFueW1vcmUuCi0JCQkJCWZpbGUgPSBpbnRlcm5hbEdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCWlmKG51bGwhPSBmaWxlICYmICFmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX0lOQUNDRVNTSUJMRTsKLQkJCQl9Ci0JCQkJcHJldmlvdXNSZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBzeW5jaHJvbml6YXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZmlsZQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBsCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25TdGFtcChsb25nIGwpIHsKLQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc0NvbnNpc3RlbnQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50KCkgewotCQkJLy9UaGlzIGNoZWNrcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHJlc291cmNlIGhhc24ndCBmaW5pc2hlZCBzYXZpbmcgZm8gdGhlIGZpcnN0IHRpbWUKLQkJCWlmKCFnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGhhc0xvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYXNMb2NrZWQgPSBhcXVpcmVTYXZlTG9jayhkZWxheSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0RmlsZSgpID09IG51bGwgfHwgIWdldEZpbGUoKS5pc0FjY2Vzc2libGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRGaWxlKCkuaXNTeW5jaHJvbml6ZWQoSUZpbGUuREVQVEhfWkVSTykpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzeW5jaHJvbml6YXRpb25TdGFtcCA9PSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTG9ja2VkKQotICAgICAgICAgICAgICAgICAgICByZWxlYXNlU2F2ZUxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGdldEZpbGUoKSkpOwotCQl9Ci0KLQkJcHVibGljIFJlZmVyZW5jZWRSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJCXJldHVybiAoUmVmZXJlbmNlZFJlc291cmNlKSB0YXJnZXQ7Ci0JCX0KLQotCQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJCXJldHVybiB0YXJnZXQgPT0gbnVsbCA/IG51bGwgOiBnZXRSZXNvdXJjZSgpLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIHRhcmdldCA9PSBudWxsID8gbnVsbCA6IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVVubG9hZGVkKCkgewotCQkJZmlsZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfTk9UX0xPQURFRDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUxvYWRlZCgpIHsKLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVkKCkgewotCQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCQkJcmVsZWFzZVNhdmVMb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIGJ5IHRoZSBwbHVnaW4gb25seQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZUZpbGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKCFmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCkgewotCQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KG5ldyBGaWxlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGdldEZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IChGaWxlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZXMsIEZpbGVBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUZpbGVBZGFwdGVyKHJlcykgOiBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOwotCQlhZGFwdGVyLnNldFRhcmdldChyZXMpOwotCQlyZXMuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZpbGUgZm9yIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUKLQkgKiByZXNvdXJjZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQgOiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN5bmhyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlcywgbG9uZyBzdGFtcCkgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoc3RhbXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJcmV0dXJuIGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQ29uc2lzdGVudCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlc291cmNlKSB7Ci0JCWlmIChyZWZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVmUmVzb3VyY2UpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPD0gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEKQotCQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlZlJlc291cmNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBSRUZFUkVOQ0VEX1JFU19DTEFTUy5pc0luc3RhbmNlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlc291cmNlKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IEZpbGVBZGFwdGVyLkZJTEVfTk9UX0xPQURFRCA6IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChhZGFwdGVyLmdldEZpbGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEOwotCQlpZighZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9JTkFDQ0VTU0lCTEU7Ci0JCX0KLQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCUlQYXRoIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJcmV0dXJuIGN1cnJlbnRTdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIHRoYXQgY3VycmVudGx5IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChpc1JlZmVyZW5jZWRSZXNvdXJjZShhUmVzb3VyY2UpKQotCQkJCXJldHVybiBnZXRGaWxlKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW50ZXJuYWxHZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVJlc291cmNlIG1vZlJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQlpZiAobW9mUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RmlsZShtb2ZSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9yIGxvYWQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgY3JlYXRlIG9uZSBpZiBpdCBpcyBub3QgZm91bmQuIEEgV3JhcHBlZEV4Y2VwdGlvbiB3aWxsIG9ubHkKLQkgKiBiZSB0aHJvd24gaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBleGlzdHMgYnV0IGl0IGZhaWxlZCB0byBsb2FkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsgLy90aGlzIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZSBubyBtYXR0ZXIgd2hhdAotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKGUpKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZVByb2plY3QoUmVzb3VyY2UgcmVzb3VyY2VBLCBSZXNvdXJjZSByZXNvdXJjZUIpIHsKLQkJSVByb2plY3QgcEEsIHBCOwotCQlwQSA9IGdldFByb2plY3QocmVzb3VyY2VBKTsKLQkJcEIgPSBnZXRQcm9qZWN0KHJlc291cmNlQik7Ci0JCWlmIChwQSAhPSBudWxsICYmIHBCICE9IG51bGwpCi0JCQlyZXR1cm4gcEEuZXF1YWxzKHBCKTsKLQkJLy9vdGhlcndpc2Ugd2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm8gdG8gZGV0ZXJtaW5lIGZhbHNlIHNvIHdlIG11c3QgcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlcykgewotCQlJUHJvamVjdCBwcm9qID0gZ2V0UHJvamVjdChyZXMuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChwcm9qID09IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXByb2ogPSBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvajsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBjbGllbnRzIHRoYXQgYWxzbyBjYWxsCi0JICogZ2V0RmlsZSguLi4pLiBUaGlzIGlzIHRvIGF2b2lkIGVuZGxlc3MgbG9vcHMuCi0JICogCi0JICogQHNlZSBnZXRGaWxlKFJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgaW50ZXJuYWxHZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RmlsZShhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSwgYVJlc291cmNlLmdldFVSSSgpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGUoUmVzb3VyY2VTZXQgc2V0LCBVUkkgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlyZXR1cm4gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShJUHJvamVjdCBwcm9qZWN0LCBVUkkgdXJpKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQlyZXR1cm4gZ2V0RmlsZShzZXQsIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHNhdmUgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB3aXRoaW4gdGhlIElQcm9qZWN0Ci0JICogdGhhdCBpdCBpcyBjdXJyZW50bHkgcmVzaWRpbmcgYnV0IHlvdSBkbyBub3Qgd2FudCB0byBzYXZlIGl0IGluIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbi4KLQkgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBhcGkgdG8gc2F2ZSBhIFJlc291cmNlIHRvIGFuIGV4aXN0aW5nIGZpbGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBhcGkgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggdGhlIGFic29sdXRlCi0JICogICAgICAgICAgICAgcGF0aCAocGxhdGZvcm06L3Jlc291cmNlLy4uLikuIFVwb24gc2F2ZSwgdGhlIGZpbGUgd2lsbCBiZSBzYXZlZCB0byB0aGlzCi0JICogICAgICAgICAgICAgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVSZXNvdXJjZVRvRmlsZShSZXNvdXJjZSBhUmVzb3VyY2UsIElGaWxlIGFGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNhdmVSZXNvdXJjZVRvRmlsZShhUmVzb3VyY2UsIGFGaWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gc2F2ZSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHdpdGhpbiB0aGUgSVByb2plY3QKLQkgKiB0aGF0IGl0IGlzIGN1cnJlbnRseSByZXNpZGluZyBidXQgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgaXQgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgotCSAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGFwaSB0byBzYXZlIGEgUmVzb3VyY2UgdG8gYW4gZXhpc3RpbmcgZmlsZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGFwaSBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCB0aGUgYWJzb2x1dGUKLQkgKiAgICAgICAgICAgICBwYXRoIChwbGF0Zm9ybTovcmVzb3VyY2UvLi4uKS4gVXBvbiBzYXZlLCB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvIHRoaXMKLQkgKiAgICAgICAgICAgICBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlVG9GaWxlKFJlc291cmNlIGFSZXNvdXJjZSwgSUZpbGUgYUZpbGUsIE1hcCBzYXZlT3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhRmlsZSAhPSBudWxsICYmICFhRmlsZS5leGlzdHMoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHsKLQkJCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIHdiQ29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnY7Ci0JCQkJCVN0cmluZyB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQkJSVBhdGggcmVzUGF0aCwgZmlsZVBhdGg7Ci0JCQkJCXJlc1BhdGggPSBuZXcgUGF0aCh1cmkpOwotCQkJCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJaW50IHJlc0NvdW50LCBmaWxlQ291bnQ7Ci0JCQkJCXJlc0NvdW50ID0gcmVzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJZmlsZUNvdW50ID0gZmlsZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCWlmIChyZXNDb3VudCA8PSBmaWxlQ291bnQpIHsKLQkJCQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmaWxlQ291bnQgLSByZXNDb3VudCk7Ci0JCQkJCQlpZiAocmVzUGF0aC5lcXVhbHMoZmlsZVBhdGgpKSB7Ci0JCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gd2JDb252LmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS50b1N0cmluZygpKSk7Ci0JCQkJCQkJaWYgKG9zICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWFSZXNvdXJjZS5zYXZlKG9zLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlvcy5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSUZpbGUgYUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCi0JCQlhRmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlCi0JICogCi0JICogQGFSZXNvdXJjZSBpbiB0aGUgV29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZGVsZXRlRmlsZShnZXRGaWxlKGFSZXNvdXJjZSkpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIxNTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjYsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZVVSSSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCXByaXZhdGUgU2V0IHZpZXdJRHMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgaW50IGxvYWRPcmRlcjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlciA9IDA7Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCi0JCXBhY2thZ2VVUkkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LlBBQ0tBR0VfVVJJKTsKLQkJaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LklEKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChwYWNrYWdlVVJJLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8wKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMSwgbmV3IE9iamVjdFtde2VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCl9KSk7Ci0KLQkJcmVhZFZpZXdJRHMoKTsKLQkJdGhpcy5sb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXNiLmFwcGVuZChwYWNrYWdlVVJJKTsKLQkJc2IuYXBwZW5kKCIscCIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRQcmlvcml0eSgpKTsKLQkJaWYgKHZpZXdJRHMgIT0gbnVsbCAmJiAhdmlld0lEcy5pc0VtcHR5KCkpIHsKLQkJCXNiLmFwcGVuZCgnOicpOwotCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gdmlld0lEcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgnXScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFZpZXdJRHMoKSB7Ci0JCXZpZXdJRHMgPSBuZXcgSGFzaFNldCgzKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuVklFVyk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB2aWV3SUQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aWV3SUQgPSBjaGlsZHJlbltpXS5nZXRBdHRyaWJ1dGUoQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5JRCk7Ci0JCQlpZiAodmlld0lEICE9IG51bGwpCi0JCQkJdmlld0lEcy5hZGQodmlld0lEKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVJbnN0YW5jZSgpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl0cnkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVVJJKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFZpZXdJRHMoKSB7Ci0JCXJldHVybiB2aWV3SURzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhTdHJpbmcgdmlld0lEKSB7Ci0JCXJldHVybiB2aWV3SURzLmlzRW1wdHkoKSB8fCB2aWV3SURzLmNvbnRhaW5zKHZpZXdJRCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pCi0JCQlyZXR1cm4gMDsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gMTsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBvOwotCi0JCWludCBwQ29tcGFyZSA9IGdldFByaW9yaXR5KCkgLSBkZXNjLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwQ29tcGFyZSAhPSAwKQotCQkJLy9XZSBoYXZlIHJldmVyc2UgdGhlIHNvcnRpbmcgb2YgdGhlIHByaW9yaXR5IGZvciB0aGUgYWRhcHRlciBmYWN0b3JpZXMKLQkJCXJldHVybiAtcENvbXBhcmU7Ci0KLQkJLy9UaGUgZ3JvdXAgaXMgdGhlIHNhbWUgLSBpbiB0aGlzIGNhc2UgdGhlIG9uZSBmb3IgYSBzcGVjaWZpYyB2aWV3IGhhcyBwcmVjZWRlbmNlIG92ZXIKLQkJLy9hIGdlbmVyaWMgb25lCi0JCWVsc2UgaWYgKHZpZXdJRHMgIT0gbnVsbCAmJiAhdmlld0lEcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldElEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRPcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTg2OTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9GQUNUT1JZID0gImFkYXB0ZXJGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9VUkkgPSAicGFja2FnZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFVyA9ICJ2aWV3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBkZXNjcmlwdG9yTWFwID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2U7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uSUQsIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uQURBUFRFUl9GQUNUT1JZX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRvcnMoRVBhY2thZ2UgcGtnLCBTdHJpbmcgdmlld0lEKSB7Ci0JCUNvbGxlY3Rpb24gYWxsID0gZ2V0RGVzY3JpcHRvcnMocGtnKTsKLQkJaWYgKGFsbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGFsbC5pdGVyYXRvcigpOwotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChhbGwuc2l6ZSgpKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlkZXNjID0gKEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5hcHBsaWVzVG8odmlld0lEKSkKLQkJCQlyZXN1bHQuYWRkKGRlc2MpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGVzY3JpcHRvcnMoRVBhY2thZ2UgcmVnaXN0ZXJlZFBhY2thZ2UpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uKSBnZXREZXNjcmlwdG9yTWFwKCkuZ2V0KHJlZ2lzdGVyZWRQYWNrYWdlLmdldE5zVVJJKCkpOwotCX0KLQotCXByaXZhdGUgTWFwIGdldERlc2NyaXB0b3JNYXAoKSB7Ci0JCWlmIChkZXNjcmlwdG9yTWFwID09IG51bGwpCi0JCQlkZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhBREFQVEVSX0ZBQ1RPUlkpKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJCW1hcERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYXBEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyB1cmkgPSBkZXNjcmlwdG9yLmdldFBhY2thZ2VVUkkoKTsKLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycyA9IChDb2xsZWN0aW9uKSBnZXREZXNjcmlwdG9yTWFwKCkuZ2V0KHVyaSk7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBUcmVlU2V0KCk7Ci0JCQlnZXREZXNjcmlwdG9yTWFwKCkucHV0KHVyaSwgZGVzY3JpcHRvcnMpOwotCQl9Ci0JCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBpbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2hpbGRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NoaWxkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVjNDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2hpbGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTc6NTYgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENoaWxkQ29tbWFuZCBleHRlbmRzIEVkaXRNb2RlbENvbW1hbmQgewotCXByaXZhdGUgUGFyZW50Q29tbWFuZCBwYXJlbnQ7Ci0JcHJpdmF0ZSBFZGl0TW9kZWxSZXRyaWV2ZXIgbW9kZWxSZXRyaWV2ZXI7Ci0KLQlwdWJsaWMgQ2hpbGRDb21tYW5kKFBhcmVudENvbW1hbmQgcGFyZW50Q21kLCBDb21tYW5kIHRhcmdldENtZCwgRWRpdE1vZGVsUmV0cmlldmVyIHJldHJpZXZlcikgewotCQlzdXBlcih0YXJnZXRDbWQpOwotCQlwYXJlbnQgPSBwYXJlbnRDbWQ7Ci0JCW1vZGVsUmV0cmlldmVyID0gcmV0cmlldmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vZG9lcyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUluTW9kZWwoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGNtZCkgewotCQlFZGl0TW9kZWwgbW9kZWwgPSBtb2RlbFJldHJpZXZlci5nZXRFZGl0TW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLQkJCW1vZGVsLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA5OjM1OjM2IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEVkaXRNb2RlbEtleSgpIHsKLQkJcmV0dXJuIG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbElEKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgOTozNTozNiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLlBhcmVudENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgUGFyZW50Q29tbWFuZCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkb0luTW9kZWwoKTsKLQkJZ2V0UGFyZW50KCkucmVkb0Zyb20odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVkb0luTW9kZWwoKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0KCkucmVkbygpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG9Jbk1vZGVsKCk7Ci0JCWdldFBhcmVudCgpLnVuZG9Gcm9tKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVuZG9Jbk1vZGVsKCkgewotCQlFZGl0TW9kZWwgbW9kZWwgPSBtb2RlbFJldHJpZXZlci5nZXRFZGl0TW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkJdHJ5IHsKLQkJCWdldFRhcmdldCgpLnVuZG8oKTsKLQkJCW1vZGVsLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMGY4MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgNiwgMjAwMwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50QWNjZXNzUmVnaXN0cnkgewotCi0JcHJvdGVjdGVkIGZpbmFsIFdlYWtIYXNoTWFwIHJlZ2lzdHJ5ID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIGZpbmFsIFNldCBiYXNlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChpc1N0YWJsZSgpKSB7Ci0JCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSkgewotCQkJCVNuYXBzaG90IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KCk7Ci0JCQkJdGhpcy5yZWdpc3RyeS5wdXQoYWNjZXNzb3JLZXksIHNuYXBzaG90KTsKLQkJCQl0aGlzLmJhc2VTZXQuYWRkKHNuYXBzaG90KTsKLQotCQkJfSBlbHNlCi0JCQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMCwgYWNjZXNzb3JLZXkpOwotCi0JCX0gZWxzZQotCQkJY29tcGxhaW4oKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQkvKgotCQkgKiBFcnJvciBjb25kaXRpb246IFNvbWUgb25lIGhhcyBiZWVuIG5hdWdodHkgYW5kIG5vdCByZWxlYXNlZCB0aGUgcmVzb3VyY2UKLQkJICovCi0JCWlmICh0aGlzLnJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSAmJiBpc1N0YWJsZSgpKSB7Ci0JCQlTbmFwc2hvdCBzbmFwc2hvdCA9IChTbmFwc2hvdCkgdGhpcy5yZWdpc3RyeS5yZW1vdmUoYWNjZXNzb3JLZXkpOwotCQkJdGhpcy5iYXNlU2V0LnJlbW92ZShzbmFwc2hvdCk7Ci0JCX0gZWxzZQotCQkJY29tcGxhaW4oYWNjZXNzb3JLZXkpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhc3NlcnRBY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmICghaXNDbGllbnRBY2Nlc3NpbmcoYWNjZXNzb3JLZXkpKQotCQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2xpZW50QWNjZXNzaW5nKE9iamVjdCBjbGllbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGNsaWVudCk7Ci0JCWlmICghaXNTdGFibGUoKSkKLQkJCWNvbXBsYWluKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQW55Q2xpZW50QWNjZXNzaW5nKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRoaXMucmVnaXN0cnkuc2l6ZSgpID4gMDsKLQkJaWYgKCFpc1N0YWJsZSgpKQotCQkJY29tcGxhaW4oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJhc2VTZXQuc2l6ZSgpID09IHRoaXMucmVnaXN0cnkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBsYWluKCkgewotCQljb21wbGFpbihudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wbGFpbihPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKCFpc1N0YWJsZSgpKQotCQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKHRoaXMucmVnaXN0cnksIHRoaXMuYmFzZVNldCk7Ci0JCXRocm93IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8xIiksIGFjY2Vzc29yS2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJDbGllbnRBY2Nlc3NSZWdpc3RyeTogWyIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoKGlzU3RhYmxlKCkpID8gIlNUQUJMRSIgOiAiT1VUIE9GIFNZTkMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlc3VsdC5hcHBlbmQoIl06IFJlZmVyZW5jZSBDb3VudCA9ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodGhpcy5zaXplKCkpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVnaXN0cnkuc2l6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFhMWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUaGUgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24gYWNjZXB0cyBhIFdlYWtIYXNoU2V0IHJlZ2lzdHJ5IGFuZCBhIFNldCBvZiBhbGwgU25hcHNob3RzIHRoYXQKLSAqIHNob3VsZCBiZSBjb250YWluZWQgaW4gdGhlIHJlZ2lzdHJ5LiBJdCB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBzZXQgZGlmZmVyZW5jZSBpbiBvcmRlciB0bwotICogZGV0ZXJtaW5lIHdoaWNoIFNuYXBzaG90cyBleGlzdCBpbiB0aGUgYmFzZVNldCBidXQgbm90IGluIHRoZSByZWdpc3RyeS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFOR0xJTkdfUkVGRVJFTkNFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FDQ0VTU19LRVkgPSAyOwotCXByaXZhdGUgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgU2V0IGJhc2VTZXQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsKLQlwcml2YXRlIGludCB0eXBlID0gVU5LTk9XTjsKLQotCXB1YmxpYyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihXZWFrSGFzaE1hcCByZWdpc3RyeSwgU2V0IGJhc2VTZXQpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl0aGlzLmJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQl0aGlzLmJhc2VTZXQuYWRkQWxsKGJhc2VTZXQpOwotCQl0aGlzLnR5cGUgPSBEQU5HTElOR19SRUZFUkVOQ0U7Ci0JfQotCi0JcHVibGljIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCBrZXkpIHsKLQkJc3VwZXIobXNnICsgIiA6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudHlwZSA9IElOVkFMSURfQUNDRVNTX0tFWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQotCQlzLnByaW50bG4odG9TdHJpbmcoKSk7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQotCQlpZiAodGhpcy5yZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlTbmFwc2hvdCBzbmFwc2hvdCA9IG51bGw7Ci0JCQlpZiAoIXByb2Nlc3NlZCkgewotCQkJCU9iamVjdCBrZXkgPSBudWxsOwotCQkJCUl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gdGhpcy5yZWdpc3RyeS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJa2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwotCQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgdGhpcy5yZWdpc3RyeS5nZXQoa2V5KTsKLQkJCQkJdGhpcy5iYXNlU2V0LnJlbW92ZShzbmFwc2hvdCk7Ci0JCQkJfQotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzLnByaW50bG4oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoYmFzZVNldC5zaXplKCkpLnRvU3RyaW5nKCl9KSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0KLQkJcy5wcmludGxuKHRvU3RyaW5nKCkpOwotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCWlmICh0aGlzLnJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gbnVsbDsKLQkJCWlmICghcHJvY2Vzc2VkKSB7Ci0JCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQkJSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSB0aGlzLnJlZ2lzdHJ5LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LmdldChrZXkpOwotCQkJCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXMucHJpbnRsbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGJhc2VTZXQuc2l6ZSgpKS50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgREFOR0xJTkdfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gIkRBTkdMSU5HX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSU5WQUxJRF9BQ0NFU1NfS0VZIDoKLQkJCQlyZXR1cm4gIklOVkFMSURfQUNDRVNTX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xLCBuZXcgT2JqZWN0W117Z2V0VHlwZSgpfSkpOwotCQkvLwkJaWYgKHRoaXMuYmFkUmVmZXJlbmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkvLwkJCXJlc3VsdC5hcHBlbmQoIlRoZSBpbnZhbGlkIGFjY2VzcyBvY2N1cnJlZCBzb21ld2hlcmUgaW4gdGhlIGZvbGxvd2luZyBzdGFjawotCQkvLyB0cmFjZS4iKS5hcHBlbmQoIlxuIik7Ci0JCS8vCQkJcmVzdWx0LmFwcGVuZCh0aGlzLmJhZFJlZmVyZW5jZUxvY2F0aW9uLmdldFN0YWNrVHJhY2VTdHJpbmcoKSk7Ci0JCS8vCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oInRlc3QgbWVzc2FnZSIsICItc29tZWtleW9iai0iKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkudG9TdHJpbmcoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiLCAiLXNvbWVrZXlvYmotIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxJTkVCUkVBSyIpOyAvLyROT04tTkxTLTEkCi0JCW5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkucHJpbnRTdGFja1RyYWNlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThkMmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Mb2NrTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IHsKLQkKLQkKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTG9ja01hbmFnZXIgbG9ja01hbmFnZXIgPSBuZXcgTG9ja01hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwcm9qZWN0TG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElMb2NrIGdldFByb2plY3RMb2NrT2JqZWN0KElQcm9qZWN0IGFQcm9qZWN0KXsKLQkJaWYobnVsbCA9PSBhUHJvamVjdCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbnRlZ2VyIGhhc2hDb2RlID0gbmV3IEludGVnZXIoYVByb2plY3QuaGFzaENvZGUoKSk7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdExvY2tzKSB7Ci0JCQlJTG9jayBsb2NrID0gKElMb2NrKXByb2plY3RMb2Nrcy5nZXQoaGFzaENvZGUpOwotCQkJaWYobG9jayA9PSBudWxsKXsKLQkJCQlsb2NrID0gbG9ja01hbmFnZXIubmV3TG9jaygpOwotCQkJCXByb2plY3RMb2Nrcy5wdXQoaGFzaENvZGUsIGxvY2spOwotCQkJfQotCQkJcmV0dXJuIGxvY2s7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250cmlidXRvcik7Ci0JCX0gZmluYWxseXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQxZGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxOCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxFeHRlbnNpb24gZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFIgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlc291cmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0KLQlwdWJsaWMgRWRpdE1vZGVsRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUik7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkluY29ycmVjdCB1c2FnZSBvZiBlZGl0TW9kZWxFeHRlbnNpb24gZXh0ZW5zaW9uIHBvaW50LiAgRWxlbWVudCBtdXN0IGNvbnRhaW4gaWQgYXR0cmlidXRlLiAgUGx1Z2luOiAiICsgZ2V0UGx1Z2luSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWVkaXRNb2RlbElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuRURJVF9NT0RFTF9JRF9BVFRSKTsKLQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlZGl0TW9kZWxSZXNvdXJjZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKEVkaXRNb2RlbFJlc291cmNlLkVESVRfTU9ERUxfUkVTT1VSQ0VfRUxFTUVOVCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZWRpdE1vZGVsUmVzb3VyY2VzLmxlbmd0aDsgaisrKQotCQkJcmVzb3VyY2VzLmFkZChuZXcgRWRpdE1vZGVsUmVzb3VyY2UoZWRpdE1vZGVsUmVzb3VyY2VzW2pdLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2JjNTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRU1GV29ya2JlbmNoRWRpdFBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1jbGFzcyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfRVhUX0VMRU1FTlQgPSAiZWRpdE1vZGVsRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSURfQVRUUiA9ICJlZGl0TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JRF9BVFRSID0gImZ1bmN0aW9uR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJpdmF0ZSBNYXAgZXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uSUQsIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4uRURJVF9NT0RFTF9FWFRFTlNJT05fUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbiBleHRlbnNpb25zQnlJRCA9IG51bGw7Ci0JCUVkaXRNb2RlbEV4dGVuc2lvbiBlZGl0TW9kZWxFeHRlbnNpb24gPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVESVRfTU9ERUxfRVhUX0VMRU1FTlQpKSB7Ci0JCQllZGl0TW9kZWxFeHRlbnNpb24gPSBuZXcgRWRpdE1vZGVsRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJZXh0ZW5zaW9uc0J5SUQgPSAoQ29sbGVjdGlvbikgZ2V0RXh0ZW5zaW9ucygpLmdldChlZGl0TW9kZWxFeHRlbnNpb24uZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCQlpZiAoZXh0ZW5zaW9uc0J5SUQgPT0gbnVsbCkgewotCQkJCWV4dGVuc2lvbnNCeUlEID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWdldEV4dGVuc2lvbnMoKS5wdXQoZWRpdE1vZGVsRXh0ZW5zaW9uLmdldEVkaXRNb2RlbElEKCksIGV4dGVuc2lvbnNCeUlEKTsKLQkJCX0KLQkJCWV4dGVuc2lvbnNCeUlELmFkZChlZGl0TW9kZWxFeHRlbnNpb24pOwotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkKLQkJCWV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKE9iamVjdCBlZGl0TW9kZWxJRCkgewotCQkvL1RPRE8gLSBDYWNoZSB0aGUgcmVzb3VyY2VzCi0JCUNvbGxlY3Rpb24gZWRpdE1vZGVsUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGVkaXRNb2RlbEV4dGVuc2lvbnMgPSAoQ29sbGVjdGlvbikgZ2V0RXh0ZW5zaW9ucygpLmdldChlZGl0TW9kZWxJRCk7Ci0KLQkJaWYgKGVkaXRNb2RlbEV4dGVuc2lvbnMgPT0gbnVsbCB8fCBlZGl0TW9kZWxFeHRlbnNpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUl0ZXJhdG9yIGl0ciA9IGVkaXRNb2RlbEV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVkaXRNb2RlbEV4dGVuc2lvbiBleHQgPSAoRWRpdE1vZGVsRXh0ZW5zaW9uKSBpdHIubmV4dCgpOwotCQkJZWRpdE1vZGVsUmVzb3VyY2VzLmFkZEFsbChleHQuZ2V0UmVzb3VyY2VzKCkpOwotCQl9Ci0JCXJldHVybiAoIWVkaXRNb2RlbEV4dGVuc2lvbnMuaXNFbXB0eSgpKSA/IGVkaXRNb2RlbFJlc291cmNlcyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhY2Q5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5JRWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVkaXRNb2RlbFJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRWRpdE1vZGVsUmVnaXN0cnkgSU5TVEFOQ0UgPSAgbmV3IEVkaXRNb2RlbFJlZ2lzdHJ5KCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCBmYWN0b3J5Q29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfRUxFTUVOVCA9ICJlZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT04gPSAicmVzb3VyY2VFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT05fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSURfQVRUUiA9ICJlZGl0TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTX0FUVFIgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9NT0RFTF9BVFRSID0gInBhcmVudE1vZGVsSUQiOyAvLyROT04tTkxTLTEkCi0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9VTktOT1dOX1JFU09VUkNFU19BVFRSID0gImxvYWRVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFZGl0TW9kZWxSZWdpc3RyeSgpIHsKLQkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCwgRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5FRElUX01PREVMX0ZBQ1RPUklFU19FWFRFTlNJT05fUE9JTlQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWRpdE1vZGVsUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmKGlzSW5pdGlhbGl6ZWQoKSkgCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCXN5bmNocm9uaXplZChJTlNUQU5DRSkgewotCQkJaWYoIWlzSW5pdGlhbGl6ZWQoKSkgewotCQkJCUlOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOwotCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJLyoKLQkJICogVGhlIEVkaXRNb2RlbCBFeHRlbnNpb24gUG9pbnQgZGVmaW5lcyBDb25maWd1cmF0aW9uIGVsZW1lbnRzIG5hbWVkICJlZGl0TW9kZWwiIHdpdGgKLQkJICogYXR0cmlidXRlcyAiZWRpdE1vZGVsSUQiIGFuZCAiZmFjdG9yeUNsYXNzIgotCQkgKi8KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFRElUX01PREVMX0VMRU1FTlQpKSB7Ci0JCQlTdHJpbmcgZWRpdE1vZGVsSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUX01PREVMX0lEX0FUVFIpOwotCQkJaWYgKGVkaXRNb2RlbElEICE9IG51bGwpIHsKLQkJCQl0aGlzLmZhY3RvcnlDb25maWd1cmF0aW9ucy5wdXQoZWRpdE1vZGVsSUQsIG5ldyBFZGl0TW9kZWxJbmZvKGVkaXRNb2RlbElELCBlbGVtZW50KSk7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShlZGl0TW9kZWxJRCk7Ci0JCXJldHVybiBmYWN0b3J5LmdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoZWRpdE1vZGVsSUQpLmNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHBhcmFtcyk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGVkaXRNb2RlbElEKS5jcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgY29udGV4dCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gbmV3IFRyZWVTZXQoKTsKLQotCQlFZGl0TW9kZWxJbmZvIG5leHRFZGl0TW9kZWxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotCi0JCVN0cmluZyBwYXJlbnRNb2RlbElEID0gbnVsbDsKLQkJTWFwIHZpc2l0ZWRFZGl0TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKLQkJLyogY29sbGVjdCB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHBhcmVudHMgKi8KLQkJd2hpbGUgKG5leHRFZGl0TW9kZWxJbmZvICE9IG51bGwgJiYgKHBhcmVudE1vZGVsSUQgPSBuZXh0RWRpdE1vZGVsSW5mby5nZXRQYXJlbnRNb2RlbElEKCkpICE9IG51bGwpIHsKLQkJCWlmICh2aXNpdGVkRWRpdE1vZGVscy5jb250YWluc0tleShwYXJlbnRNb2RlbElEKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMCwgbmV3IE9iamVjdFtde2VkaXRNb2RlbElEfSkpOwotCQkJdmlzaXRlZEVkaXRNb2RlbHMucHV0KHBhcmVudE1vZGVsSUQsIG51bGwpOwotCQkJcmVzb3VyY2VzLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMocGFyZW50TW9kZWxJRCkpOwotCQkJbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChwYXJlbnRNb2RlbElEKTsKLQkJfQotCi0JCS8qIEdldCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgYWN0dWFsIGVkaXQgbW9kZWwgaWQgKi8KLQkJcmVzb3VyY2VzLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKLQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGl0TW9kZWxFeHRlbnNpb25zKFN0cmluZyBlZGl0TW9kZWxJRCkgeyAKLQkJQ29sbGVjdGlvbiBleHRlbnNpb25zID0gbmV3IFRyZWVTZXQoKTsKLQkJCi0JCUVkaXRNb2RlbEluZm8gbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0KLQkJU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCQlNYXAgdmlzaXRlZEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvKiBjb2xsZWN0IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcGFyZW50cyAqLwotCQl3aGlsZShuZXh0RWRpdE1vZGVsSW5mbyAhPSBudWxsICYmIChwYXJlbnRNb2RlbElEID0gbmV4dEVkaXRNb2RlbEluZm8uZ2V0UGFyZW50TW9kZWxJRCgpKSAhPSBudWxsKSB7Ci0JCQlpZih2aXNpdGVkRWRpdE1vZGVscy5jb250YWluc0tleShwYXJlbnRNb2RlbElEKSkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzAsbmV3IE9iamVjdCBbXSB7ZWRpdE1vZGVsSUR9KSk7IAotCQkJZWxzZSAKLQkJCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQkKLQkJCWV4dGVuc2lvbnMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbEV4dGVuc2lvbnMocGFyZW50TW9kZWxJRCkpOwotCQkJbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChwYXJlbnRNb2RlbElEKTsKLQkJfQotCQkKLQkJLyogR2V0IHRoZSByZXNvdXJjZXMgZm9yIHRoZSBhY3R1YWwgZWRpdCBtb2RlbCBpZCAqLwotCQlleHRlbnNpb25zLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKGVkaXRNb2RlbElEKSk7Ci0JCQotCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQl9Ci0JCi0JcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoT2JqZWN0IGVkaXRNb2RlbElEKSB7Ci0JCUlFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gKEVkaXRNb2RlbEluZm8pIGZhY3RvcnlDb25maWd1cmF0aW9ucy5nZXQoZWRpdE1vZGVsSUQpOwotCQlpZiAoZWRpdE1kbEluZm8gIT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0b3J5OyAKLQl9Ci0JCi0JcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpIHJldHVybiBudWxsOwotCQlJdGVyYXRvciBrZXlzID0gZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCQkJaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KChTdHJpbmcpa2V5KTsKLQkJCQkJaWYgKHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpKQotCQkJCQkJcmV0dXJuIGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoa2V5KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc291cmNlcy5hZGRBbGwoZ2V0TG9jYWxFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKLQkJcmVzb3VyY2VzLmFkZEFsbChnZXRFeHRlbmRlZEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKFN0cmluZyBlZGl0TW9kZWxJRCkgewotCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzb3VyY2VzLmFkZEFsbChnZXRMb2NhbEVkaXRNb2RlbEV4dGVuc2lvbnMoZWRpdE1vZGVsSUQpKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRMb2NhbEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsgCi0JCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0gIAkJcmV0dXJuIChlZGl0TWRsSW5mbyAhPSBudWxsKSA/IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbFJlc291cmNlcygpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgCi0JfQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldExvY2FsRWRpdE1vZGVsRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsgCi0JCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0gIAkJcmV0dXJuIChlZGl0TWRsSW5mbyAhPSBudWxsKSA/IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbEV4dGVuc2lvbnMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IAotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEV4dGVuZGVkRWRpdE1vZGVsUmVzb3VyY2VzKFN0cmluZyBlZGl0TW9kZWxJRCkgewotCQlyZXR1cm4gRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWxLZXkKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0TW9kZWxJRCBvZiBhIGdpdmVuIEVkaXRNb2RlbEZhY3RvcnkgZGVmaW5lZCBpbiB0aGUgRXh0ZW5zaW9uIFBvaW50Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIElFZGl0TW9kZWxGYWN0b3J5IGNhbm5vdCBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIElELgotCSAqIEByZXR1cm4gdGhlIEVkaXRNb2RlbEZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRWRpdE1vZGVsSUQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRNb2RlbEZhY3RvcnkgZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KE9iamVjdCBlZGl0TW9kZWxJRCkgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLQkJaWYgKGVkaXRNZGxJbmZvICE9IG51bGwpCi0JCQlmYWN0b3J5ID0gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsRmFjdG9yeSgpOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMiwgbmV3IE9iamVjdFtde2VkaXRNb2RlbElEfSkpOwotCi0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQkvKioKLSAgICAgKiBAcGFyYW0gZWRpdE1vZGVsSUQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVkaXRNb2RlbEluZm8gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoT2JqZWN0IGVkaXRNb2RlbElEKSB7Ci0gICAgICAgIHdhaXRGb3JJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiAoRWRpdE1vZGVsSW5mbykgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmdldChlZGl0TW9kZWxJRCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIElmIHdlIGFyZSBub3QgaW5pdGlhbGl6ZWQsIGJsb2NrIHVudGlsIHRoZSBJTlNUQU5DRSBpcyByZWxlYXNlZCAoIGZyb20gZ2V0SW5zdGFuY2UoKSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvckluaXRpYWxpemF0aW9uSWZOZWNlc3NhcnkoKSB7Ci0gICAgICAgIC8qIFdlIG9ubHkgbmVlZCB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgKElOU1RBTkNFKSwgd2UgZG8gbm90IG5lZWQgCi0gICAgICAgICAqIHRvIGV4ZWN1dGUgYW55dGhpbmcgaW4gdGhpcyBibG9jay4gSWYgdGhlIFJlZ2lzdHJ5IGlzIG5vdCBpbml0YWlsaXplZCwKLSAgICAgICAgICogdGhlbiBpdCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzZW1hcGhvcmUgaXMgcmVsZWFzZWQgKGZyb20gZ2V0SW5zdGFuY2UoKSksCi0gICAgICAgICAqIGFuZCB0aGVuIHJlbGVhc2UgaXQgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gCi0gICAgICAgICAqLwotCQlpZighaXNJbml0aWFsaXplZCgpKSAKLQkJICAgIHN5bmNocm9uaXplZChJTlNUQU5DRSkgeyB9Ci0gICAgfQotCi0JcHVibGljIGNsYXNzIEVkaXRNb2RlbEluZm8gewotCi0JCXByaXZhdGUgU3RyaW5nIGVkaXRNb2RlbElEID0gbnVsbDsKLQkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCi0JCXByaXZhdGUgSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXByaXZhdGUgTGlzdCBlZGl0TW9kZWxSZXNvdXJjZXMgPSBudWxsOwotCQlwcml2YXRlIExpc3QgZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TW9kZWxJRCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdG9zdHJpbmdDYWNoZSA9IG51bGw7Ci0KLQkJcHVibGljIEVkaXRNb2RlbEluZm8oU3RyaW5nIGVkaXRNb2RlbElELCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQotCQkJdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCQkJdGhpcy5lZGl0TW9kZWxJRCA9IGVkaXRNb2RlbElEOwotCQkJdGhpcy5wYXJlbnRNb2RlbElEID0gdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoUEFSRU5UX01PREVMX0FUVFIpOwotCQl9Ci0KLQotCQlwdWJsaWMgTGlzdCBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoKSB7Ci0JCQkvKiB0aGlzIG1ldGhvZCBpcyBndWFyZGVkICovCi0JCQlpbml0aWFsaXplUmVzb3VyY2VzKCk7Ci0JCQlyZXR1cm4gZWRpdE1vZGVsUmVzb3VyY2VzOwotCQl9Ci0KLQkJcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGdldEVkaXRNb2RlbEZhY3RvcnkoKSB7Ci0vLwkJCSBEbyBub3QgYmxvY2sgaWYgdGhlIGZhY3RvcnkgaXMgbm90IG51bGwKLQkJCWlmICh0aGlzLmZhY3RvcnkgPT0gbnVsbCkgewotCQkJICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCSAgICAgIC8vIGFub3RoZXIgdGhyZWFkIGNvdWxkIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgZmFjdG9yeQotCQkJICAgICAgLy8gd2hpbGUgdGhpcyB0aHJlYWQgd2FzIHdhaXRpbmcgdG8gZW50ZXIgdGhlIHN5bmMgYmxvY2sKLQkJCSAgICAgIGlmKHRoaXMuZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCWlmICh0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdGhpcy5mYWN0b3J5ID0gKElFZGl0TW9kZWxGYWN0b3J5KSB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRkFDVE9SWV9DTEFTU19BVFRSKTsKLQkJCQkJCQlCb29sZWFuIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKExPQURfVU5LTk9XTl9SRVNPVVJDRVNfQVRUUikpOwotCQkJCQkJCXRoaXMuZmFjdG9yeS5zZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCQlkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklEKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzEpOwotCQkJCQl9Ci0JCQkgICAgICB9Ci0JCQkgICAgfQotCQkJfQotCQkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKLQkJfQotCi0JCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlcygpIHsKLQotCQkJaWYgKGVkaXRNb2RlbFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLQotCQkJCQllZGl0TW9kZWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVzb3VyY2VzID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRWRpdE1vZGVsUmVzb3VyY2UuRURJVF9NT0RFTF9SRVNPVVJDRV9FTEVNRU5UKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVzRXh0ZW5zaW9ucyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldENoaWxkcmVuKEVESVRfTU9ERUxfUkVTT1VSQ0VfRVhURU5TSU9OKTsKLQkJCQkJLy8gc2V0IHRoZSBjb25maWd1cmF0aW9uRWxlbWVudCB0byBudWxsLSBrZWVwcyBjb2RlIGZyb20gcmVlbnRlcmluZwotCQkJCQlkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc291cmNlcy5sZW5ndGg7IGorKykgewotCQkJCQkJZWRpdE1vZGVsUmVzb3VyY2VzLmFkZChuZXcgRWRpdE1vZGVsUmVzb3VyY2UocmVzb3VyY2VzW2pdKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc0V4dGVuc2lvbnMgPT0gbnVsbCB8fCByZXNFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQllZGl0TW9kZWxFeHRlbnNpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc0V4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzRXh0ZW5zaW9uc1tpXS5nZXRBdHRyaWJ1dGUoRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT05fTkFNRSk7Ci0JCQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRNb2RlbFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpIHsKLQkJCWlmICh0aGlzLmVkaXRNb2RlbFJlc291cmNlcyAhPSBudWxsICYmIHRoaXMuZmFjdG9yeSAhPSBudWxsKQotCQkJCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b3N0cmluZ0NhY2hlID09IG51bGwpCi0JCQkJdG9zdHJpbmdDYWNoZSA9ICJFZGl0TW9kZWxJRDogeyIgKyB0aGlzLmVkaXRNb2RlbElEICsgIn0sIFBhcmVudCBNb2RlbCBJRCB7IiArIHRoaXMucGFyZW50TW9kZWxJRCArICJ9LCBDb25maWd1cmF0aW9uIEVsZW1lbnQ6IFsiICsgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCi0JCQlyZXR1cm4gdG9zdHJpbmdDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudE1vZGVsSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZGVsSUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50TW9kZWxJRDsKLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucygpIHsKLQkJCS8qIHRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgKi8KLQkJCWluaXRpYWxpemVSZXNvdXJjZXMoKTsKLQkJCXJldHVybiBlZGl0TW9kZWxFeHRlbnNpb25zOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVnaXN0ZXJlZEVkaXRNb2RlbElEcygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSkgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU0M2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yOwotCi0KLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbFJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1VSSV9BVFRSID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0xPQURfQVRUUiA9ICJhdXRvbG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQgPSAiZWRpdE1vZGVsUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlciA9IDE7Ci0JcHJpdmF0ZSBVUkkgdXJpOwotCXByaXZhdGUgYm9vbGVhbiBhdXRvbG9hZCA9IGZhbHNlOwotCS8vSW5kaWNhdGVzIGlmIHRoaXMgd2FzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCwKLQkvL2FzIG9wcG9zZWQgdG8gYW4gZXh0ZW5zaW9uCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29yZSA9IHRydWU7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JRDsKLQotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQotCXB1YmxpYyBFZGl0TW9kZWxSZXNvdXJjZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJU3RyaW5nIHN0clVyaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfVVJJX0FUVFIpOwotCQlpZiAoc3RyVXJpICE9IG51bGwpCi0JCQlFZGl0TW9kZWxSZXNvdXJjZS50aGlzLnVyaSA9IFVSSS5jcmVhdGVVUkkoc3RyVXJpKTsKLQotCQlTdHJpbmcgc3RyTG9hZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFVVE9fTE9BRF9BVFRSKTsKLQkJaWYgKHN0ckxvYWQgIT0gbnVsbCkKLQkJCWF1dG9sb2FkID0gQm9vbGVhbi52YWx1ZU9mKHN0ckxvYWQpLmJvb2xlYW5WYWx1ZSgpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbFJlc291cmNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZXh0ZW5zaW9uSUQpIHsKLQkJdGhpcyhlbGVtZW50KTsKLQkJdGhpcy5leHRlbnNpb25JRCA9IGV4dGVuc2lvbklEOwotCQlpc0NvcmUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9Mb2FkKCkgewotCQlyZXR1cm4gYXV0b2xvYWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25JRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciNnZXRQcmlvcml0eSgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKGlzQ29yZSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGlzIHJlc291cmNlIGlzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCBkZWZpbml0aW9uIGFzIG9wcG9zZWQgdG8gYW4KLQkgKiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvcmUoKSB7Ci0JCXJldHVybiBpc0NvcmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgRWRpdE1vZGVsUmVzb3VyY2UpKQotCQkJcmV0dXJuIDE7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IChFZGl0TW9kZWxSZXNvdXJjZSkgbzsKLQkJaW50IHZhbHVlID0gZ2V0UHJpb3JpdHkoKSAtIHJlcy5nZXRQcmlvcml0eSgpOwotCQlpZiAodmFsdWUgPT0gMCkKLQkJCXJldHVybiBsb2FkT3JkZXIgLSByZXMubG9hZE9yZGVyOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2FkT3JkZXIuCi0JICovCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiBsb2FkT3JkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJldHJpZXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZiOGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmV0cmlldmVyIHsKLQlwcml2YXRlIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRDsKLQlwcml2YXRlIE1hcCBlZGl0TW9kZWxQYXJtczsKLQotCS8qKgotCSAqIEVkaXRNb2RlbFJldHJpZXZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWxSZXRyaWV2ZXIoRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZWRpdE1vZGVsS2V5LCBNYXAgcGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxLZXk7Ci0JCWVkaXRNb2RlbFBhcm1zID0gcGFybXM7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gY29udGV4dC5nZXRFZGl0TW9kZWxGb3JSZWFkKGdldEVkaXRNb2RlbElEKCksIGFjY2Vzc29yS2V5LCBlZGl0TW9kZWxQYXJtcyk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZ2V0RWRpdE1vZGVsSUQoKSwgYWNjZXNzb3JLZXksIGVkaXRNb2RlbFBhcm1zKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0V4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI2Y2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqLwotCXB1YmxpYyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb2xsZWN0aW9uIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiBvdmVycm9kZSBmcm9tIHRoZSBzdXBlciBjbGFzcywgY2hhbmdlZCBub3QgdG8gY2hlY2sgc3VwZXJ0eXBlcyBvZiB0aGUgRU9iamVjdCwgYmVjYXVzZSB0aGF0Ci0JICogd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBEeW5hbWljQWRhcHRlckZhY3RvcnkKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQkJCUVDbGFzcyBlQ2xhc3MgPSBlT2JqZWN0LmVDbGFzcygpOwotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXR5cGVzLmFkZChlUGFja2FnZSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQl0eXBlcy5hZGQodHlwZSk7Ci0JCQkJfQotCQkJCS8qIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCByZW1vdmUgdGhlIGRlbGVnYXRlIGFuZCB0cnkgYWdhaW4gKi8KLQkJCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSBmYWxzZTsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyh0eXBlcyk7Ci0JCQkJCWlmIChkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7Ci0JCQkJCQkJYWRhcHRlckZhY3Rvcmllcy5yZW1vdmUoZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gYWRhcHQodGFyZ2V0LCB0eXBlLCBuZXcgSGFzaFNldCgpLCB0YXJnZXQuZ2V0Q2xhc3MoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvSW52ZXJ0ZWRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmJjYjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvSW52ZXJ0ZWRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxDb21tYW5kOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA4OjU4OjI0IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZlcnRlZENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgewotCXB1YmxpYyBJbnZlcnRlZENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kKSB7Ci0JCXN1cGVyKHRhcmdldENvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5VbmRvKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvL2RvZXMgbm90aGluZwotCX0KLQotCS8qKgotCSAqIGdldEVkaXRNb2RlbENvbW1hbmQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVkaXRNb2RlbENvbW1hbmQgZ2V0RWRpdE1vZGVsQ29tbWFuZCgpIHsKLQkJcmV0dXJuICgoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kKSBnZXRUYXJnZXQoKSkuZ2V0RWRpdE1vZGVsQ29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgaW52ZXJzaW9uRGVwdGgoKSB7Ci0JCWlmIChnZXRFZGl0TW9kZWxDb21tYW5kKCkgPT0gZ2V0VGFyZ2V0KCkpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuICgoSW52ZXJ0ZWRDb21tYW5kKSBnZXRUYXJnZXQoKSkuaW52ZXJzaW9uRGVwdGgoKSArIDE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBsYWJlbFByZWZpeCgpIHsKLQkJcmV0dXJuIGludmVyc2lvbkRlcHRoKCkgJSAyID09IDEgPyAiVW5kbyAiIDogIlJlZG8gIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWdldFRhcmdldCgpLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlnZXRUYXJnZXQoKS5yZWRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9QYXJlbnRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1BhcmVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZGM5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1BhcmVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5Db21wb3NlZEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1NzozOCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUGFyZW50Q29tbWFuZCBleHRlbmRzIEVkaXRNb2RlbENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBjaGlsZHJlbjsKLQlwcml2YXRlIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIExpc3QgYWZmZWN0ZWRNb2RlbHM7Ci0KLQlwdWJsaWMgUGFyZW50Q29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQsIENvbXBvc2VkRWRpdE1vZGVsIGFuRWRpdE1vZGVsKSB7Ci0JCXN1cGVyKHRhcmdldENvbW1hbmQpOwotCQllZGl0TW9kZWwgPSBhbkVkaXRNb2RlbDsKLQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUFmZmVjdGVkTW9kZWxzKCkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBudWxsOwotCQlMaXN0IGVkaXRNb2RlbHMgPSBnZXRFZGl0TW9kZWwoKS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvciBpdCA9IGNvbXB1dGVBZmZlY3RlZFJlc291cmNlU2V0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXNldCA9IChSZXNvdXJjZVNldCkgaXQubmV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0TW9kZWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRWRpdE1vZGVsIG1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdE1vZGVscy5nZXQoaSk7Ci0JCQkJaWYgKG1vZGVsLmdldFJlc291cmNlU2V0KCkgPT0gc2V0KSB7Ci0JCQkJCWdldEFmZmVjdGVkTW9kZWxzKCkuYWRkKG5ldyBFZGl0TW9kZWxSZXRyaWV2ZXIobW9kZWwuZ2V0RW1mQ29udGV4dCgpLCBtb2RlbC5nZXRFZGl0TW9kZWxJRCgpLCBtb2RlbC5nZXRQYXJhbXMoKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGNvbXB1dGVBZmZlY3RlZFJlc291cmNlU2V0cygpIHsKLQkJSXRlcmF0b3Igb2JqZWN0cyA9IGdldFRhcmdldCgpLmdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCVNldCByZXNvdXJjZVNldHMgPSBuZXcgSGFzaFNldCgpOwotCQlPYmplY3QgbyA9IG51bGw7Ci0JCUVPYmplY3QgcmVmID0gbnVsbDsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gbnVsbDsKLQkJd2hpbGUgKG9iamVjdHMuaGFzTmV4dCgpKSB7Ci0JCQlvID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlpZiAoIShvIGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQkJY29udGludWU7Ci0JCQlyZWYgPSAoRU9iamVjdCkgbzsKLQkJCWlmIChyZWYuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXNldCA9IHJlZi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChzZXQgIT0gbnVsbCkKLQkJCQkJcmVzb3VyY2VTZXRzLmFkZChzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldHM7Ci0JfQotCi0JcHJvdGVjdGVkIENoaWxkQ29tbWFuZCBjcmVhdGVDaGlsZENvbW1hbmQoRWRpdE1vZGVsUmV0cmlldmVyIHJldHJpZXZlcikgewotCQlyZXR1cm4gbmV3IENoaWxkQ29tbWFuZCh0aGlzLCBnZXRUYXJnZXQoKSwgcmV0cmlldmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlnZXRUYXJnZXQoKS5leGVjdXRlKCk7Ci0JCWNvbXB1dGVBZmZlY3RlZE1vZGVscygpOwotCQlwdXNoQ2hpbGRyZW5Gb3JFeGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUluTW9kZWwoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGNtZCkgewotCQlnZXRFZGl0TW9kZWwoKS5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QWZmZWN0ZWRNb2RlbHMoKSB7Ci0JCWlmIChhZmZlY3RlZE1vZGVscyA9PSBudWxsKQotCQkJYWZmZWN0ZWRNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlyZXR1cm4gYWZmZWN0ZWRNb2RlbHM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zZWRFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludmVydENoaWxkcmVuKCkgewotCQlpbnZlcnRDaGlsZHJlbkV4Y2VwdCgoQ2hpbGRDb21tYW5kKSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZlcnRDaGlsZHJlbkV4Y2VwdChDaGlsZENvbW1hbmQgY2FsbGVyKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUNoaWxkQ29tbWFuZCBjaGlsZENtZCA9IChDaGlsZENvbW1hbmQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjYWxsZXIgPT0gbnVsbCB8fCBjaGlsZENtZCAhPSBjYWxsZXIpCi0JCQkJY2hpbGRDbWQuaW52ZXJ0QW5kUHVzaCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW52ZXJ0RnJvbShDaGlsZENvbW1hbmQgY2FsbGVyKSB7Ci0JCWludmVydEFuZFB1c2goKTsKLQkJaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoY2FsbGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2hpbGRyZW5Gb3JFeGVjdXRlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldEFmZmVjdGVkTW9kZWxzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRNb2RlbFJldHJpZXZlciByZXRyaWV2ZXIgPSAoRWRpdE1vZGVsUmV0cmlldmVyKSBnZXRBZmZlY3RlZE1vZGVscygpLmdldChpKTsKLQkJCUNoaWxkQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ2hpbGRDb21tYW5kKHJldHJpZXZlcik7Ci0JCQlnZXRDaGlsZHJlbigpLmFkZChjb21tYW5kKTsKLQkJCWNvbW1hbmQuZXhlY3V0ZUluTW9kZWwoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlnZXRUYXJnZXQoKS5yZWRvKCk7Ci0JCWludmVydENoaWxkcmVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkb0Zyb20oQ2hpbGRDb21tYW5kIGNoaWxkKSB7Ci0JCWludmVydEZyb20oY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWdldFRhcmdldCgpLnVuZG8oKTsKLQkJaW52ZXJ0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvRnJvbShDaGlsZENvbW1hbmQgY2hpbGQpIHsKLQkJaW52ZXJ0RnJvbShjaGlsZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9SZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDU0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9SZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSByZWFkb25seSB2ZXJzaW9uIG9mIHRoZSBlZGl0bW9kZWwgYWNjZXNzIHJlZ2lzdHJ5LCBvbmx5IHVzZXMgYSB3ZWFrIGhhc2ggZGljdGlvbmFyeSwKLSAqIGFuZCBiZWNhdXNlIHRoZSBhY2Nlc3MgaXMgcmVhZCBvbmx5LCBpcyBsZXNzIGNvbmNlcm5lZCB3aXRoIHRpbWluZyBvZiBhY2Nlc3MvcmVsZWFzZSwgYW5kIHdpbGwgYmUKLSAqIGNsZWFuZWQgdXAgb24gZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIG5lZWRlZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSBleHRlbmRzIENsaWVudEFjY2Vzc1JlZ2lzdHJ5IHsKLQotCXB1YmxpYyBSZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7Ci0JCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgbnVsbCk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMCwgYWNjZXNzb3JLZXkpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCS8qCi0JCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQotCQkgKi8KLQkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7Ci0JCQl0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7Ci0JCX0gZWxzZQotCQkJY29tcGxhaW4oYWNjZXNzb3JLZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCXRocm93IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8xIiksIGFjY2Vzc29yS2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9TbmFwc2hvdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9TbmFwc2hvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI2NGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvU25hcHNob3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMywgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUaGUgU25hcHNob3QgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgY2FsbCBzdGFjayB0cmFjZSBvZiBhbnkgbWV0aG9kIHRoYXQgYWNjZXNzZXMgYSBSZXNvdXJjZS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmFwc2hvdCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHVibGljIFNuYXBzaG90KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLlNuYXBzaG90X0VSUk9SXzApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhY2tUcmFjZVN0cmluZygpIHsKLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsKLQkJcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvV3JhcHBpbmdDb21tYW5kU3RhY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvV3JhcHBpbmdDb21tYW5kU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxNTM3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQ29tcG9zZWRFZGl0TW9kZWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIxLzAxIDk6MzE6MDIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwaW5nQ29tbWFuZFN0YWNrIGV4dGVuZHMgQmFzaWNDb21tYW5kU3RhY2sgewotCXByaXZhdGUgQ29tcG9zZWRFZGl0TW9kZWwgZWRpdE1vZGVsOwotCi0JLyoqCi0JICogV3JhcHBpbmdDb21tYW5kU3RhY2sgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV3JhcHBpbmdDb21tYW5kU3RhY2soQ29tcG9zZWRFZGl0TW9kZWwgYW5FZGl0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJZWRpdE1vZGVsID0gYW5FZGl0TW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJUGFyZW50Q29tbWFuZCBwYXJlbnQgPSBuZXcgUGFyZW50Q29tbWFuZChjb21tYW5kLCBlZGl0TW9kZWwpOwotCQlzdXBlci5leGVjdXRlKHBhcmVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjFlN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5JbnZlcnRlZENvbW1hbmQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBDb21tYW5kIHRhcmdldDsKLQlwcml2YXRlIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvd25lcjsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0ID0gdGFyZ2V0Q29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCk7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGdldE91dGVybW9zdENvbW1hbmQoKSB7Ci0JCXJldHVybiBvd25lciA9PSBudWxsID8gdGhpcyA6IG93bmVyLmdldE91dGVybW9zdENvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGludmVydGVkIGNvbW1hbmQgb24gdGhlIG91dGVybW9zdCBjb21tYW5kCi0JICovCi0JcHVibGljIEludmVydGVkQ29tbWFuZCBpbnZlcnRlZCgpIHsKLQkJQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIG91dGVyID0gZ2V0T3V0ZXJtb3N0Q29tbWFuZCgpOwotCQlJbnZlcnRlZENvbW1hbmQgY21kID0gbmV3IEludmVydGVkQ29tbWFuZChvdXRlcik7Ci0JCW91dGVyLnNldE93bmVyKGNtZCk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXIoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIG93bmVyQ29tbWFuZCkgewotCQlvd25lciA9IG93bmVyQ29tbWFuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRBY2Nlc3NvcktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRBY2Nlc3NvcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNhYzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkQWNjZXNzb3JLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkQWNjZXNzb3JLZXkgewotCi0JcHJpdmF0ZSBPYmplY3QgYWNjZXNzb3JLZXkgPSBudWxsOwotCXByaXZhdGUgT2JqZWN0IGFkZG9uS2V5ID0gbnVsbDsKLQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NlZEFjY2Vzc29yS2V5IGdldENvbXBvc2VkQWNjZXNzb3JLZXkoT2JqZWN0IGFjY2Vzc29yS2V5LCBDb21wb3NlZEVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBuZXdLZXkgPSBuZXcgQ29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgZWRpdE1vZGVsKTsKLQkJZWRpdE1vZGVsLmNhY2hlQWNjZXNzb3JLZXkobmV3S2V5KTsKLQkJcmV0dXJuIG5ld0tleTsKLQl9Ci0KLQotCXByaXZhdGUgQ29tcG9zZWRBY2Nlc3NvcktleShPYmplY3QgYWNjZXNzb3JLZXksIE9iamVjdCBhZGRvbktleSkgewotCQl0aGlzLmFjY2Vzc29yS2V5ID0gYWNjZXNzb3JLZXk7Ci0JCXRoaXMuYWRkb25LZXkgPSBhZGRvbktleTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciA9PSBudWxsIHx8ICEob3RoZXIgaW5zdGFuY2VvZiBDb21wb3NlZEFjY2Vzc29yS2V5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBvdGhlcktleSA9IChDb21wb3NlZEFjY2Vzc29yS2V5KSBvdGhlcjsKLQotCQlyZXR1cm4gYWNjZXNzb3JLZXkuZXF1YWxzKG90aGVyS2V5LmFjY2Vzc29yS2V5KSAmJiBhZGRvbktleS5lcXVhbHMob3RoZXJLZXkuYWRkb25LZXkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGFjY2Vzc29yS2V5Lmhhc2hDb2RlKCkgXiBhZGRvbktleS5oYXNoQ29kZSgpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkRWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmZhOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRFZGl0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuV3JhcHBpbmdDb21tYW5kU3RhY2s7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIxLzAxIDg6MjY6MzIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkRWRpdE1vZGVsIGV4dGVuZHMgRWRpdE1vZGVsIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQlwcml2YXRlIE1hcCBjaGlsZHJlbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGNhY2hlZEtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDb21wb3NlZEVkaXRNb2RlbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UpOwotCX0KLQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ2hpbGRyZW5JZk5lY2Vzc2FyeShDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0tleQotCSAqLwotCXB1YmxpYyB2b2lkIGNhY2hlQWNjZXNzb3JLZXkoQ29tcG9zZWRBY2Nlc3NvcktleSBuZXdLZXkpIHsKLQkJaWYgKCFjYWNoZWRLZXlzLmNvbnRhaW5zKG5ld0tleSkpCi0JCQljYWNoZWRLZXlzLmFkZChuZXdLZXkpOwotCX0KLQotCS8vIElzIHRoaXMgbmVjZXNzYXJ5IGFueW1vcmU/ICBUaGUgb25seSBkaWZmIHNlZW1zIHRvIGJlIGl0IGRvZXNuJ3QgcmVsZWFzZSByZXNvdXJjZXMKLS8vCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJZGlzcG9zaW5nID0gdHJ1ZTsKLS8vCQlpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0vLwkJCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLS8vCQlpZiAoaGFzTGlzdGVuZXJzKCkpCi0vLwkJCW5vdGlmeUxpc3RlbmVycyhuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UsIHRoaXMpKTsKLS8vCQlyZWxlYXNlUHJlbG9hZFJlc291cmNlcygpOwotLy8JCXJlbGVhc2VJZGVudGlmaWVycygpOwotLy8JCWVtZkNvbnRleHQgPSBudWxsOyAKLS8vCQlyZXNvdXJjZXMgPSBudWxsOwotLy8JCWRpc3Bvc2luZyA9IGZhbHNlOwotLy8JCXByb2plY3QgPSBudWxsOwotLy8JCWNhY2hlZEtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsLlJlZmVyZW5jZSBhZGRDaGlsZChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gYWRkQ2hpbGQoZWRpdE1vZGVsSUQsIHBhcmFtcywgQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKSk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkpIHsKLQotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RW1mQ29udGV4dCgpLmdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb21wb3NlZEFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQllZGl0TW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJZ2V0Q2hpbGRyZW5NYXAoKS5wdXQoZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpLCBlZGl0TW9kZWwpOwotCQlnZXRDaGlsZHJlbigpLmFkZChlZGl0TW9kZWwpOwotCi0JCXJldHVybiBlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoRWRpdE1vZGVsLlJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkgPSBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZ2V0Q2hpbGRyZW5NYXAoKS5yZW1vdmUocmVmZXJlbmNlKTsKLQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWdldENoaWxkcmVuKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q29udGFpbmVkUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuTWFwKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldENvbnRhaW5lZEVkaXRNb2RlbChFZGl0TW9kZWwuUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlyZXR1cm4gKEVkaXRNb2RlbCkgZ2V0Q2hpbGRyZW5NYXAoKS5nZXQocmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNDb21tYW5kU3RhY2sgY3JlYXRlQ29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IFdyYXBwaW5nQ29tbWFuZFN0YWNrKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgYWxsIGV2ZW50cyB0byB0aGUgbGlzdGVuZXJzIGZvciB0aGlzIG1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCW5vdGlmeUxpc3RlbmVycyhhbkV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVNldCBhU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBtb2RlbHMgPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVscy5zaXplKCk7IGkrKykgewotCQkJRWRpdE1vZGVsIGNoaWxkID0gKEVkaXRNb2RlbCkgbW9kZWxzLmdldChpKTsKLQkJCWFTZXQuYWRkQWxsKGNoaWxkLmdldEFmZmVjdGVkRmlsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGFTZXQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldENoaWxkcmVuTWFwKCkgewotCQlpZiAoY2hpbGRyZW5NYXAgPT0gbnVsbCkKLQkJCWNoaWxkcmVuTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNoaWxkcmVuTWFwOwotCX0KLQotCS8qKgotCSAqIFBhc3MgYWxvbmcgdG8gY2hpbGRyZW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKLQkJCWVkaXRNb2RlbC5oYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKG1vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBzYXZlIGlzIG5lZWRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJSXRlcmF0b3IgZWRpdE1vZGVscyA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRNb2RlbHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdE1vZGVscy5uZXh0KCk7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzRGlydHkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgc2F2ZSBpcyBuZWVkZWQgb24gdGhlIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJdGVyYXRvciBlZGl0TW9kZWxzID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZWRpdE1vZGVscy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBlZGl0TW9kZWxzLm5leHQoKTsKLQkJCWlmIChlZGl0TW9kZWwuaXNJbnRlcnJlc3RlZEluUmVzb3VyY2UoYVJlc291cmNlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbVNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKLQkJCSgoRWRpdE1vZGVsKSBsaXN0LmdldChpKSkucHJpbVNhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvbmx5IGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgY2hpbGRyZW4gYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB5b3UKLQkgKiBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSA9IENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcyk7Ci0JCWlmIChnZXRDaGlsZHJlbigpLnNpemUoKSA9PSAwKSB7Ci0JCQljcmVhdGVDaGlsZHJlbklmTmVjZXNzYXJ5KGNvbXBvc2VkQWNjZXNzb3JLZXkpOwotCQl9IGVsc2UgewotCi0JCQlMaXN0IHRlbXBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCUVkaXRNb2RlbCBtb2RlbCA9IChFZGl0TW9kZWwpIHRlbXBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJbW9kZWwuYWNjZXNzKGNvbXBvc2VkQWNjZXNzb3JLZXkpOwotCQkJfQotCQl9Ci0JCS8vIHJlbW92aW5nIGZvciBkZWZlY3QgMTk3OCwgY2hpbGRyZW4gc2hvdWxkIGRvIGFsbCB0aGUgYWNjZXNzaW5nCi0JCXN1cGVyLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGZyb20gZWFjaCBjbGllbnQgd2hlbiB0aGV5IGFyZSBmaW5pc2hlZCB3b3JraW5nIHdpdGggdGhlCi0JICogRWRpdE1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VBY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCUxpc3QgdGVtcGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5ID0gQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRNb2RlbCBtb2RlbCA9IChFZGl0TW9kZWwpIHRlbXBjaGlsZHJlbi5nZXQoaSk7Ci0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKGNvbXBvc2VkQWNjZXNzb3JLZXkpOwotCQl9Ci0JCXJlbW92ZUtleUZyb21DYWNoZShjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJLy8gUmVtb3ZpbmcgdGhpcyBjYWxsLi4uIENoaWxkcmVuIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBhbGwgcmVsZWFzaW5nIGRlZmVjdCAxOTc4Ci0JCXN1cGVyLnJlbGVhc2VBY2Nlc3MoYWNjZXNzb3JLZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUZyb21DYWNoZShDb21wb3NlZEFjY2Vzc29yS2V5IGtleSkgewotCQljYWNoZWRLZXlzLnJlbW92ZShrZXkpOwotCX0KLQotCS8qKgotCSAqIElmIG9uZSBzaG91bGQgc2F2ZSwgdGhleSBhbGwgc2hvdWxkIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZSgpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWwuc2hvdWxkU2F2ZSgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmUgc2hvdWxkIHNhdmUsIHRoZXkgYWxsIHNob3VsZCBzYXZlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlcikgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGVkaXRNb2RlbC5zaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLkVkaXRNb2RlbCNnZXROb25SZXNvdXJjZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKLQkJCUxpc3QgZmlsZXMgPSBlZGl0TW9kZWwuZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKGZpbGVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG91bmRpbmdDb21tYW5kU3RhY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OGE4ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG91bmRpbmdDb21tYW5kU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLQotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRoaXMgY2xhc3MgZG9lcyBub3QgYWN0dWFsbHkgZXhlY3V0ZSBhbnkgY29tbWFuZHMuIEl0IG1lcmVseSBnYXRoZXJzIHRoZSBjb21tYW5kcyB0byBiZSBleGVjdXRlZAotICogYW5kIGNvbXBvdW5kcyB0aGVtIHNvIHRoYXQgdGhleSBjYW4gYmUgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgYWN0dWFsQ29tbWFuZFN0YWNrLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG91bmRpbmdDb21tYW5kU3RhY2sgaW1wbGVtZW50cyBDb21tYW5kU3RhY2sgewotCXByaXZhdGUgQ29tbWFuZFN0YWNrIGFjdHVhbENvbW1hbmRTdGFjazsKLQlwcml2YXRlIENvbW1hbmQgY29tcG91bmRDb21tYW5kOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21wb3VuZGluZ0NvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgYWN0dWFsQ29tbWFuZFN0YWNrKSB7Ci0JCXRoaXMuYWN0dWFsQ29tbWFuZFN0YWNrID0gYWN0dWFsQ29tbWFuZFN0YWNrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21wb3VuZENvbW1hbmQgPT0gbnVsbCkKLQkJCWNvbXBvdW5kQ29tbWFuZCA9IGNvbW1hbmQ7Ci0JCWVsc2UKLQkJCWNvbXBvdW5kQ29tbWFuZCA9IGNvbXBvdW5kQ29tbWFuZC5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRXhlY3V0aW9uKCkgewotCQlpZiAoY29tcG91bmRDb21tYW5kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYWN0dWFsQ29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY29tcG91bmRDb21tYW5kID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNjYW5SZWRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldFVuZG9Db21tYW5kKCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRVbmRvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldFJlZG9Db21tYW5kKCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRSZWRvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldE1vc3RSZWNlbnRDb21tYW5kKCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRNb3N0UmVjZW50Q29tbWFuZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vcmVkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCS8vZmx1c2gKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbW1hbmRTdGFja0xpc3RlbmVyKENvbW1hbmRTdGFja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNyZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoQ29tbWFuZFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kZWZhdWx0Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9EeW5hbWljQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NzFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9EeW5hbWljQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUsIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5IE5VTExfRkFDVE9SWSA9IG5ldyBBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQotCXByaXZhdGUgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSByZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHZpZXdJRDsKLQotCS8vRWFjaCBvZiB0aGUgdHdvIG1hcHMgYmVsb3cgYXJlIGtleWVkIGJ5IHRoZSBwcm9qZWN0Ci0JcHJpdmF0ZSBNYXAgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZTsKLQotCXByaXZhdGUgTWFwIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGU7Ci0KLQlwcml2YXRlIFNldCBhbGxGYWN0b3JpZXM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBJQ2hhbmdlTm90aWZpZXJ9Ci0JICovCi0JcHJvdGVjdGVkIENoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzcGVjdGluZ0FjdGl2aXRpZXMgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE5PX1BST0pFQ1QgPSAiTk9fUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXB1YmxpYyBEeW5hbWljQWRhcHRlckZhY3RvcnkoU3RyaW5nIHZpZXdJRCwgYm9vbGVhbiByZXNwZWN0QWN0aXZpZXMpIHsKLQkJdGhpcy52aWV3SUQgPSB2aWV3SUQ7Ci0JCXRoaXMucmVzcGVjdGluZ0FjdGl2aXRpZXMgPSByZXNwZWN0QWN0aXZpZXM7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KFN0cmluZyB2aWV3SUQpIHsKLQkJdGhpcy52aWV3SUQgPSB2aWV3SUQ7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUgPSBuZXcgSGFzaE1hcCgpOwotCQlhbGxGYWN0b3JpZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnlGb3JUeXBlKHR5cGUpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gZ2V0RmFjdG9yeUZvclR5cGUoKEVPYmplY3QpIHR5cGUpOwotCi0JCU9iamVjdCBhUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0eXBlKTsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQlhUHJvamVjdCA9IE5PX1BST0pFQ1Q7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JUeXBlKGFQcm9qZWN0LCB0eXBlKTsKLQkJaWYgKGZhY3RvcnkgPT0gTlVMTF9GQUNUT1JZKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IGZpbmRGYWN0b3J5Rm9yVHlwZShhUHJvamVjdCwgdHlwZSk7Ci0KLQkJCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQkJYWRkQWRhcHRlckZhY3RvcnkoYVByb2plY3QsIHR5cGUsIE5VTExfRkFDVE9SWSk7Ci0JCQllbHNlCi0JCQkJYWRkQWRhcHRlckZhY3RvcnkoYVByb2plY3QsIHR5cGUsIGZhY3RvcnkpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RXhpc3RpbmdGYWN0b3J5Rm9yVHlwZShPYmplY3QgcCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUuZ2V0KHR5cGUpOwotCX0KLQotCS8qCi0JICogVGhlIGZhY3Rvcnkgd2FzIG5vdCBjYWNoZWQgYnkgdHlwZSwgc28gd2Ugd2lsbCBzZWFyY2ggdGhlIGNhY2hlIG9mIGZhY3RvcmllcyBmb3IgdGhlIHByb2plY3QKLQkgKiBhbmQgc2VlIGlmIGl0IGNhbiBiZSBmb3VuZCB0aGVyZQotCSAqLwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZmluZEZhY3RvcnlGb3JUeXBlKE9iamVjdCBwcm9qZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocHJvamVjdCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgaXRlciA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKQotCQkJCXJldHVybiBmYWN0b3J5OwotCQl9Ci0KLQkJLy8gYWRhcHQgdGhlIHJlc291cmNlIHRvIGl0cyBjb250ZW50cwotCQlpZiAoZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JUeXBlKEVPYmplY3Qgb2JqKSB7Ci0JCUVDbGFzcyBlQ2xhc3MgPSBvYmouZUNsYXNzKCk7Ci0JCWlmIChlQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVQYWNrYWdlIGVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCU9iamVjdCBhUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChvYmopOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgcmVzdWx0ID0gZ2V0RmFjdG9yeUZvclBhY2thZ2UoYVByb2plY3QsIGVQYWNrYWdlKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCVNldCBmYWlsZWRQYWNrYWdlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKTsKLQkJCUl0ZXJhdG9yIHN1cGVydHlwZXMgPSBlQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHN1cGVydHlwZXMuaGFzTmV4dCgpKSB7Ci0JCQkJZUNsYXNzID0gKEVDbGFzcykgc3VwZXJ0eXBlcy5uZXh0KCk7Ci0JCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCWVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCQkJCWlmIChmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSkpIHsKLQkJCQkJCXJlc3VsdCA9IGdldEZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBlUGFja2FnZSk7Ci0JCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JQYWNrYWdlKE9iamVjdCBhUHJvamVjdCwgRVBhY2thZ2UgYVBhY2thZ2UpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgYVBhY2thZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RXhpc3RpbmdGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgYVBhY2thZ2UpOwotCQlpZiAoZmFjdG9yeSA9PSBOVUxMX0ZBQ1RPUlkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UpOwotCi0JCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJYWRkQWRhcHRlckZhY3RvcnkoYVByb2plY3QsIGFQYWNrYWdlLCBOVUxMX0ZBQ1RPUlkpOwotCQkJCWVsc2UKLQkJCQkJYWRkQWRhcHRlckZhY3RvcnkoYVByb2plY3QsIGFQYWNrYWdlLCBmYWN0b3J5KTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGVzKE9iamVjdCBwLCBMaXN0IHR5cGVzKSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRSZXNvdXJjZVR5cGVzKHR5cGVzKTsKLQotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdFJlc291cmNlVHlwZXMoTGlzdCB0eXBlcykgewotCQkvLyAgICAgIGFkYXB0IHRoZSByZXNvdXJjZSB0byBpdHMgY29udGVudHMKLQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpKQotCQkJcmV0dXJuIGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZhY3RvcnlGb3JUeXBlcyhPYmplY3QgcCwgTGlzdCB0eXBlcykgewotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlhTWFwLnJlbW92ZShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmFjdG9yeUZvckFsbFR5cGVzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIExpc3QgdHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZXMuZ2V0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RXhpc3RpbmdGYWN0b3J5Rm9yUGFja2FnZShPYmplY3QgcCwgRVBhY2thZ2UgYVBhY2thZ2UpIHsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQWRhcHRlckZhY3RvcnkpIGFNYXAuZ2V0KGFQYWNrYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIEVQYWNrYWdlIGFQYWNrYWdlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UpOwotCi0JCWFNYXAucHV0KGFQYWNrYWdlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0T3JDcmVhdGVNYXAoT2JqZWN0IHAsIE1hcCBjb250YWluZXIpIHsKLQkJTWFwIGFNYXAgPSAoTWFwKSBjb250YWluZXIuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKSB7Ci0JCQlhTWFwID0gbmV3IEhhc2hNYXAoMTApOwotCQkJY29udGFpbmVyLnB1dChwLCBhTWFwKTsKLQkJfQotCQlyZXR1cm4gYU1hcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIE9iamVjdCB0eXBlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUpOwotCQlhTWFwLnB1dCh0eXBlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHRhcmdldDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vdGlmaWVyKSB7Ci0JCQlhZGFwdGVyID0gYWRhcHQoKE5vdGlmaWVyKSB0YXJnZXQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXN1bHQgPSBhZGFwdCgoRU9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQlwID0gTk9fUFJPSkVDVDsKLQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgbmV3IEhhc2hTZXQoKSwgdGFyZ2V0LmdldENsYXNzKCkpOwotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KEVPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCUVDbGFzcyBlQ2xhc3MgPSB0YXJnZXQuZUNsYXNzKCk7Ci0JCWlmIChlQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVQYWNrYWdlIGVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gYWRhcHQodGFyZ2V0LCBlUGFja2FnZSwgdHlwZSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlTZXQgZmFpbGVkUGFja2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSk7Ci0JCQlJdGVyYXRvciBzdXBlcnR5cGVzID0gZUNsYXNzLmdldEVBbGxTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChzdXBlcnR5cGVzLmhhc05leHQoKSkgewotCQkJCWVDbGFzcyA9IChFQ2xhc3MpIHN1cGVydHlwZXMubmV4dCgpOwotCQkJCWlmIChlQ2xhc3MgIT0gbnVsbCkgewotCQkJCQllUGFja2FnZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpOwotCQkJCQlpZiAoZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpKSB7Ci0JCQkJCQlyZXN1bHQgPSBhZGFwdCh0YXJnZXQsIGVQYWNrYWdlLCB0eXBlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBhZGFwdChFT2JqZWN0IHRhcmdldCwgRVBhY2thZ2UgZVBhY2thZ2UsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ29kZSBib3Jyb3dlZCBmcm9tIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5fQotCSAqICAKLQkgKi8KLQlwcml2YXRlIEFkYXB0ZXIgYWRhcHQoT2JqZWN0IHAsIE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUsIENvbGxlY3Rpb24gZmFpbGVkUGFja2FnZXMsIENsYXNzIGphdmFDbGFzcykgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCi0JCVBhY2thZ2UgamF2YVBhY2thZ2UgPSBqYXZhQ2xhc3MuZ2V0UGFja2FnZSgpOwotCQlpZiAoZmFpbGVkUGFja2FnZXMuYWRkKGphdmFQYWNrYWdlKSkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQl0eXBlcy5hZGQoamF2YVBhY2thZ2UpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQotCQkJLyogd2hlbiBhbiBlcnJvciBvY2N1cnMsIHJlbW92ZSB0aGUgZGVsZWdhdGUgYW5kIHRyeSBhZ2FpbiAqLwotCQkJYm9vbGVhbiBhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IGZhbHNlOwotCi0JCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyhwLCB0eXBlcyk7Ci0JCQkJaWYgKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocmUpOwotCQkJCQkJcmVtb3ZlRmFjdG9yeUZvclR5cGVzKHAsIHR5cGVzKTsKLQkJCQkJCWF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJQ2xhc3Mgc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gYWRhcHQocCwgdGFyZ2V0LCB0eXBlLCBmYWlsZWRQYWNrYWdlcywgamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlDbGFzc1tdIGludGVyZmFjZXMgPSBqYXZhQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgewotCQkJCQlyZXN1bHQgPSBhZGFwdChwLCB0YXJnZXQsIHR5cGUsIGZhaWxlZFBhY2thZ2VzLCBpbnRlcmZhY2VzW2ldKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5Rm9yVHlwZSh0YXJnZXQpOwotCi0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5hZGFwdE5ldyh0YXJnZXQsIHR5cGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdEFsbE5ldyhOb3RpZmllciB0YXJnZXQpIHsKLQotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGUodGFyZ2V0KTsKLQotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyh0YXJnZXQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCB8fCBjaGFuZ2VOb3RpZmllci5pc0VtcHR5KCkgfHwgY2hhbmdlTm90aWZpZXIuZ2V0KDApID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGFsbEZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQlPYmplY3QgZmFjdG9yeSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IGl0ZXIubmV4dCgpOwotCQkJZGlzcG9zZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdHIgPSBnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJKChJRW5hYmxlbWVudElkZW50aWZpZXIpIGl0ci5uZXh0KCkpLnJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSAhPSBudWxsKQotCQkJcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUZhY3RvcnkoT2JqZWN0IGZhY3RvcnkpIHsKLQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJKChJRGlzcG9zYWJsZSkgZmFjdG9yeSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL0Zvd2FyZCB0aGUgbm90aWZpY2F0aW9uIG9uIHRvIGFsbCBteSBsaXN0ZW5lcnMKLQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBZGFwdGVyRmFjdG9yaWVzKE9iamVjdCBwcm9qZWN0KSB7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUucmVtb3ZlKHByb2plY3QpOwotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UucmVtb3ZlKHByb2plY3QpOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGZhY3RvcmllcyA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5OwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBmYWN0b3JpZXMubmV4dCgpOwotCQkJYWxsRmFjdG9yaWVzLnJlbW92ZShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlkaXNwb3NlRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KE9iamVjdCBwcm9qZWN0LCBFUGFja2FnZSBlUGFja2FnZSkgewotCQlpZiAoZVBhY2thZ2UgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5EeW5hbWljQWRhcHRlckZhY3RvcnlfRVJST1JfMCk7Ci0KLQkJcmV0dXJuIGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KHByb2plY3QsIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuaW5zdGFuY2UoKS5nZXREZXNjcmlwdG9ycyhlUGFja2FnZSwgdmlld0lEKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KE9iamVjdCBwcm9qZWN0LCBMaXN0IGRlc2NyaXB0b3JzKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsIHx8IGRlc2NyaXB0b3JzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGZhY3QgPSBudWxsOwotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJaWYgKGRlc2NyaXB0b3JzLnNpemUoKSA9PSAxKSB7Ci0JCQlkZXNjID0gKEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KDApOwotCQkJaWRlbnRpZmllciA9IGdldElkZW50aWZpZXIocHJvamVjdCwgZGVzYyk7Ci0JCQlhZGRMaXN0ZW5lcklmTmVjZXNzYXJ5KGlkZW50aWZpZXIpOwotCQkJaWYgKHByb2plY3QuZXF1YWxzKE5PX1BST0pFQ1QpIHx8IChpZGVudGlmaWVyICE9IG51bGwgJiYgaWRlbnRpZmllci5pc0VuYWJsZWQoKSkpCi0JCQkJcmV0dXJuIGRlc2MuY3JlYXRlSW5zdGFuY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdChkZXNjcmlwdG9ycy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQlkZXNjID0gKEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotCQkJaWRlbnRpZmllciA9IGdldElkZW50aWZpZXIocHJvamVjdCwgZGVzYyk7Ci0JCQlhZGRMaXN0ZW5lcklmTmVjZXNzYXJ5KGlkZW50aWZpZXIpOwotCQkJaWYgKHByb2plY3QuZXF1YWxzKE5PX1BST0pFQ1QpIHx8IChpZGVudGlmaWVyICE9IG51bGwgJiYgaWRlbnRpZmllci5pc0VuYWJsZWQoKSkpIHsKLQkJCQlmYWN0ID0gZGVzYy5jcmVhdGVJbnN0YW5jZSgpOwotCQkJCWlmIChmYWN0ICE9IG51bGwpCi0JCQkJCWZhY3Rvcmllcy5hZGQoZmFjdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZhY3Rvcmllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gbmV3IEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGRlc2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcihPYmplY3QgcHJvamVjdCwgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MpIHsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQlpZiAoaXNSZXNwZWN0aW5nQWN0aXZpdGllcygpICYmIHByb2plY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCWlkZW50aWZpZXIgPSBJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihkZXNjLmdldElEKCksIChJUHJvamVjdCkgcHJvamVjdCk7Ci0JCWVsc2UgaWYgKHByb2plY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCWlkZW50aWZpZXIgPSBFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGRlc2MuZ2V0SUQoKSwgKElQcm9qZWN0KSBwcm9qZWN0KTsKLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Jlc3BlY3RpbmdBY3Rpdml0aWVzKCkgewotCQlyZXR1cm4gcmVzcGVjdGluZ0FjdGl2aXRpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJJZk5lY2Vzc2FyeShJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZGVudGlmaWVyLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkuYWRkKGlkZW50aWZpZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTGlzdGVuaW5nVG8oSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIGdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpLmNvbnRhaW5zKGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5hYmxlbWVudElkZW50aWZpZXJzLgotCSAqLwotCXByb3RlY3RlZCBTZXQgZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkgewotCQlpZiAoZW5hYmxlbWVudElkZW50aWZpZXJzID09IG51bGwpCi0JCQllbmFibGVtZW50SWRlbnRpZmllcnMgPSBuZXcgSGFzaFNldCgpOwotCQlyZXR1cm4gZW5hYmxlbWVudElkZW50aWZpZXJzOwotCX0KLQotCXByaXZhdGUgU2V0IGVuYWJsZW1lbnRJZGVudGlmaWVyczsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpZGVudGlmaWVyQ2hhbmdlZChFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGlkZW50aWZpZXJFdmVudCkgewotCQlpZiAoaWRlbnRpZmllckV2ZW50Lmhhc0VuYWJsZWRDaGFuZ2VkKCkgfHwgaWRlbnRpZmllckV2ZW50Lmhhc0Z1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkKCkpIHsKLQkJCU9iamVjdCBwcm9qZWN0ID0gKChFbmFibGVtZW50SWRlbnRpZmllcikgaWRlbnRpZmllckV2ZW50LmdldElkZW50aWZpZXIoKSkuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXJlbW92ZUFkYXB0ZXJGYWN0b3JpZXMocHJvamVjdCk7Ci0JCQkJLyoKLQkJCQkgKiBmaW5hbCBOb3RpZmllciBub3RpZmllciA9IChOb3RpZmllcikgZ2V0Q2FjaGVkUm9vdHMoKS5nZXQocHJvamVjdCk7Ci0JCQkJICovCi0JCQkJLyogZm9yY2UgYSB2aWV3ZXIgcmVmcmVzaCAqLwotCQkJCW5vdGlmeUNoYW5nZWQobmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnVsbCkgewotCi0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldE5vdGlmaWVyKCkKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aWZpZXI7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCS8qIGVsc2UgcmVwbGFjZSBlbnRpcmUgc3RydWN0dXJlICovCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9IG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VNRldvcmtiZW5jaEVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VNRldvcmtiZW5jaEVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwOWIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlBhc3N0aHJ1UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfRkFDVE9SSUVTX0VYVEVOU0lPTl9QT0lOVCA9ICJlZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9FWFRFTlNJT05fUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UID0gImVkaXRNb2RlbEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0ZBQ1RPUllfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UID0gImFkYXB0ZXJGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRU1GV29ya2JlbmNoRWRpdFBsdWdpbiBwbHVnaW47IAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlFeHRlbmRlZEVjb3JlVXRpbC5zZXRGaWxlTm90Rm91bmREZXRlY3RvcihuZXcgRXh0ZW5kZWRFY29yZVV0aWwuRmlsZU5vdEZvdW5kRGV0ZWN0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNSZXNvdXJjZU5vdEZvdW5kKHdyYXBwZWRFeCkgfHwgd3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCQkJfQotCQl9KTsKLQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaW5pdGlhbGl6ZUZpbGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSXNvbGF0ZWRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgUGFzc3RocnVSZXNvdXJjZVNldChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGNyZWF0ZVdvcmtzcGFjZVBhc3N0aHJ1UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBuZXcgUGFzc3RocnVSZXNvdXJjZVNldCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJkNjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQ2xpZW50QWNjZXNzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBDb21tYW5kU3RhY2tMaXN0ZW5lciwgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIE1hcCBwYXJhbXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdE1vZGVsSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OwotCS8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCByZXNvdXJjZSB1cmlzIHdlIG5lZWQgdG8gdHJhY2sKLQlwcm90ZWN0ZWQgTGlzdCBrbm93blJlc291cmNlVXJpczsKLQkvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgcmVzb3VyY2UgZXh0ZW5zaW9ucyB0byB0cmFjawotCXByb3RlY3RlZCBMaXN0IGtub3duUmVzb3VyY2VFeHRlbnNpb25zOwotCS8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMsIHdoaWNoIHdlIGhhdmUgcmVxdWVzdGVkIGJlIGF1dG9sb2FkZWQKLQlwcm90ZWN0ZWQgTGlzdCBwcmVsb2FkUmVzb3VyY2VVcmlzOwotCS8vIFRoaXMgaXMgYSBtYXAgb2YgaWRlbnRpZmllcnMgdG8gcmVzb3VyY2VzIHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8gaW4gb3JkZXIgdG8gbGlzdGVuIGZvcgotCS8vIHVwZGF0ZXMgdG8gdGhlIGVkaXQgbW9kZWwgcmVzb3VyY2VzCi0JcHJvdGVjdGVkIE1hcCByZXNvdXJjZUlkZW50aWZpZXJzOwotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbEV2ZW50IGRpcnR5TW9kZWxFdmVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcG9zaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7Ci0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXZlcnRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBDbGllbnRBY2Nlc3NSZWdpc3RyeSByZWdpc3RyeTsKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBlbWZDb250ZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQlwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb247Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmICghaXNEaXNwb3NpbmcoKSAmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKLQkJCQlyZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkQm9vbGVhblZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdCb29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlYWRPbmx5KSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFTUYgY29udGV4dCBjYW4ndCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lZGl0TW9kZWxJRCA9IGVkaXRNb2RlbElEOwotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCWlmIChyZWFkT25seSkKLQkJCXRoaXMucmVnaXN0cnkgPSBuZXcgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSgpOwotCQllbHNlCi0JCQl0aGlzLnJlZ2lzdHJ5ID0gbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5KCk7Ci0JCXRoaXMuZW1mQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMucHJvamVjdCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOwotCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKLQkJcHJvY2Vzc0xvYWRlZFJlc291cmNlcygpOwotCQlwcm9jZXNzUHJlbG9hZFJlc291cmNlcygpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gcmVhZE9ubHksIGJvb2xlYW4gYWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkpIHsKLQkJdGhpcyhlZGl0TW9kZWxJRCwgY29udGV4dCwgcmVhZE9ubHkpOwotCQl0aGlzLmFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzID0gYWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBlZGl0TW9kZWxJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdE1vZGVsSUQoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWxJRDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2luZygpIHsKLQkJcmV0dXJuIGRpc3Bvc2luZzsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgbWFkZQotCSAqIGZpbmFsIGluIHRoZSBuZXh0IHJlbGVhc2UuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGRvRGlzcG9zZSgpIGFzCi0JICogbmVjZXNzYXJ5IHRvIGRpc3Bvc2UgYW55IGFkZGl0aW9uYWwgYXJ0aWZhY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzcG9zaW5nIHx8IGRpc3Bvc2VkKQotCQkJCXJldHVybjsKLQkJCWRpc3Bvc2luZyA9IHRydWU7Ci0JCQotCQkJaWYgKGhhc0xpc3RlbmVycygpKQotCQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UsIHRoaXMpKTsKLQkJCQotCQkJcmVsZWFzZVJlc291cmNlcygpOwotCi0JCQlpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0JCQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGdldEVtZkNvbnRleHQoKSAhPSBudWxsKQotCQkJCWdldEVtZkNvbnRleHQoKS5yZW1vdmVFZGl0TW9kZWwodGhpcywgaXNSZWFkT25seSgpKTsKLQkJCXJlbGVhc2VQcmVsb2FkUmVzb3VyY2VzKCk7Ci0JCQlyZWxlYXNlSWRlbnRpZmllcnMoKTsKLQkJCWRvRGlzcG9zZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocmUpOwotCQl9IGZpbmFsbHkgewotCQkJZW1mQ29udGV4dCA9IG51bGw7Ci0JCQlyZXNvdXJjZXMgPSBudWxsOwotCQkJcHJvamVjdCA9IG51bGw7Ci0JCQlkaXNwb3NlZCA9IHRydWU7Ci0JCQlkaXNwb3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGlzcG9zZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlSWRlbnRpZmllcnMoKSB7Ci0JCWlmIChyZXNvdXJjZUlkZW50aWZpZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUlkZW50aWZpZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZGVudGlmaWVyID0gKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0JCQlpZGVudGlmaWVyLnJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKSB7Ci0JCWlmIChlbWZDb250ZXh0ID09IG51bGwgfHwgIWVtZkNvbnRleHQuaGFzUmVzb3VyY2VTZXQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKTsKLQkJaWYgKHN5bmMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsb2FkUmVzb3VyY2VVcmlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVVJJIHVyaSA9IChVUkkpIHByZWxvYWRSZXNvdXJjZVVyaXMuZ2V0KGkpOwotCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKHVyaSk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUmVzb3VyY2VFeHRlbnNpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGV4dCA9IChTdHJpbmcpIGtub3duUmVzb3VyY2VFeHRlbnNpb25zLmdldChpKTsKLQkJCQlzeW5jLmRpc2FibGVBdXRvbG9hZChleHQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKiogKiogQkVHSU4gQ29tbWFuZCBTdGFjayBNYW5pcHVsYXRpb24gKioqICovCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNDb21tYW5kU3RhY2sgY3JlYXRlQ29tbWFuZFN0YWNrKCkgewotCQlCYXNpY0NvbW1hbmRTdGFjayBzdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCQlyZXR1cm4gc3RhY2s7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUge0BsaW5rb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja30ncyBzdGF0ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGphdmEudXRpbC5FdmVudE9iamVjdCBldmVudCkgewotCQlpZiAoZGlydHlNb2RlbEV2ZW50ID09IG51bGwpCi0JCQlkaXJ0eU1vZGVsRXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuRElSVFksIHRoaXMpOwotCQlpZiAoaGFzTGlzdGVuZXJzKCkpCi0JCQlub3RpZnlMaXN0ZW5lcnMoZGlydHlNb2RlbEV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBGbHVzaCB0aGUgQ29tbWFuZHMgZnJvbSB0aGUgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZsdXNoQ29tbWFuZFN0YWNrKCkgewotCQlnZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQlnZXRDb21tYW5kU3RhY2soKS5zYXZlSXNEb25lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JcHVibGljIEJhc2ljQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJaWYgKGNvbW1hbmRTdGFjayA9PSBudWxsKSB7Ci0JCQljb21tYW5kU3RhY2sgPSBjcmVhdGVDb21tYW5kU3RhY2soKTsKLQkJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZFN0YWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCX0KLQotCS8qKiAqKiBFTkQgQ29tbWFuZCBTdGFjayBNYW5pcHVsYXRpb24gKioqICovCi0KLQkvKiogKiogQkVHSU4gTGlzdGVuZXJzICoqKiAqLwotCi0JLyoqCi0JICogQWRkCi0JICogCi0JICogQGFMaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoRWRpdE1vZGVsTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCWlmIChhTGlzdGVuZXIgIT0gbnVsbCkKLQkJCWxpc3RlbmVycy5hZGQoYUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCi0JICogCi0JICogQGFuRXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCi0JCU5vdGlmeVJ1bm5lciBub3RpZmllciA9IG5ldyBOb3RpZnlSdW5uZXIoYW5FdmVudCk7IAotCQkKLQkJT2JqZWN0W10gbm90aWZ5TGlzdCA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm90aWZ5TGlzdC5sZW5ndGg7IGkrKykgewotCQkJbm90aWZpZXIuc2V0TGlzdGVuZXIoIChFZGl0TW9kZWxMaXN0ZW5lcikgbm90aWZ5TGlzdFtpXSApOwotCQkJU2FmZVJ1bm5lci5ydW4obm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlCi0JICogCi0JICogQGFMaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiogKiogRU5EIExpc3RlbmVycyAqKiogKi8KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VGaWxlRWRpdGFibGUoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFGaWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLnNldFJlYWRPbmx5KGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIElGaWxlOyBhbnkgcmVhZC1vbmx5IGZpbGVzIHRoYXQgd2lsbCBiZSB0b3VjaGVkIGlmIHRoaXMgZWRpdCBtb2RlbAotCSAqICAgICAgICAgc2F2ZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWFkT25seUFmZmVjdGVkRmlsZXMoKSB7Ci0JCUl0ZXJhdG9yIGFmZmVjdGVkID0gZ2V0QWZmZWN0ZWRGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoYWZmZWN0ZWQuaGFzTmV4dCgpKSB7Ci0JCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgYWZmZWN0ZWQubmV4dCgpOwotCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHkoKSkKLQkJCQlyZXN1bHQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKiAqKiBCRUdJTiBTYXZlIEhhbmRsZXJzICoqKiAqLwotCi0JcHJvdGVjdGVkIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVyUmVnaXN0ZXIuZ2V0U2F2ZUhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIHNhdmVJZk5lY2Vzc2FyeSBvcgotCSAqIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQgZGV0ZXJtaW5lcyBub3QgdG8gc2F2ZS4gVGhpcyBwcm92aWRlcyBzdWJjbGFzc2VzIHdpdGggYW4KLQkgKiBvcHBvcnR1bml0eSB0byBkbyBzb21lIG90aGVyIGFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZShudWxsLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvciB7Ci0JCS8vIHNhdmUKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB7QGxpbmsgI3ByaW1TYXZlfQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJYXNzZXJ0UGVybWlzc2lvblRvU2F2ZShhY2Nlc3NvcktleSk7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlKGFNb25pdG9yKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuU2F2ZU9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKLQkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeShudWxsLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoc2hvdWxkU2F2ZSgpKQotCQkJc2F2ZShtb25pdG9yLCBhY2Nlc3NvcktleSk7Ci0JCWVsc2UKLQkJCWhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCi0JICogCi0JICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKLQkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KG51bGwsIG9wZXJhdGlvbkhhbmRsZXIsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLiBZb3UgbWF5IHBhc3MgaW4gYSBib29sZWFuIDxjb2RlPndhc0RpcnR5PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgZWRpdCBtb2RlbCB3YXMgZGlydHkgcHJpb3IgdG8gbWFraW5nIGFueSBjaGFuZ2VzIGFuZAotCSAqICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIHRoaXMgbWV0aG9kLiB7QGxpbmsgRWRpdE1vZGVsI2lzRGlydHkoKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHksIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KG51bGwsIG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5LCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCi0JICogCi0JICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKLQkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobW9uaXRvciwgb3BlcmF0aW9uSGFuZGxlciwgdHJ1ZSwgYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZQotCSAqIAotCSAqIEBvcGVyYXRpb25IYW5kbGVyLiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgdGhlIGVudGlyZSBlZGl0IG1vZGVsCi0JICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhpcyBlZGl0IG1vZGVsIHdhcyBkaXJ0eSBwcmlvciB0byBtYWtpbmcgYW55IGNoYW5nZXMgYW5kCi0JICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBib29sZWFuIHdhc0RpcnR5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQlpZiAoc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyLCB3YXNEaXJ0eSkpCi0JCQlzYXZlKG1vbml0b3IsIGFjY2Vzc29yS2V5KTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQZXJtaXNzaW9uVG9TYXZlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXJlZ2lzdHJ5LmFzc2VydEFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuU2F2ZU9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFNhdmVGYWlsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBib29sZWFuIHdhc0RpcnR5KSB7Ci0JCXJldHVybiAhd2FzRGlydHkgPyBzaG91bGRTYXZlKCkgOiBzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB1cmkgZm9yCi0JICogCi0JICogQGFSZXNvdXJjZSBpcyBvbmUgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZVVyaShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKFVSSSByZXNVUkkpIHsKLQkJVVJJIHVyaTsKLQkJTGlzdCB1cmlTdHJpbmdzID0gZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlTdHJpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQl1cmkgPSAoVVJJKSB1cmlTdHJpbmdzLmdldChpKTsKLQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5lbmRzV2l0aChyZXNVUkksIHVyaSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGFkZCBVUklzICh0eXBlIFVSSSkgb2Yga25vd24gcmVzb3VyY2VzLiBZb3UgbXVzdCBhZGQgcmVzb3VyY2VzCi0JICogdGhhdCBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIga25vd24gcmVzb3VyY2VzIGZpcnN0IHNvIHRoZXkgd2lsbCBiZSByZWxlYXNlZCBmaXJzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKSB7Ci0JCWtub3duUmVzb3VyY2VVcmlzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcmVsb2FkUmVzb3VyY2VVcmlzID0gbmV3IEFycmF5TGlzdCgpOwotCQlFZGl0TW9kZWxSZXNvdXJjZSByZXMgPSBudWxsOwotCQlDb2xsZWN0aW9uIGVkaXRNb2RlbFJlc291cmNlcyA9IEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGdldEVkaXRNb2RlbElEKCkpOwotCQlJdGVyYXRvciBpdGVyID0gZWRpdE1vZGVsUmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJcmVzID0gKEVkaXRNb2RlbFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWFkZEVkaXRNb2RlbFJlc291cmNlKHJlcyk7Ci0JCX0KLQkJQ29sbGVjdGlvbiByZXNvdXJjZUV4dGVuc2lvbnMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVkaXRNb2RlbEV4dGVuc2lvbnMoZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCS8qIGJ1ZyAxNzA2OTAgLSBpbml0aWFsaXplIGtub3duUmVzb3VyY2VFeHRlbnNpb25zIGlmIG5lY2Vzc2FyeSwgYW5kIGNoYW5nZSByZWZlcmVuY2UgZnJvbSBpdGVyIHRvIGl0ICovCi0JCWlmIChrbm93blJlc291cmNlRXh0ZW5zaW9ucyA9PSBudWxsKQotCQl7Ci0JCQlrbm93blJlc291cmNlRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAoIXJlc291cmNlRXh0ZW5zaW9ucy5pc0VtcHR5KCkpCi0JCXsKLQkJCWtub3duUmVzb3VyY2VFeHRlbnNpb25zLmFkZEFsbChyZXNvdXJjZUV4dGVuc2lvbnMpOwotCQkJSXRlcmF0b3IgaXQgPSByZXNvdXJjZUV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZChpdC5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWRpdE1vZGVsUmVzb3VyY2UoRWRpdE1vZGVsUmVzb3VyY2UgcmVzKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKHJlcy5pc0NvcmUoKSkgewotCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IHJlcy5nZXRFbmFibGVtZW50SWRlbnRpZmllcihnZXRQcm9qZWN0KCkpOwotCQkJCXJlZ2lzdGVySW50ZXJlc3QoaWRlbnRpZmllciwgcmVzKTsKLQkJCQllbmFibGVkID0gaWRlbnRpZmllci5pc0VuYWJsZWQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcocmUpOwotCQl9Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQkJa25vd25SZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQlpZiAocmVzLmlzQXV0b0xvYWQoKSkgewotCQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZCh1cmkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW50ZXJlc3QoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsIEVkaXRNb2RlbFJlc291cmNlIHJlcykgewotCQlnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWRlbnRpZmllcikuYWRkKHJlcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEVkaXRNb2RlbFJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlpZiAocmVzb3VyY2VJZGVudGlmaWVycyA9PSBudWxsKQotCQkJcmVzb3VyY2VJZGVudGlmaWVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgdFJlc291cmNlcyA9IChMaXN0KSByZXNvdXJjZUlkZW50aWZpZXJzLmdldChpZGVudGlmaWVyKTsKLQkJaWYgKHRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCQlyZXNvdXJjZUlkZW50aWZpZXJzLnB1dChpZGVudGlmaWVyLCB0UmVzb3VyY2VzKTsKLQkJCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0UmVzb3VyY2VzOwotCX0KLQotCi0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0S25vd25SZXNvdXJjZVVyaXMoKSB7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7Ci0KLQkJcmV0dXJuIGtub3duUmVzb3VyY2VVcmlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gcmVnaXN0cnkuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2NhY2hlTm9uUmVzb3VyY2VWYWxpZGF0ZVN0YXRlKExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdGF0ZVZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7Ci0JCWlmIChzdGF0ZVZhbGlkYXRvciA9PSBudWxsKQotCQkJc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOwotCQlyZXR1cm4gc3RhdGVWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZVN0YXRlVmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2xvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciN2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkudmFsaWRhdGVTdGF0ZShwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IGZyb20gdGhlIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXNvdXJjZVNldCA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiBoYXNMaXN0ZW5lcnMoKSkgewotCQkJaW50IGV2ZW50Q29kZSA9IG5ld1ZhbHVlID8gRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFIDogRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0U7Ci0JCQlFZGl0TW9kZWxFdmVudCBldnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoZXZlbnRDb2RlLCB0aGlzKTsKLQkJCWV2dC5hZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldE9yQ3JlYXRlUmVzb3VyY2UoYVVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7Ci0JCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQkJLy8gV2UgbmVlZCBhIGJldHRlciB3YXkgdG8gcGFzcyB0aGlzIHRocm91Z2ggdGhlIHNhdmUgb3B0aW9ucyBpbnN0ZWFkLgotCQkJCS8vIFdlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSB7Ci0JCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQl9Ci0KLQkJCWFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZSBmb3IKLQkgKiAKLQkgKiBAYVVyaS4KLQkgKi8KLQkvLyBUT0RPIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgb25seSB1c2UgdGhlIGxhc3Qgc2VnbWVudCB3aGVuIGxvb2tpbmcgZm9yIGEgcmVzb3VyY2UuCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKExpc3QgdFJlc291cmNlcywgVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc291cmNlLmdldFVSSSgpLCBhVXJpKSkKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcHJvY2Vzc1Jlc291cmNlKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGNhY2hlZCBSZXNvdXJjZSwgZWl0aGVyIGxvY2FsIG9yIGluIHRoZSBSZXNvdXJjZVNldCwgYmVmb3JlIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMKLQkgKiBhcGkgaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBkZW1hbmQgbG9hZCB0aGF0IGZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShVUkkgYVVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChudWxsICE9IHJlc291cmNlICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsgLy8gcmVsb2FkIGl0Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRMb2NhbFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwgYVVyaSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgUmVhZE9ubHkgRWRpdE1vZGVsIG9yIGlmIHdlIHNob3VsZCBvbmx5IGFjY2VzcyB1bmtub3duIFVSSXMgYXMKLQkgKiBSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2Nlc3NGb3JSZWFkKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHkoKSB8fCAoYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgJiYgIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpbnQgY29kZSA9IGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCWlmICghaXNSZXZlcnRpbmcgJiYgaGFzUmVzb3VyY2VSZWZlcmVuY2UoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpKQotCQkJCQlyZW1vdmVSZXNvdXJjZXMoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSA6Ci0JCQkJaWYgKCFwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCi0JCQkJCXJldHVybjsKLQkJfQotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCWFuRXZlbnQuc2V0RWRpdE1vZGVsKHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYW55IFJlc291cmNlIGluIHRoZSBsaXN0IG9mCi0JICogCi0JICogQHJlc291cmNlcyBpcyByZWZlcmVuY2VkIGJ5IG1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKExpc3QgdFJlc291cmNlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZSgoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgUmVzb3VyY2Ugb2JqZWN0cyBpbgotCSAqIAotCSAqIEBhTGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb25lIG9yIG1vcmUgUmVzb3VyY2Ugb2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQotCSAqICAgICAgICAgUmVzb3VyY2VTZXQgd2l0aG91dCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvaW5nIHRvIHplcm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKExpc3QgYUxpc3QpIHsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGFMaXN0LmdldChpKTsKLQkJCWlmIChyZW1vdmVSZXNvdXJjZShyZXMpICYmIHJlcyBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKLQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVmZXJlbmNlZFJlc291cmNlIHJlZmVyZW5jZWRSZXNvdXJjZSkgewotCQlpZiAoIWlzUmVhZE9ubHkoKSAmJiByZWZlcmVuY2VkUmVzb3VyY2Uud2FzUmV2ZXJ0ZWQoKSkgewotCQkJaXNSZXZlcnRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXZlcnRlZChyZWZlcmVuY2VkUmVzb3VyY2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1JldmVydGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRMb2NhbFJlc291cmNlKHVyaSk7Ci0JCXJldHVybiByZW1vdmVSZXNvdXJjZShyZXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBvc3QgcHJvY2VzcyBhIHJlbW92ZWQgUmVmZXJlbmNlZFJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbCNyZXZlcnRBbGxSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldmVydGVkKFJlZmVyZW5jZWRSZXNvdXJjZSByZXZlcnRlZFJlc291cmNlKSB7Ci0JCXJldmVydEFsbFJlc291cmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldmVydEFsbFJlc291cmNlcygpIHsKLQkJTGlzdCBzb21lUmVzb3VyY2VzID0gZ2V0U29ydGVkUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29tZVJlc291cmNlcy5zaXplKCk7IGkrKykKLQkJCSgoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpKS51bmxvYWQoKTsKLQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHNvbWVSZXNvdXJjZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspCi0JCQkoKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ3JvdXAgdGhlIHJlc291cmNlcyBieSBYTUkgZmlyc3QsIHRoZW4gWE1MCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U29ydGVkUmVzb3VyY2VzKCkgewotCi0JCUxpc3QgdGhlUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWludCBzaXplID0gdGhlUmVzb3VyY2VzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlSZXNvdXJjZVtdIHNvcnRlZCA9IG5ldyBSZXNvdXJjZVtzaXplXTsKLQkJaW50IHhtbEluc2VydFBvcyA9IHNpemUgLSAxOwotCQlpbnQgeG1pSW5zZXJ0UG9zID0gMDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQkJc29ydGVkW3htbEluc2VydFBvcy0tXSA9IHJlczsKLQkJCWVsc2UKLQkJCQlzb3J0ZWRbeG1pSW5zZXJ0UG9zKytdID0gcmVzOwotCQl9Ci0KLQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qoc29ydGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIFJlc291cmNlcyB0aGF0IHdlIGFyZSBpbnRlcnJlc3RlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChMaXN0IHNvbWVSZXNvdXJjZXMpIHsKLQkJaW50IHNpemUgPSBzb21lUmVzb3VyY2VzLnNpemUoKTsKLQkJUmVzb3VyY2UgcmVzOwotCQlib29sZWFuIHByb2Nlc3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmICgocmVzICE9IG51bGwpICYmIChpc0ludGVycmVzdGVkSW5SZXNvdXJjZShyZXMpKSkgewotCQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOwotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NlZDsKLQl9Ci0KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dCBnZXRFbWZDb250ZXh0KCkgewotCQlpZiAoaXNEaXNwb3NlZCgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRWRpdCBNb2RlbCBhbHJlYWR5IGRpc3Bvc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVNRiBjb250ZXh0IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW1mQ29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZGlzcG9zZWQ7Ci0JfQotCi0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEVNRldvcmtiZW5jaENvbnRleHQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZWdpc3RyeS5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIEFjY2VzcwotCSAqIAotCSAqIEBhUmVzb3VyY2UgZm9yIHJlYWQgb3Igd3JpdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXNzKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHNob3VsZEFjY2Vzc0ZvclJlYWQoYVJlc291cmNlKSkKLQkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JSZWFkKCk7Ci0JCWVsc2UKLQkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JXcml0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBlYWNoIGNsaWVudCB3aGVuIHRoZXkgYXJlIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCB0aGUKLQkgKiBFZGl0TW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQlyZWdpc3RyeS5yZWxlYXNlKGFjY2Vzc29yS2V5KTsKLQotCQlpZiAoIWlzRGlzcG9zaW5nKCkpIHsKLQkJCWJvb2xlYW4gc2hvdWxkRGlzcG9zZSA9IGZhbHNlOwotCQkJc2hvdWxkRGlzcG9zZSA9IHJlZ2lzdHJ5LnNpemUoKSA9PSAwOwotCQkJaWYgKHNob3VsZERpc3Bvc2UpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0KLQkJcmVtb3ZlUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKLQkJCXJlbGVhc2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJYVJlc291cmNlLnJlbGVhc2VGcm9tUmVhZCgpOwotCQllbHNlCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21Xcml0ZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgewotCQlMaXN0IHRSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVsZWFzZShyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlcyA9PSBudWxsIHx8ICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKQotCQkJcmV0dXJuOwotCQlnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkuYWRkKGFSZXNvdXJjZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpIHsKLQkJaWYgKHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPT0gbnVsbCkKLQkJCXJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlyZXR1cm4gcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbjsKLQl9Ci0KLQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UsIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldCwgYW5kIGRlbGV0ZSBpdHMgZmlsZSBmcm9tCi0JICogdGhlIFdvcmtiZW5jaC4gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgcmVmZXJlbmNlIHRvCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltRGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChwcmltRmx1c2hSZXNvdXJjZShhUmVzb3VyY2UpKSB7Ci0JCQl0cnkgewotCQkJCWdldEVtZkNvbnRleHQoKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KLQkJCX0KLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOwotCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBteSByZWZlcmVuY2UgdG8gYVJlc291cmNlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHZvaWQgZmx1c2hSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHByaW1GbHVzaFJlc291cmNlKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOwotCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJU2V0IGFTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1vZlJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZlJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgYVJlc291cmNlID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJSUZpbGUgb3V0cHV0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShhUmVzb3VyY2UpOwotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCWFTZXQuYWRkKG91dHB1dCk7Ci0JCX0KLQkJcmV0dXJuIGFTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVzZXRLbm93blJlc291cmNlVXJpcygpIHsKLQotCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKLQotCQlyZXR1cm4ga25vd25SZXNvdXJjZVVyaXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCg1KTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VVUklzKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKGJvb2xlYW4gb25seURpcnR5KSB7Ci0JCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQlpbnQgZGlydHlDb3VudCA9IDA7Ci0JCVN0cmluZ1tdIHVyaXMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoIW9ubHlEaXJ0eSkKLQkJCQl1cmlzW2ldID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQllbHNlIGlmIChyZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJdXJpc1tpXSA9IHJlcy5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCWRpcnR5Q291bnQrKzsKLQkJCX0KLQkJfQotCQlpZiAob25seURpcnR5ICYmIGRpcnR5Q291bnQgPiAwKSB7Ci0JCQlTdHJpbmdbXSBkaXJ0eSA9IG5ldyBTdHJpbmdbZGlydHlDb3VudF07Ci0JCQlpbnQgaiA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodXJpc1tpXSAhPSBudWxsKSB7Ci0JCQkJCWRpcnR5W2pdID0gdXJpc1tpXTsKLQkJCQkJaisrOwotCQkJCX0KLQkJCX0KLQkJCXVyaXMgPSBkaXJ0eTsKLQkJfQotCQlyZXR1cm4gdXJpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBleHRlbnQgb2YgdGhlIHJlc291cmNlOyBsb2dzIGFuIGVycm9yIGFuZCByZXR1cm5zIG51bGwgaWYKLQkgKiB0aGUgZXh0ZW50IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChSZXNvdXJjZSBhUmVzb3VyY2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCWFSZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJaWYgKGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShlKSAmJiBzaG91bGRTYXZlUmVhZE9ubHkoYVJlc291cmNlKSkKLQkJCXNhdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQllbHNlCi0JCQlwcmltSGFuZGxlU2F2ZUZhaWxlZChhUmVzb3VyY2UsIGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbnlSZXNvdXJjZURpcnR5KCkgewotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoKChSZXNvdXJjZSkgbGlzdC5nZXQoaSkpLmlzTW9kaWZpZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBzYXZlIGlzIG5lZWRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGlzQW55UmVzb3VyY2VEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVySGVhZGxlc3MuaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB5b3UgY2FuIG9ubHkgcmVhZCB0aGUgcmVzb3VyY2VzIGFuZCBub3Qgd3JpdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHlGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVhZE9ubHlSZXNvdXJjZSgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQlJRmlsZSBmaWxlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVJlc291cmNlKFVSSSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlUmVzb3VyY2UoU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoYVVyaSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZSBhbmQgaXQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNUb1NhdmUoKSB7Ci0JCXJldHVybiAhaXNTaGFyZWQoKSAmJiBpc0RpcnR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldC4gUmV0dXJuIHRydWUgaWYgYVJlc291cmNlCi0JICogd2FzIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUZsdXNoUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBoYXNSZXNvdXJjZVJlZmVyZW5jZShhUmVzb3VyY2UpKSB7Ci0JCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJcmVtb3ZlUmVzb3VyY2VTZXRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZVNhdmVGYWlsZWQoUmVzb3VyY2UgYVJlc291cmNlLCBFeGNlcHRpb24gZSkgewotCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQlFeGNlcHRpb24gbmVzdGVkID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJV0ZUV3JhcHBlZEV4Y2VwdGlvbikKLQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIGUpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQllbHNlCi0JCQluZXN0ZWQgPSBlOwotCi0JCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2Vycm9yX29jY3VycmVkX3doaWxlX3NhX0VSUk9SXyIpLCBuZXN0ZWQpOyAvLyROT04tTkxTLTEkID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZy4iCi0JfQotCi0JLyoqCi0JICogUHJvbXB0IGZvciBhIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0VG9TYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJaWYgKG9wZXJhdGlvbkhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9wZXJhdGlvbkhhbmRsZXIuY2FuQ29udGludWUoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfIiksIGdldFJlc291cmNlVVJJcyh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PyIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlkZWxldGVSZXNvdXJjZXNJZk5lY2Vzc2FyeSgpOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJaWYgKGdldFJlc291cmNlcygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsgLy8gbm90aGluZyB0byBzYXZlCi0JCUxpc3QgbG9jYWxSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGxvY2FsUmVzb3VyY2VzLmdldChpKTsKLQkJCXNhdmVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCX0KLQkJZ2V0Q29tbWFuZFN0YWNrKCkuc2F2ZUlzRG9uZSgpOwotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlNBVkUsIHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9PSBudWxsIHx8IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24uc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlIGRlYWRyZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24oKS5zaXplKCk7IGkrKykgewotCQkJZGVhZHJlcyA9IChSZXNvdXJjZSkgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLmdldChpKTsKLQkJCXByaW1EZWxldGVSZXNvdXJjZShkZWFkcmVzKTsKLQotCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlYWRyZXMpOwotCQkJZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLnJlbW92ZShkZWFkcmVzKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKiBTYXZlCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQotCQkJYVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHJlc291cmNlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCkgewotCQlMaXN0IGxvYWRlZCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmICghbG9hZGVkLmlzRW1wdHkoKSkKLQkJCXByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKGxvYWRlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcmVsb2FkUmVzb3VyY2VzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCVVSSSB1cmkgPSAoVVJJKSBwcmVsb2FkUmVzb3VyY2VVcmlzLmdldChpKTsKLQkJCWdldFJlc291cmNlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYVJlc291cmNlIGZyb20gbXkgUmVzb3VyY2VTZXQuIFJldHVybiB0cnVlIGlmIGFSZXNvdXJjZSB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZVNldFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlhUmVzb3VyY2UuZVNldERlbGl2ZXIoZmFsc2UpOwotCQlhUmVzb3VyY2UudW5sb2FkKCk7Ci0JCWFSZXNvdXJjZS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlwcmltU2F2ZVJlc291cmNlKHJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZVNhdmVGYWlsZWQocmVzb3VyY2UsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZSgpIHsKLQkJcmV0dXJuICFpc1JlYWRPbmx5KCkgJiYgIWlzU2hhcmVkKCk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCXJldHVybiBzaG91bGRTYXZlKCkgfHwgcHJvbXB0VG9TYXZlKG9wZXJhdGlvbkhhbmRsZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmVSZWFkT25seShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCWlmIChhRmlsZSA9PSBudWxsIHx8ICFhRmlsZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlTG9hZEtub3duUmVzb3VyY2VzKCkgewotCQlMaXN0IHVyaXMgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlVUkkgdXJpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7Ci0JCQl1cmkgPSAoVVJJKSB1cmlzLmdldChpKTsKLQkJCWdldFJlc291cmNlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4geW91IHdhbnQgdG8gZXh0ZW5kIHRoaXMgZWRpdCBtb2RlbCB0byBoYW5kbGUgYSByZXNvdXJjZQotCSAqIHdpdGggYSBVUkkgZXF1YWwgdG8gPGNvZGU+YVJlbGF0aXZlVVJJPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYW5hZ2VFeHRlbnNpb25SZXNvdXJjZVVSSShTdHJpbmcgYVJlbGF0aXZlVVJJKSB7Ci0JCWlmIChhUmVsYXRpdmVVUkkgIT0gbnVsbCAmJiBhUmVsYXRpdmVVUkkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhUmVsYXRpdmVVUkkpOwotCQkJaWYgKCFpc0ludGVycmVzdGVkSW5SZXNvdXJjZVVyaSh1cmkpKSB7Ci0JCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKS5hZGQodXJpKTsKLQkJCQkvLyBQcm9jZXNzIHRoZSByZXNvdXJjZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2UodXJpKTsKLQkJCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgY2FjaGVkIFJlc291cmNlIG9yIHRyeSB0byBsb2FkIHRoZSBSZXNvdXJjZSBwcmlvciB0byBjcmVhdGluZyBhIFJlc291cmNlLiBUaGlzIGFwaQotCSAqIGhhbmRsZXMgdGhlIGNhc2UgdGhhdCB0aGUgUmVzb3VyY2UgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBsb2FkLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcygpIHsKLQkJcmV0dXJuIGFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGlzIGFwaSB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IGFsbCB1bmtub3duIFJlc291cmNlcyB0byBiZSBhY2Nlc3NlZCBmb3IgUmVhZE9ubHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhib29sZWFuIGIpIHsKLQkJYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgPSBiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJYnVmZmVyLmFwcGVuZCgiIFIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCIgVyA9ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoZ2V0UmVnaXN0cnkoKS5zaXplKCkpOwotCQlidWZmZXIuYXBwZW5kKCJbSUQ6IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgS25vd24gUmVzb3VyY2VzOiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCB1cmlzID0gZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJaWYgKHVyaXMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8ICh1cmlzLnNpemUoKSAtIDEpOyBpKyspCi0JCQkJYnVmZmVyLmFwcGVuZCh1cmlzLmdldChpKSArICIsICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHVyaXMuZ2V0KGkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm5vbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xpZW50QWNjZXNzUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUmVmZXJlbmNlIHsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIHRvc3RyaW5nID0gbnVsbDsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b3N0cmluZyA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkVkaXRNb2RlbC5SZWZlcmVuY2UgWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJ9IHsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgifV0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRvc3RyaW5nID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdG9zdHJpbmc7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAtIGJ5IGRlZmF1bHQgdGhpcyB3aWxsIHJldHVybiB0aGUgZmlyc3Qgcm9vdCBvYmplY3QgZnJvbSB0aGUgZmlyc3QKLQkgKiByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZSBrbm93biByZXNvdXJjZSBVUklzIGZvciB0aGlzIEVkaXRNb2RlbAotCSAqIAotCSAqIEByZXR1cm4gYW4gRU9iamVjdCBvciBOdWxsCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UHJpbWFyeVJvb3RPYmplY3QoKSB7Ci0JCVJlc291cmNlIHJlcyA9IGdldFByaW1hcnlSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwgfHwgcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIC0gYnkgZGVmYXVsdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZQotCSAqIGtub3duIHJlc291cmNlIFVSSXMgZm9yIHRoaXMgRWRpdE1vZGVsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRQcmltYXJ5UmVzb3VyY2UoKSB7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQotCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJaWYgKGtub3duUmVzb3VyY2VVcmlzID09IG51bGwgfHwga25vd25SZXNvdXJjZVVyaXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVVJJIHVyaSA9IChVUkkpIGtub3duUmVzb3VyY2VVcmlzLmdldCgwKTsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpZGVudGlmaWVyQ2hhbmdlZChFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCkgewotCQlpZiAoZXZ0Lmhhc0VuYWJsZWRDaGFuZ2VkKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19BQk9VVF9UT19DSEFOR0UsIHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGVkaXRNb2RlbEV2ZW50KTsKLQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZCA9IGV2dC5nZXRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoaWQuaXNFbmFibGVkKCkpCi0JCQkJYWRkS25vd25SZXNvdXJjZXMoaWQpOwotCQkJZWxzZQotCQkJCXJlbW92ZUtub3duUmVzb3VyY2VzKGlkKTsKLQkJCWVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19DSEFOR0VELCB0aGlzKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhlZGl0TW9kZWxFdmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7Ci0JCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKLQkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOwotCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7Ci0JCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMucmVtb3ZlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCX0KLQkJCWtub3duUmVzb3VyY2VVcmlzLnJlbW92ZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlyZW1vdmVSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCX0KLQotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgYWRkS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7Ci0JCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKLQkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOwotCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJcHJlbG9hZFJlc291cmNlVXJpcy5hZGQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCWdldFJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCX0KLQkJCWtub3duUmVzb3VyY2VVcmlzLmFkZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJhbXMuCi0JICovCi0JcHVibGljIE1hcCBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBwYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1zKE1hcCBwYXJhbXMpIHsKLQkJdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIHsgCi0JCQotCQlwcml2YXRlIGZpbmFsIEVkaXRNb2RlbEV2ZW50IGV2ZW50OwotCQlwcml2YXRlIEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyOwotCQkKLQkJcHVibGljIE5vdGlmeVJ1bm5lcihFZGl0TW9kZWxFdmVudCBldmVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCi0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCAwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlpZihsaXN0ZW5lciAhPSBudWxsKQotCQkJCWxpc3RlbmVyLmVkaXRNb2RlbENoYW5nZWQoZXZlbnQpOyAKLQkJfQotCQkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGVlZDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1NzowMCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdE1vZGVsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kKSB7Ci0JCXN1cGVyKHRhcmdldENvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5VbmRvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZXhlY3V0ZUluTW9kZWwoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGNtZCk7Ci0KLQlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZlcnRBbmRQdXNoKCkgewotCQlleGVjdXRlSW5Nb2RlbCh0aGlzLmludmVydGVkKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwYTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbEV2ZW50IHsKLQkvL1RoZXNlIGFyZSB0aGUgZXZlbnQgY29kZXMuCi0KLQkvLyBVc2VkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgc2F2ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRSA9IDE7Ci0JLy8gVXNlZCB3aGVuIHRoZSBjb21tYW5kIHN0YWNrIGJlY29tZXMgZGlydHkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSVFkgPSAyOwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEX1JFU09VUkNFID0gMzsKLQkvLyBVc2VkIHdoZW4gYSByZWZlcmVuY2VkIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZSBSZXNvdXJjZVNldC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERFRF9SRVNPVVJDRSA9IDQ7Ci0JLy8gVXNlZCB3aGVuIHRoZSBlZGl0IG1vZGVsIGlzIGRpc3Bvc2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0RJU1BPU0UgPSA1OwotCS8vIFVzZWQgd2hlbiBhIFJlc291cmNlIGlzIGxvYWRlZCBvciB0aGUgZmlyc3Qgb2JqZWN0Ci0JLy8gaXMgYWRkZWQgdG8gdGhlIGNvbnRlbnRzIHdoZW4gY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FERURfUkVTT1VSQ0UgPSA2OwotCS8vIFVzZWQgd2hlbiBhIFJlc291cmNlIGlzIHVubG9hZGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOTE9BREVEX1JFU09VUkNFID0gNzsKLQkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdCBvZiBrbm93biByZXNvdXJjZXMgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbCBpcyBhYm91dCB0byBjaGFuZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTk9XTl9SRVNPVVJDRVNfQUJPVVRfVE9fQ0hBTkdFID0gODsKLQkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdCBvZiBrbm93biByZXNvdXJjZXMgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbCBoYXMgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtOT1dOX1JFU09VUkNFU19DSEFOR0VEID0gOTsKLQotCXByaXZhdGUgaW50IGV2ZW50Q29kZTsKLQlwcml2YXRlIEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGNoYW5nZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo1OSBQTSkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsRXZlbnQoaW50IGFuRXZlbnRDb2RlLCBFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc2V0RXZlbnRDb2RlKGFuRXZlbnRDb2RlKTsKLQkJc2V0RWRpdE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZ2V0Q2hhbmdlZFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlcyhDb2xsZWN0aW9uIHNvbWVSZXNvdXJjZXMpIHsKLQkJaWYgKHNvbWVSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCWdldENoYW5nZWRSZXNvdXJjZXMoKS5hZGRBbGwoc29tZVJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoY2hhbmdlZFJlc291cmNlcyA9PSBudWxsKQotCQkJY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgOTowMTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLkVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFdmVudENvZGUoKSB7Ci0JCXJldHVybiBldmVudENvZGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0NoYW5nZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlZFJlc291cmNlcyhqYXZhLnV0aWwuTGlzdCBuZXdDaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCWNoYW5nZWRSZXNvdXJjZXMgPSBuZXdDaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIxLzAxIDk6MDE6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0VkaXRNb2RlbAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guRWRpdE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBuZXdFZGl0TW9kZWwpIHsKLQkJZWRpdE1vZGVsID0gbmV3RWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFdmVudENvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV2ZW50Q29kZShpbnQgbmV3RXZlbnRDb2RlKSB7Ci0JCWV2ZW50Q29kZSA9IG5ld0V2ZW50Q29kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdiYmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotIAotcHVibGljIGNsYXNzIEVkaXRNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJRWRpdE1vZGVsRmFjdG9yeSB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHRydWU7Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGNvbnRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG5ldyBFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHRydWUpOwotCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmV3IEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UpOwotCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5JRWRpdE1vZGVsRmFjdG9yeSNzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMubG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmU5ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDo0NToxMyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVkaXRNb2RlbExpc3RlbmVyIHsKLQkvKioKLQkgKiBBbiBldmVudCBvY3VycmVkIG9uIHRoZSBKMkVFRWRpdE1vZGVsLgotCSAqLwotCXZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBhODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdE1vZGVsTmF0dXJlIGV4dGVuZHMgRU1GTmF0dXJlIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVkaXRNb2RlbE5hdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRFbWZDb250ZXh0KCkuZ2V0RWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRFbWZDb250ZXh0KCkuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBnZXRFbWZDb250ZXh0KCkgewotCQlyZXR1cm4gKEVNRldvcmtiZW5jaENvbnRleHQpIGdldEVtZkNvbnRleHRCYXNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vSUVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMjA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElFZGl0TW9kZWxGYWN0b3J5IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhNWY4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Mb29zZUNvbXBvc2VkRWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUNvbXBvc2VkRWRpdE1vZGVsIGV4dGVuZHMgQ29tcG9zZWRFZGl0TW9kZWwgewotCi0JcHVibGljIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQpOwotCi0JfQotCi0JcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlnZXRDaGlsZHJlbigpLmFkZChlZGl0TW9kZWwpOwotCQlSZWZlcmVuY2UgcmVmID0gZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpOwotCQlnZXRDaGlsZHJlbk1hcCgpLnB1dChyZWYsIGVkaXRNb2RlbCk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlnZXRDaGlsZHJlbigpLnJlbW92ZShlZGl0TW9kZWwpOwotCQlnZXRDaGlsZHJlbk1hcCgpLnJlbW92ZShlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDg4ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kZWxNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjQwOjM1IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbE1vZGlmaWVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX1BBVFRFUk4gPSAiU2V0IHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1BBVFRFUk4gPSAiQWRkIHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1BBVFRFUk4gPSAiUmVtb3ZlIHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01NQU5EX0xBQkVMID0gIkNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0JcHJpdmF0ZSBMaXN0IGhlbHBlcnM7Ci0JcHJpdmF0ZSBMaXN0IGV4dGVuZGVkSGVscGVyczsKLQlwcm90ZWN0ZWQgTGlzdCBhZGRpdGlvbmFsQ29tbWFuZHM7Ci0JcHJvdGVjdGVkIGludCBzdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMVUVfQ0hBTkdFID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEFOR0UgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMjsKLQotCS8qKgotCSAqIEoyRUVNb2RlbE1vZGlmaWVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGVsTW9kaWZpZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGVsTW9kaWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYURvbWFpbgotCSAqICAgICAgICAgICAgRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyBNb2RlbE1vZGlmaWVyKEVkaXRpbmdEb21haW4gYURvbWFpbikgewotCQlzZXRFZGl0aW5nRG9tYWluKGFEb21haW4pOwotCX0KLQotCS8qKgotCSAqIEFkZAotCSAqIAotCSAqIEBhSGVscGVyIHRvIHRoZSBsaXN0IG9mIGhlbHBlciB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIgIT0gbnVsbCAmJiAhZ2V0SGVscGVycygpLmNvbnRhaW5zKGFIZWxwZXIpKQotCQkJZ2V0SGVscGVycygpLmFkZChhSGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZGRpdGlvbmFsQ29tbWFuZChDb21tYW5kIGFDb21tYW5kKSB7Ci0JCWlmIChhQ29tbWFuZCAhPSBudWxsICYmICFnZXRBZGRpdGlvbmFsQ29tbWFuZHMoKS5jb250YWlucyhhQ29tbWFuZCkpCi0JCQlhZGRpdGlvbmFsQ29tbWFuZHMuYWRkKGFDb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1vZGlmaWVyIGNhbiBjcmVhdGUgYSBjb21tYW5kIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVDb21tYW5kKCkgewotCQlyZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGludCBleGVjdXRlV2l0aFN0YXR1cygpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGUoKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdGF0dXMgPSAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciB1c2luZyB0aGUgcmVjb3JkaW5nIG1lY2hhbmlzbSBvZiB0aGUgU3RydWN0ZWRUZXh0VW5kb01hbmFnZXIuIElmIHRoaXMKLQkgKiBtb2RpZmllciBjYW5ub3QgcmVjb3JkLCB0cnkgdG8gZXhlY3V0ZSB1c2luZyB0aGUgQ29tbWFuZFN0YWNrIChpZiBpdCBjYW4gZXhlY3V0ZSBjb21tYW5kcykuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqIEBzZWUgY2FuUmVjb3JkKCkKLQkgKiBAc2VlIHJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWFkZEhlbHBlcihhSGVscGVyKTsKLQkJcmV0dXJuIGV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoaXMgbW9kaWZpZXIgdXNpbmcgdGhlIHJlY29yZGluZyBtZWNoYW5pc20gb2YgdGhlIFN0cnVjdGVkVGV4dFVuZG9NYW5hZ2VyLiBJZiB0aGlzCi0JICogbW9kaWZpZXIgY2Fubm90IHJlY29yZCwgdHJ5IHRvIGV4ZWN1dGUgdXNpbmcgdGhlIENvbW1hbmRTdGFjayAoaWYgaXQgY2FuIGV4ZWN1dGUgY29tbWFuZHMpLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGVjdXRpb24gd2FzIGF0dGVtcHRlZC4KLQkgKiAKLQkgKiBAc2VlIGNhbkV4ZWN1dGVDb21tYW5kKCkKLQkgKiBAc2VlIGNhblJlY29yZCgpCi0JICogQHNlZSBydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoTGlzdCBzb21lSGVscGVycykgewotCQlzZXRIZWxwZXJzKHNvbWVIZWxwZXJzKTsKLQkJcmV0dXJuIGV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoaXMgbW9kaWZpZXIgYnkgY3JlYXRpbmcgYSBDb21tYW5kIHRoYXQgaXMgZXhlY3V0ZWQgb24gdGhlIENvbW1hbmRTdGFjay4gSWYgdGhpcwotCSAqIG1vZGlmaWVyIGNhbm5vdCBleGVjdXRlIGNvbW1hbmRzLCB0aGUgZXhlY3V0aW9uIHdpbGwgbm90IHRha2UgcGxhY2UuIFJldHVybiB0cnVlIGlmIHRoZQotCSAqIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChjYW5FeGVjdXRlQ29tbWFuZCgpKSB7Ci0JCQl0cnkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoKTsKLQkJCQlyZXN1bHQgPSBjb21tYW5kICE9IG51bGw7Ci0JCQkJaWYgKHJlc3VsdCkgewotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmVsZWFzZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKEVSUk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlpZiAoZ2V0RWRpdGluZ0RvbWFpbigpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAyOjUzOjE3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSA4OjQ2OjM1IEFNKQotCSAqIAotCSAqIEByZXR1cm4gSjJFRU1vZGlmaWVySGVscGVyCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyIGdldEZpcnN0SGVscGVyKCkgewotCQlpZiAoaGVscGVycyAhPSBudWxsICYmIGdldEhlbHBlcnMoKS5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChNb2RpZmllckhlbHBlcikgZ2V0SGVscGVycygpLmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDg6NDY6MzUgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRIZWxwZXJzKCkgewotCQlpZiAoaGVscGVycyA9PSBudWxsKQotCQkJaGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGhlbHBlcnM7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFkZGl0aW9uYWxDb21tYW5kcygpIHsKLQkJaWYgKGFkZGl0aW9uYWxDb21tYW5kcyA9PSBudWxsKQotCQkJYWRkaXRpb25hbENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRkaXRpb25hbENvbW1hbmRzOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgYWxsIG1vZGVsIGFydGlmYWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlzZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlzZXRIZWxwZXJzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDI6NTM6MTcgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0VkaXRpbmdEb21haW4KLQkgKiAgICAgICAgICAgIEVkaXRpbmdEb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEVkaXRpbmdEb21haW4gbmV3RWRpdGluZ0RvbWFpbikgewotCQllZGl0aW5nRG9tYWluID0gbmV3RWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgODo0NjozNSBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SGVscGVycwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXJzKGphdmEudXRpbC5MaXN0IG5ld0hlbHBlcnMpIHsKLQkJaGVscGVycyA9IG5ld0hlbHBlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXNDb2RlKSB7Ci0JCWlmIChzdGF0dXNDb2RlID4gc3RhdHVzKQotCQkJc3RhdHVzID0gc3RhdHVzQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gQWRkQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBmYWxzZSkpIHsKLQkJCWNvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlKTsKLQkJCSgoQWJzdHJhY3RDb21tYW5kKSBjb21tYW5kKS5zZXRMYWJlbChjcmVhdGVDb21tYW5kTGFiZWwoQUREX1BBVFRFUk4sIGFIZWxwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgewotCQlDb21tYW5kIGNoYWluZWRDb21tYW5kID0gY3JlYXRlQ29tbWFuZChudWxsLCBnZXRIZWxwZXJzKCkpOwotCQlpZiAobnVsbCA9PSBjaGFpbmVkQ29tbWFuZCAmJiBhZGRpdGlvbmFsQ29tbWFuZHMgIT0gbnVsbCAmJiBhZGRpdGlvbmFsQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2hhaW5lZENvbW1hbmQgPSBhcHBlbmRBZGRpdGlvbmFsQ29tbWFuZHMoY2hhaW5lZENvbW1hbmQpOwotCQlyZXR1cm4gY2hhaW5lZENvbW1hbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb21tYW5kIGNoYWluZWRDb21tYW5kLCBMaXN0IGhlbHBlcnNBcmcpIHsKLQkJaWYgKG51bGwgPT0gZXh0ZW5kZWRIZWxwZXJzKSB7Ci0JCQlleHRlbmRlZEhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlpZiAoIWhlbHBlcnNBcmcuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGhlbHBlcnNBcmcuaXRlcmF0b3IoKTsKLQkJCUNvbW1hbmQgbmV4dENvbW1hbmQgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgoTW9kaWZpZXJIZWxwZXIpIGl0Lm5leHQoKSk7Ci0JCQkJaWYgKGNoYWluZWRDb21tYW5kID09IG51bGwpCi0JCQkJCWNoYWluZWRDb21tYW5kID0gbmV4dENvbW1hbmQ7Ci0JCQkJZWxzZSBpZiAobmV4dENvbW1hbmQgIT0gbnVsbCkKLQkJCQkJY2hhaW5lZENvbW1hbmQgPSBjaGFpbmVkQ29tbWFuZC5jaGFpbihuZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleHRlbmRlZEhlbHBlcnMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb3B5LmFkZEFsbChleHRlbmRlZEhlbHBlcnMpOwotCQkJZXh0ZW5kZWRIZWxwZXJzLmNsZWFyKCk7Ci0JCQljaGFpbmVkQ29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoY2hhaW5lZENvbW1hbmQsIGNvcHkpOwotCQl9Ci0JCXJldHVybiBjaGFpbmVkQ29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBhcHBlbmRBZGRpdGlvbmFsQ29tbWFuZHMoQ29tbWFuZCBjaGFpbmVkQ29tbWFuZCkgewotCQlpZiAoYWRkaXRpb25hbENvbW1hbmRzICE9IG51bGwgJiYgIWFkZGl0aW9uYWxDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCUNvbW1hbmQgY29tbWFuZDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbENvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY29tbWFuZCA9IChDb21tYW5kKSBhZGRpdGlvbmFsQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjaGFpbmVkQ29tbWFuZCA9PSBudWxsKQotCQkJCQljaGFpbmVkQ29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQkJZWxzZQotCQkJCQljaGFpbmVkQ29tbWFuZCA9IGNoYWluZWRDb21tYW5kLmNoYWluKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGFpbmVkQ29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb21tYW5kIGNvbW1hbmQxLCBjb21tYW5kMjsKLQkJTW9kaWZpZXJIZWxwZXIgb3duZXJIZWxwZXIgPSBhSGVscGVyLmdldE93bmVySGVscGVyKCk7Ci0JCWlmIChhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSAmJiBvd25lckhlbHBlciAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vd2UgYXJlIHVuc2V0dGluZyBhIHZhbHVlIG9uIGFuIG93bmVyIHRoYXQgZG9lcyBub3QgZXhpc3Qgc28gZG8gbm90Ci0JCS8vIGNyZWF0ZSB0aGUgb3duZXIKLQkJY29tbWFuZDEgPSBjcmVhdGVDb21tYW5kKG93bmVySGVscGVyKTsKLQkJY29tbWFuZDIgPSBwcmltQ3JlYXRlQ29tbWFuZChhSGVscGVyKTsKLQotCQlpZiAoY29tbWFuZDEgIT0gbnVsbCkgewotCQkJaWYgKGNvbW1hbmQyID09IG51bGwpCi0JCQkJY29tbWFuZDIgPSBjb21tYW5kMTsKLQkJCWVsc2UKLQkJCQljb21tYW5kMiA9IGNvbW1hbmQyLmNoYWluKGNvbW1hbmQxKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb21tYW5kTGFiZWwoU3RyaW5nIGFQYXR0ZXJuLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSBmZWF0dXJlID09IG51bGwgPyBERUZBVUxUX0NPTU1BTkRfTEFCRUwgOiBmZWF0dXJlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChhUGF0dGVybiwgbmV3IFN0cmluZ1tde3JlcGxhY2VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBudWxsLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1hbnlDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpKQotCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZUNvbW1hbmQoYUhlbHBlcik7Ci0JCXJldHVybiBjcmVhdGVBZGRDb21tYW5kKGFIZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZU9iamVjdEZyb21IZWxwZXIoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlyZXR1cm4gYUhlbHBlci5jcmVhdGVOZXdPYmplY3RGcm9tRmVhdHVyZSgpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBQcm94eVdyYXBwaW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JCXByb3RlY3RlZCBDb21tYW5kIGJhc2VDb21tYW5kID0gbnVsbDsKLQkJcHJvdGVjdGVkIEVPYmplY3QgZU9iamVjdCA9IG51bGw7Ci0JCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIFByb3h5V3JhcHBpbmdDb21tYW5kKENvbW1hbmQgYmFzZUNvbW1hbmQsIEVPYmplY3QgZU9iamVjdCkgewotCQkJdGhpcy5iYXNlQ29tbWFuZCA9IGJhc2VDb21tYW5kOwotCQkJdGhpcy5lT2JqZWN0ID0gZU9iamVjdDsKLQkJCXRoaXMucmVzb3VyY2UgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkoZU9iamVjdCwgcmVzb3VyY2UpOwotCQkJYmFzZUNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5jYW5VbmRvKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJYmFzZUNvbW1hbmQudW5kbygpOwotCQkJRXh0ZW5kZWRFY29yZVV0aWwucmVtb3ZlUHJveHkoZU9iamVjdCwgcmVzb3VyY2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCWJhc2VDb21tYW5kLnJlZG8oKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0TGFiZWwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQliYXNlQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZW1vdmUgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFIZWxwZXIuZ2V0RmVhdHVyZSgpOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgdmFsdWUsIHRydWUpKSB7Ci0JCQlpZiAoaXNWYWx1ZUVxdWFsKGFIZWxwZXIsIHZhbHVlKSkgewotCQkJCWNvbW1hbmQgPSBSZW1vdmVDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tbWFuZCA9IFJlbW92ZUNvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQkoKEFic3RyYWN0Q29tbWFuZCkgY29tbWFuZCkuc2V0TGFiZWwoY3JlYXRlQ29tbWFuZExhYmVsKFJFTU9WRV9QQVRURVJOLCBmZWF0dXJlKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbHVlRXF1YWwoTW9kaWZpZXJIZWxwZXIgYUhlbHBlciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBhSGVscGVyLmdldE93bmVyKCkuZUdldChhSGVscGVyLmdldEZlYXR1cmUoKSkgPT0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgU2V0Q29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlU2luZ2xlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkpIHsKLQkJCWNvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlKTsKLQkJCSgoQWJzdHJhY3RDb21tYW5kKSBjb21tYW5kKS5zZXRMYWJlbChjcmVhdGVDb21tYW5kTGFiZWwoU0VUX1BBVFRFUk4sIGFIZWxwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsdWVGcm9tSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBjcmVhdGVPYmplY3RGcm9tSGVscGVyKGFIZWxwZXIpOwotCQlzZXROZXdPYmplY3RBdHRyaWJ1dGVzKG5ld09iamVjdCwgYUhlbHBlcik7Ci0JCXJldHVybiBuZXdPYmplY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKCFhbk9iamVjdC5lSXNTZXQoYUZlYXR1cmUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUVudW1lcmF0b3IgZXhpc3RpbmdFbnVtZXJhdG9yID0gKEVudW1lcmF0b3IpIGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlFbnVtZXJhdG9yIG5ld0VudW1lcmF0b3IgPSBnZXRFbnVtZXJhdG9yKGFGZWF0dXJlLCBhVmFsdWUpOwotCQlyZXR1cm4gZXhpc3RpbmdFbnVtZXJhdG9yICE9IG5ld0VudW1lcmF0b3I7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdG9yIGdldEVudW1lcmF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBFbnVtZXJhdG9yKQotCQkJcmV0dXJuIChFbnVtZXJhdG9yKSBhVmFsdWU7Ci0JCUVFbnVtIGFuRW51bSA9IChFRW51bSkgYUZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSBudWxsOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJbGl0ZXJhbCA9IGFuRW51bS5nZXRFRW51bUxpdGVyYWwoKFN0cmluZykgYVZhbHVlKTsKLQkJZWxzZSBpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCWxpdGVyYWwgPSBhbkVudW0uZ2V0RUVudW1MaXRlcmFsKCgoSW50ZWdlcikgYVZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkKLQkJCXJldHVybiBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlci5tdXN0Q3JlYXRlVmFsdWUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlVmFsdWVGcm9tSGVscGVyKGFIZWxwZXIpOwotCQkJYUhlbHBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGFIZWxwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55VmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBpc1Vuc2V0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJaWYgKGlzVW5zZXQpCi0JCQlyZXR1cm4gbGlzdC5jb250YWlucyhhVmFsdWUpIHx8IChsaXN0ID09IGFWYWx1ZSAmJiAhbGlzdC5pc0VtcHR5KCkpOwotCQlyZXR1cm4gIWxpc3QuY29udGFpbnMoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgcHJpbUNyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlDb21tYW5kIGNvbW1hbmQgPSBkb0NyZWF0ZUNvbW1hbmQoYUhlbHBlcik7Ci0JCWlmIChhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gYUhlbHBlci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCAmJiAhKChFT2JqZWN0KSB2YWx1ZSkuZUlzUHJveHkoKSkgewotCQkJCWNvbW1hbmQgPSBuZXcgUHJveHlXcmFwcGluZ0NvbW1hbmQoY29tbWFuZCwgKEVPYmplY3QpIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBkb0NyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoIWFIZWxwZXIuaXNDb21wbGV0ZSgpKSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQkJaWYgKGFIZWxwZXIuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKQotCQkJY29tbWFuZCA9IGNyZWF0ZU1hbnlDb21tYW5kKGFIZWxwZXIpOwotCQllbHNlCi0JCQljb21tYW5kID0gY3JlYXRlU2luZ2xlQ29tbWFuZChhSGVscGVyKTsKLQotCQlpZiAobnVsbCAhPSBjb21tYW5kKSB7Ci0JCQlMaXN0IGxvY2FsSGVscGVycyA9IE1vZGlmaWVySGVscGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIZWxwZXJzKGFIZWxwZXIpOwotCQkJaWYgKG51bGwgIT0gbG9jYWxIZWxwZXJzKSB7Ci0JCQkJZXh0ZW5kZWRIZWxwZXJzLmFkZEFsbChsb2NhbEhlbHBlcnMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCi0JfQotCi0JLyoqCi0JICogUnVuIHVzaW5nCi0JICogCi0JICogQGFIZWxwZXIuIFRoaXMgd2lsbCBzZXQgYSBNT0YgYXR0aWJ1dGUgdmFsdWUgdG8gdGhlIG93bmVyIG9mIHRoZSBoZWxwZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyLmlzQ29tcGxldGUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkpCi0JCQkJc2V0T2JqZWN0QXR0cmlidXRlKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGFyZSB1c2luZwotCSAqIHJlY29yZGFibGUgY29tbWFuZHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgdXBkYXRlIHRoZSBNT0YgbW9kZWwgZGlyZWN0bHkuCi0JICogQW55IG1vZGlmaWNhdGlvbiB3aWxsIGJlIHJlY29yZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCFnZXRIZWxwZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGdldEhlbHBlcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkKLQkJCQlydW4oKE1vZGlmaWVySGVscGVyKSBpdC5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVuIHVzaW5nCi0JICogCi0JICogQGFIZWxwZXIncyBvd25lckhlbHBlciBmaXJzdCBiZWZvcmUgcnVubmluZyB3aXRoCi0JICogQGFIZWxwZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIgIT0gbnVsbCkgewotCQkJcnVuKGFIZWxwZXIuZ2V0T3duZXJIZWxwZXIoKSk7Ci0JCQlwcmltUnVuKGFIZWxwZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmV3T2JqZWN0QXR0cmlidXRlcyhFT2JqZWN0IGFuT2JqZWN0LCBNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCUhhc2hNYXAgYXR0cmlidXRlcyA9IGFIZWxwZXIuZ2V0QXR0cmlidXRlcygpOwotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQl2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KGZlYXR1cmUpOwotCQkJc2V0T2JqZWN0QXR0cmlidXRlKGFuT2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0QXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7Ci0JCWlmIChhRmVhdHVyZS5pc01hbnkoKSkKLQkJCXNldE9iamVjdE1hbnlBdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIHNob3VsZFVuc2V0VmFsdWUpOwotCQllbHNlCi0JCQlzZXRPYmplY3RTaW5nbGVBdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIHNob3VsZFVuc2V0VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdEVudW1BdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCUVudW1lcmF0b3IgZW51bWVyYXRvciA9IGdldEVudW1lcmF0b3IoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JCWFuT2JqZWN0LmVTZXQoYUZlYXR1cmUsIGVudW1lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdE1hbnlBdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlpZiAoc2hvdWxkVW5zZXRWYWx1ZSkKLQkJCWxpc3QucmVtb3ZlKGFWYWx1ZSk7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKGFWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0U2luZ2xlQXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7Ci0JCWlmIChzaG91bGRVbnNldFZhbHVlKQotCQkJYW5PYmplY3QuZVVuc2V0KGFGZWF0dXJlKTsKLQkJZWxzZSBpZiAoYUZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVFbnVtKQotCQkJc2V0T2JqZWN0RW51bUF0dHJpYnV0ZShhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JCWVsc2UKLQkJCWFuT2JqZWN0LmVTZXQoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2luZ2xlVmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBpc1Vuc2V0KSB7Ci0JCWlmIChhRmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUVudW0pCi0JCQlyZXR1cm4gZW51bVZhbHVlQ2hhbmdlZChhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSk7Ci0KLQkJT2JqZWN0IGV4aXN0aW5nVmFsdWUgPSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJaWYgKGV4aXN0aW5nVmFsdWUgPT0gbnVsbCAmJiBhVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGV4aXN0aW5nVmFsdWUgIT0gbnVsbCAmJiAhZXhpc3RpbmdWYWx1ZS5lcXVhbHMoYVZhbHVlKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYVZhbHVlICE9IG51bGwgJiYgIWFWYWx1ZS5lcXVhbHMoZXhpc3RpbmdWYWx1ZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgewotCQlpZiAoYUZlYXR1cmUuaXNNYW55KCkpCi0JCQlyZXR1cm4gbWFueVZhbHVlQ2hhbmdlZChhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSwgaXNVbnNldCk7Ci0JCXJldHVybiBzaW5nbGVWYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIGlzVW5zZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk0OWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6MjM6MzYgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyIHsKLQotCXByaXZhdGUgRU9iamVjdCBvd25lcjsKLQlwcml2YXRlIE1vZGlmaWVySGVscGVyIG93bmVySGVscGVyOwotCXByaXZhdGUgT3duZXJQcm92aWRlciBvd25lclByb3ZpZGVyOwotCXByaXZhdGUgT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBIYXNoTWFwIGF0dHJpYnV0ZXM7Ci0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVhTSVR5cGVOYW1lOwotCXByaXZhdGUgRmVhdHVyZVZhbHVlQ29udmVydGVyIGZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9VTlNFVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0JPVEggPSAyOwotCi0JLyoqCi0JICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEoyRUVNb2RpZmllckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2RpZmllckhlbHBlcihFT2JqZWN0IGFuT3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlzZXRPd25lcihhbk93bmVyKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JCXNldFZhbHVlKGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyKE1vZGlmaWVySGVscGVyIGFuT3duZXJIZWxwZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlzZXRPd25lckhlbHBlcihhbk93bmVySGVscGVyKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JCXNldFZhbHVlKGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyKE93bmVyUHJvdmlkZXIgYW5Pd25lclByb3ZpZGVyLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJc2V0T3duZXJQcm92aWRlcihhbk93bmVyUHJvdmlkZXIpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhRmVhdHVyZSAhPSBudWxsICYmIGFWYWx1ZSAhPSBudWxsKQotCQkJZ2V0QXR0cmlidXRlcygpLnB1dChhRmVhdHVyZSwgYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpLmNvbnZlcnRWYWx1ZShuZXdWYWx1ZSwgZ2V0RmVhdHVyZSgpKTsKLQl9Ci0KLQkvL0NhbGxpbmcgdGhpcyB3aWxsIGNhdXNlIHRoZSB2YWx1ZSB0byBiZSByZW1vdmVkIG9yIHVuc2V0IGZyb20gdGhlIG93bmVyLgotCXB1YmxpYyB2b2lkIGRvVW5zZXRWYWx1ZSgpIHsKLQkJc2hvdWxkVW5zZXRWYWx1ZSA9IHRydWU7Ci0JCWlmICh2YWx1ZSAhPSBTZXRDb21tYW5kLlVOU0VUX1ZBTFVFICYmIGZlYXR1cmUgIT0gbnVsbCAmJiAhZmVhdHVyZS5pc01hbnkoKSkKLQkJCXByaW1TZXRWYWx1ZShTZXRDb21tYW5kLlVOU0VUX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkhhc2hNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuICgoRUNsYXNzSW1wbCkgZ2V0RmVhdHVyZVR5cGUoKSkuZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RmVhdHVyZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgNDo1MTo1OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuRmVhdHVyZVZhbHVlQ29udmVydGVyCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBnZXRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKSB7Ci0JCWlmIChmZWF0dXJlVmFsdWVDb252ZXJ0ZXIgPT0gbnVsbCkKLQkJCWZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9IEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5ERUZBVUxUOwotCQlyZXR1cm4gZmVhdHVyZVZhbHVlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld1ZhbHVlVHlwZU5hbWUoKSB7Ci0JCWlmIChnZXRWYWx1ZVhTSVR5cGVOYW1lKCkgIT0gbnVsbCAmJiBnZXRWYWx1ZVhTSVR5cGVOYW1lKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGdldFZhbHVlWFNJVHlwZU5hbWUoKTsKLQkJcmV0dXJuICgoKEVDbGFzcykgZ2V0RmVhdHVyZVR5cGUoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCWlmIChvd25lciA9PSBudWxsKSB7Ci0JCQlPd25lclByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0T3duZXJQcm92aWRlcigpOwotCQkJRU9iamVjdCBwcm92aWRlck93bmVyID0gbnVsbDsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKQotCQkJCXByb3ZpZGVyT3duZXIgPSBwcm92aWRlci5nZXRPd25lcigpOwotCQkJaWYgKHByb3ZpZGVyT3duZXIgPT0gbnVsbCAmJiBnZXRPd25lckhlbHBlcigpICE9IG51bGwpCi0JCQkJcHJvdmlkZXJPd25lciA9IChFT2JqZWN0KSBnZXRPd25lckhlbHBlcigpLmdldFZhbHVlKCk7Ci0JCQlyZXR1cm4gcHJvdmlkZXJPd25lcjsKLQkJfQotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC84LzIwMDEgMjo0Nzo1NCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuSjJFRU1vZGlmaWVySGVscGVyCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyIGdldE93bmVySGVscGVyKCkgewotCQlpZiAob3duZXJIZWxwZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldE93bmVyUHJvdmlkZXIoKSAhPSBudWxsICYmIGdldE93bmVyUHJvdmlkZXIoKS5nZXRPd25lcigpID09IG51bGwpCi0JCQkJcmV0dXJuIGdldE93bmVyUHJvdmlkZXIoKS5nZXRPd25lckhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBvd25lckhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgcHJpbUdldE93bmVySGVscGVyKCkgewotCQlyZXR1cm4gb3duZXJIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS8xOC8yMDAxIDE6MzE6MTQgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLnVpLkoyRUVPd25lclByb3ZpZGVyCi0JICovCi0JcHVibGljIE93bmVyUHJvdmlkZXIgZ2V0T3duZXJQcm92aWRlcigpIHsKLQkJcmV0dXJuIG93bmVyUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAzOjM5OjMxIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlWFNJVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB2YWx1ZVhTSVR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCBjYWxsZWQgZnJvbSB0aGUgSjJFRU1vZGVsTW9kaWZpZXIgYmVmb3JlIGV4ZWN1dGluZyBzbyBpdCBpcyBub3QKLQkgKiBuZWNlc3NhcnkgdG8gY2FsbCBpdCBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWlmIChnZXRPd25lckhlbHBlcigpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRPd25lckhlbHBlcigpLmlzQ29tcGxldGUoKTsKLQkJaWYgKCFtdXN0Q3JlYXRlVmFsdWUoKSkKLQkJCXJlc3VsdCA9IGdldFZhbHVlKCkgIT0gbnVsbCB8fCBzaG91bGRVbnNldFZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IGdldEZlYXR1cmVUeXBlKCkgIT0gbnVsbDsKLQkJcmV0dXJuIHJlc3VsdCAmJiBnZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiAoZ2V0T3duZXIoKSAhPSBudWxsIHx8IGdldE93bmVySGVscGVyKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbXVzdENyZWF0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWUoKSA9PSBudWxsICYmIGdldEZlYXR1cmUoKSAhPSBudWxsICYmICFzaG91bGRVbnNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ZlYXR1cmUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSkgewotCQlmZWF0dXJlID0gbmV3RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgNDo1MTo1OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcihGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyKSB7Ci0JCWZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9IG5ld0ZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdPd25lcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBuZXdPd25lcikgewotCQlvd25lciA9IG5ld093bmVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvOC8yMDAxIDI6NDc6NTQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld093bmVySGVscGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkoyRUVNb2RpZmllckhlbHBlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVySGVscGVyKE1vZGlmaWVySGVscGVyIG5ld093bmVySGVscGVyKSB7Ci0JCW93bmVySGVscGVyID0gbmV3T3duZXJIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS8xOC8yMDAxIDE6MzE6MTQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUudWkuSjJFRU93bmVyUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lclByb3ZpZGVyKE93bmVyUHJvdmlkZXIgbmV3T3duZXJQcm92aWRlcikgewotCQlvd25lclByb3ZpZGVyID0gbmV3T3duZXJQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCXByaW1TZXRWYWx1ZShjb252ZXJ0VmFsdWUobmV3VmFsdWUpKTsKLQkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBmZWF0dXJlRXhjZXB0aW9uKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmVhdHVyZUV4Y2VwdGlvbik7Ci0JCQlwcmltU2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmVhdCBhbiBlbXB0eSBTdHJpbmcgYXMgYSBudWxsIHZhbHVlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUZyb21XaWRnZXQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCU9iamVjdCBkYXRhID0gbmV3VmFsdWU7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlkYXRhID0gbnVsbDsKLQkJc2V0VmFsdWUoZGF0YSk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlkb1Vuc2V0VmFsdWUoKTsKLQkJZWxzZQotCQkJc2hvdWxkVW5zZXRWYWx1ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAzOjM5OjMxIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZVhTSVR5cGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVYU0lUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlWFNJVHlwZU5hbWUpIHsKLQkJdmFsdWVYU0lUeXBlTmFtZSA9IG5ld1ZhbHVlWFNJVHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHNob3VsZFVuc2V0VmFsdWU7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTmV3T2JqZWN0RnJvbUZlYXR1cmUoKSB7Ci0JCUVDbGFzcyBtZXRhQ2xhc3MgPSAoRUNsYXNzKSBnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXIoZ2V0TmV3VmFsdWVUeXBlTmFtZSgpKTsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5jcmVhdGUobWV0YUNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckNoYWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYxNDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotCi0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmllckhlbHBlckNoYWluZXIgewotCi0JTW9kaWZpZXJIZWxwZXIgaGVscGVyOwotCi0JcHVibGljIE1vZGlmaWVySGVscGVyQ2hhaW5lcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRU9iamVjdCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWhlbHBlciA9IG5ldyBNb2RpZmllckhlbHBlcigpOwotCi0JCWlmIChvd25lciAhPSBudWxsKQotCQkJaGVscGVyLnNldE93bmVyKG93bmVyKTsKLQotCQloZWxwZXIuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWhlbHBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyQmFzZWRPblR5cGUoT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQloZWxwZXIuc2V0T3duZXIoKEVPYmplY3QpIG93bmVyKTsKLQkJZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBNb2RpZmllckhlbHBlcikKLQkJCWhlbHBlci5zZXRPd25lckhlbHBlcigoTW9kaWZpZXJIZWxwZXIpIG93bmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MWE2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpZXJIZWxwZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VIZWxwZXIKLQkgKiBAcGFyYW0gYWN0aW9uRmxhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlNb2RpZmllckhlbHBlciBnZXRIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYmFzZUhlbHBlciwgaW50IGFjdGlvbkZsYWcpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkYThhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyNywgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KLSAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJNb2RpZmllckhlbHBlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1NFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1VOU0VUID0gInVuc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTl9CT1RIID0gImJvdGgiOyAvL2RlZmF1bHQgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOwotCS8vIEhhc2h0YWJsZSBtYXBwaW5nIGZlYXR1cmVzIHRvIGEgbGlzdCBvZiBGYWN0b3J5SG9sZGVycwotCXByaXZhdGUgSGFzaHRhYmxlIGZlYXR1cmVIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGZhY3RvcnlIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBjbGFzcyBGYWN0b3J5SG9sZGVyIHsKLQkJcHJpdmF0ZSBpbnQgYWN0aW9uVHlwZTsKLQkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCQlwdWJsaWMgRmFjdG9yeUhvbGRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgaW50IGFjdGlvblR5cGUpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQl0aGlzLmFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOwotCQl9Ci0KLQkJcHVibGljIE1vZGlmaWVySGVscGVyRmFjdG9yeSBnZXRGYWN0b3J5KGludCBhY3Rpb25UeXBlQXJnKSB7Ci0JCQlpZiAodGhpcy5hY3Rpb25UeXBlID09IGFjdGlvblR5cGVBcmcgfHwgdGhpcy5hY3Rpb25UeXBlID09IE1vZGlmaWVySGVscGVyLkFDVElPTl9CT1RIKSB7Ci0JCQkJU3RyaW5nIGhhc2hLZXkgPSBnZXRGYWN0b3J5SGFzaChlbGVtZW50KTsKLQkJCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGZhY3RvcnlIYXNoLmdldChoYXNoS2V5KTsKLQkJCQlpZiAobnVsbCA9PSBmYWN0b3J5KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZBQ1RPUllfQ0xBU1MpOwotCQkJCQkJZmFjdG9yeUhhc2gucHV0KGhhc2hLZXksIGZhY3RvcnkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChzdXBlci5lcXVhbHMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJRmFjdG9yeUhvbGRlciBob2xkZXIgPSAoRmFjdG9yeUhvbGRlcikgb2JqOwotCQkJcmV0dXJuIGdldEZhY3RvcnlIYXNoKGVsZW1lbnQpLmVxdWFscyhnZXRGYWN0b3J5SGFzaChob2xkZXIuZWxlbWVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmllckhlbHBlclJlZ2lzdHJ5KCkgewotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWFkRmFjdG9yeShlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGQUNUT1JZX0NMQVNTKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUNsYXNzTmFtZSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBGQUNUT1JZX0NMQVNTICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYWNrYWdlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oUEFDS0FHRSk7Ci0JCWlmIChwYWNrYWdlcy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQlyZWFkUGFja2FnZShlbGVtZW50LCBwYWNrYWdlc1tqXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFBhY2thZ2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBQ0tBR0VfVVJJKTsKLQkJaWYgKG51bGwgPT0gcGFja2FnZVVSSSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFX1VSSSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShwYWNrYWdlVVJJKTsKLQkJaWYgKG51bGwgPT0gZVBhY2thZ2UpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsIFBBQ0tBR0UgKyAiICIgKyBwYWNrYWdlVVJJICsgIiBjYW4gbm90IGJlIGZvdW5kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0eXBlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVFlQRSk7Ci0JCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBUWVBFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWFkVHlwZShmYWN0b3J5RWxlbWVudCwgZVBhY2thZ2UsIHR5cGVzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQsIEVQYWNrYWdlIGVQYWNrYWdlLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJaWYgKG51bGwgPT0gdHlwZU5hbWUpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgTkFNRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcih0eXBlTmFtZSk7Ci0JCWlmIChudWxsID09IGVDbGFzc2lmaWVyKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCBUWVBFICsgIiAiICsgdHlwZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFBBQ0tBR0UgKyAiICIgKyBlUGFja2FnZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuOwotCQl9Ci0JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmVhdHVyZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKEZFQVRVUkUpOwotCQlpZiAoZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgRkVBVFVSRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJcmVhZEZlYXR1cmUoZmFjdG9yeUVsZW1lbnQsIGVDbGFzcywgZmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGZWF0dXJlKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCwgRUNsYXNzIGVDbGFzcywgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCWlmIChudWxsID09IGZlYXR1cmVOYW1lKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIE5BTUUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBhY3Rpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGRUFUVVJFX0FDVElPTik7Ci0JCWlmIChudWxsID09IGFjdGlvbikgewotCQkJYWN0aW9uID0gRkVBVFVSRV9BQ1RJT05fQk9USDsKLQkJfQotCQlpbnQgYWN0aW9uVHlwZSA9IC0xOwotCQlpZiAoYWN0aW9uLmVxdWFsc0lnbm9yZUNhc2UoRkVBVFVSRV9BQ1RJT05fQk9USCkpIHsKLQkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fQk9USDsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9TRVQpKSB7Ci0JCQlhY3Rpb25UeXBlID0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1NFVDsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9VTlNFVCkpIHsKLQkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fVU5TRVQ7Ci0JCX0KLQkJaWYgKGFjdGlvblR5cGUgPT0gLTEpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJJbnZhbGlkICIgKyBGRUFUVVJFX0FDVElPTiArICI9IiArIGFjdGlvbiArICIgZGVmaW5lZC4gIFZhbGlkIHZhbHVlcyBhcmU6ICIgKyBGRUFUVVJFX0FDVElPTl9CT1RIICsgIiwgIiArIEZFQVRVUkVfQUNUSU9OX1NFVCArICIsIG9yICIgKyBGRUFUVVJFX0FDVElPTl9VTlNFVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJcmV0dXJuOwotCQl9Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJRUxpc3QgYWxsRmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgdGVtcEZlYXR1cmUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGFsbEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChudWxsID09IGZlYXR1cmUgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0ZW1wRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWZlYXR1cmUgPSB0ZW1wRmVhdHVyZTsKLQkJCX0KLQkJfQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCBGRUFUVVJFICsgIiAiICsgZmVhdHVyZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFRZUEUgKyAiICIgKyBlQ2xhc3MuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0IGZhY3RvcnlIb2xkZXJMaXN0ID0gKExpc3QpIGZlYXR1cmVIYXNoLmdldChmZWF0dXJlKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUhvbGRlckxpc3QpIHsKLQkJCWZhY3RvcnlIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZUhhc2gucHV0KGZlYXR1cmUsIGZhY3RvcnlIb2xkZXJMaXN0KTsKLQkJfQotCQlGYWN0b3J5SG9sZGVyIGZhY3RvcnlIb2xkZXIgPSBuZXcgRmFjdG9yeUhvbGRlcihmYWN0b3J5RWxlbWVudCwgYWN0aW9uVHlwZSk7Ci0JCWlmIChmYWN0b3J5SG9sZGVyTGlzdC5jb250YWlucyhmYWN0b3J5SG9sZGVyKSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkR1cGxpY2F0ZSIgKyBGRUFUVVJFICsgIjoiICsgZmVhdHVyZU5hbWUgKyAiIGRlZmluZWQgZm9yICIgKyBGQUNUT1JZX0NMQVNTICsgIjoiICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJcmV0dXJuOwotCQl9Ci0JCWZhY3RvcnlIb2xkZXJMaXN0LmFkZChmYWN0b3J5SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGYWN0b3J5SGFzaChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnlFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAobnVsbCA9PSBJTlNUQU5DRSkgewotCQkJSU5TVEFOQ0UgPSBuZXcgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBNb2RpZmllckhlbHBlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUhlbHBlcgotCSAqIEBwYXJhbSBhY3Rpb25GbGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEhlbHBlcnMoTW9kaWZpZXJIZWxwZXIgYmFzZUhlbHBlcikgewotCQlpbnQgYWN0aW9uRmxhZyA9IGJhc2VIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpID8gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1VOU0VUIDogTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1NFVDsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBiYXNlSGVscGVyLmdldEZlYXR1cmUoKTsKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IGdldEZhY3RvcmllcyhmZWF0dXJlLCBhY3Rpb25GbGFnKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUxpc3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFycmF5TGlzdCBoZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCU1vZGlmaWVySGVscGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBoZWxwZXIgPSBmYWN0b3J5LmdldEhlbHBlcihiYXNlSGVscGVyLCBhY3Rpb25GbGFnKTsKLQkJCWlmIChudWxsICE9IGhlbHBlcikgewotCQkJCWhlbHBlcnMuYWRkKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlbHBlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEZhY3RvcmllcyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGFjdGlvbkZsYWcpIHsKLQkJTGlzdCBmYWN0b3J5SG9sZGVyTGlzdCA9IChMaXN0KSBmZWF0dXJlSGFzaC5nZXQoZmVhdHVyZSk7Ci0JCWlmIChudWxsID09IGZhY3RvcnlIb2xkZXJMaXN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmFjdG9yeUhvbGRlckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWZhY3RvcnkgPSAoKEZhY3RvcnlIb2xkZXIpIGZhY3RvcnlIb2xkZXJMaXN0LmdldChpKSkuZ2V0RmFjdG9yeShhY3Rpb25GbGFnKTsKLQkJCWlmIChudWxsICE9IGZhY3RvcnkpIHsKLQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MjQzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Pd25lclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgMTA6MjQ6NDYgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBPd25lclByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEVPYmplY3QgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBvd25lciBvZiBhIGdpdmVuIEoyRUVNb2RpZmllckhlbHBlci4KLQkgKi8KLQlFT2JqZWN0IGdldE93bmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKMkVFTW9kaWZpZXJIZWxwZXIgZm9yIHRoZSBvd25lciBpZiB0aGUgb3duZXIgZG9lcyBub3QgeWV0IGV4aXN0LgotCSAqLwotCU1vZGlmaWVySGVscGVyIGdldE93bmVySGVscGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Byb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTMyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbChJUHJvamVjdCBhUHJvamVjdCkgewotCQlzdXBlcihhUHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSwgY29udGVudFR5cGUpOwotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzdWx0KSkKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBDb250ZW50SGFuZGxlci5VTlNQRUNJRklFRF9DT05URU5UX1RZUEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Jlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDZkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIGV4dGVuZHMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfQVJDSElWRSA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTZXQgcmVjZW50bHlTYXZlZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIE1hcCBpZ25vcmVkRmlsZXNDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBjbGFzcyBTYXZlZEZpbGVLZXkgewotCQlwcml2YXRlIFJlc291cmNlIHJlczsKLQkJcHJpdmF0ZSBJRmlsZSBzYXZlZEZpbGU7Ci0JCXB1YmxpYyBTYXZlZEZpbGVLZXkoUmVzb3VyY2UgcmVzLCBJRmlsZSBzYXZlZEZpbGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnJlcyA9IHJlczsKLQkJCXRoaXMuc2F2ZWRGaWxlID0gc2F2ZWRGaWxlOwotCQl9Ci0JCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXMoKSB7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFJlcyhSZXNvdXJjZSByZXMpIHsKLQkJCXRoaXMucmVzID0gcmVzOwotCQl9Ci0JCXB1YmxpYyBJRmlsZSBnZXRTYXZlZEZpbGUoKSB7Ci0JCQlyZXR1cm4gc2F2ZWRGaWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNhdmVkRmlsZShJRmlsZSBzYXZlZEZpbGUpIHsKLQkJCXRoaXMuc2F2ZWRGaWxlID0gc2F2ZWRGaWxlOwotCQl9Ci0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJCWludCByZXN1bHQgPSAxOwotCQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBnZXRPdXRlclR5cGUoKS5oYXNoQ29kZSgpOwotCQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHJlcyA9PSBudWxsKSA/IDAgOiByZXMuaGFzaENvZGUoKSk7Ci0JCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoc2F2ZWRGaWxlID09IG51bGwpID8gMCA6IHNhdmVkRmlsZS5oYXNoQ29kZSgpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTYXZlZEZpbGVLZXkgb3RoZXIgPSAoU2F2ZWRGaWxlS2V5KSBvYmo7Ci0JCQlpZiAoIWdldE91dGVyVHlwZSgpLmVxdWFscyhvdGhlci5nZXRPdXRlclR5cGUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkJaWYgKG90aGVyLnJlcyAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKCFyZXMuZXF1YWxzKG90aGVyLnJlcykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKHNhdmVkRmlsZSA9PSBudWxsKSB7Ci0JCQkJaWYgKG90aGVyLnNhdmVkRmlsZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKCFzYXZlZEZpbGUuZXF1YWxzKG90aGVyLnNhdmVkRmlsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgZ2V0T3V0ZXJUeXBlKCkgewotCQkJcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci50aGlzOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBlbWYgcmVzb3VyY2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0IGFzIGEgcmVzdWx0IG9mIGEgZGVsdGEgKi8KLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZFJlbW92ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZFVubG9hZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZExvYWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBhdXRvbG9hZFJlc291cmNlc1VSSXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3QgYXV0b2xvYWRSZXNvdXJjZXNFeHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGFSZXNvdXJjZVNldCwgYVByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5yZXNvdXJjZUNoYW5nZWQoZXZlbnQpOwotCQl0cnkgewotCQkJYWNjZXB0RGVsdGEoZXZlbnQpOwotCQkJbm90aWZ5RXh0ZW5kZXJzSWZOZWNlc3NhcnkoKTsKLQkJCXByb2Nlc3NEZWZlcnJlZFJlc291cmNlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5jbGVhcigpOwotCQkJZGVmZXJyZWRMb2FkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVmZXJyZWRSZW1vdmVkUmVzb3VyY2VzKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc291cmNlID0gKFJlc291cmNlKSBkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVmZXJyZWRVbmxvYWRlZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RlZmVycmVkTG9hZFJlc291cmNlcygpIHsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJyZWRMb2FkUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQl1cmkgPSAoVVJJKSBkZWZlcnJlZExvYWRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgSUxvY2sgbG9jazsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIGRlbGF5ID0gMzA7Ci0JCi0gICAgcHJpdmF0ZSBJTG9jayBnZXRMb2NrKCkgewotICAgICAgICBpZiAobG9jayA9PSBudWxsKQotICAgICAgICAgICAgbG9jayA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0gICAgICAgIHJldHVybiBsb2NrOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0gICAgICAgIGdldExvY2soKS5yZWxlYXNlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBhcXVpcmVMb2NrKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uewotICAgIAlyZXR1cm4gZ2V0TG9jaygpLmFjcXVpcmUoZGVsYXkpOwotICAgIH0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHREZWx0YShmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCi0JCWJvb2xlYW4gaGFzTG9ja2VkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQloYXNMb2NrZWQgPSBhcXVpcmVMb2NrKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLQkJfQkJCi0JCQotCQl0cnl7Ci0JCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCi0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJcHJpbUFjY2VwdERlbHRhKGRlbHRhLCBldmVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlwcmltQWNjZXB0RGVsdGEoZGVsdGEsIGV2ZW50KTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgcHJvamVjdCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9ZmluYWxseXsKLQkJCWlmKCBoYXNMb2NrZWQgKQotCQkJCXJlbGVhc2VMb2NrKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbUFjY2VwdERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKLQkJCQlkZWx0YS5hY2NlcHQoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLnRoaXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJvamVjdCBpcyBnb2luZyBhd2F5IHNvIHdlIG5lZWQgdG8gY2xlYW51cCBvdXJzZWxmIGFuZCB0aGUgUmVzb3VyY2VTZXQuIFRPRE8gTmVlZCB0bwotCSAqIHB1c2ggdXAgdGhpcyBjb2RlIHRvIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGluIG5leHQgcmVsZWFzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoSkVNVXRpbFBsdWdpbi5pc0FjdGl2YXRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5yZWxlYXNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLnJlbW92ZUNhY2hlZFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RlZmVycmVkUmVzb3VyY2VzKCkgewotCQlwcm9jZXNzRGVmZXJyZWRSZW1vdmVkUmVzb3VyY2VzKCk7Ci0JCXByb2Nlc3NEZWZlcnJlZFVubG9hZGVkUmVzb3VyY2VzKCk7Ci0JCXByb2Nlc3NEZWZlcnJlZExvYWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkvLyBvbmx5IHJlc3BvbmQgdG8gcHJvamVjdCBjaGFuZ2VzCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJaWYgKGlzSW50ZXJyZXN0ZWRJblByb2plY3QocCkpIHsKLQkJCQkJY3VycmVudFByb2plY3REZWx0YSA9IGRlbHRhOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBpc0ludGVycmVzdGVkSW5GaWxlKChJRmlsZSkgcmVzb3VyY2UpKSB7Ci0JCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJCXJlbW92ZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQkJCWFkZGVkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDApCi0JCQkJCQkJY2hhbmdlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKQotCQkJCQkJCW1vdmVkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFF1ZXVlIHVwIHRoZSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byA8Y29kZT5hRmlsZTwvY29kZT4sIGZvciByZW1vdmFsCi0JICogZnJvbSB0aGUgY2FjaGUgb2YgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBxdWV1ZWQgdXAgdG8gYmUgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIHByb2Nlc3NSZXNvdXJjZShhRmlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUXVldWUgdXAgdGhlIDxjb2RlPlJlc291cmNlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFGaWxlPC9jb2RlPiwgZm9yIHJlbG9hZC4KLQkgKiAKLQkgKiBAcG9zdCBSZXR1cm4gdHJ1ZSBpZiBhIDxjb2RlPlJlc291cmNlPC9jb2RlPiB3YXMgcXVldWVkIHVwIHRvIGJlIHJlbG9hZGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZGVkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLSAgICAgICAgYm9vbGVhbiBkaWRQcm9jZXNzID0gZmFsc2U7Ci0gICAgICAgIExpc3QgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKGFGaWxlKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoKHJlc291cmNlICE9IG51bGwpIHx8IChyZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhyZXNvdXJjZSkpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgSUZpbGUgd2FzIGp1c3QgYWRkZWQgdG8gdGhlIHdvcmtzcGFjZSBidXQgd2UgaGF2ZSBhCi0JCQkJICogcmVzb3VyY2UgaW4gbWVtb3J5LiBOZWVkIHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUgdW5sb2FkZWQuCi0JCQkJICovCi0JCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2U7Ci0JCQkJCQlpZiAocmVmUmVzLnNob3VsZEZvcmNlUmVmcmVzaCgpKSB7Ci0JCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIFVubG9hZCBpZiBmb3VuZCBhbmQgaXMgbm90IG1vZGlmaWVkIGJ1dCBpbmNvbnNpc3RlbnQuICovCi0JCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2UpKSB7Ci0JCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUHJvY2VzcyByZXNvdXJjZSBhcyBhIHJlZnJlc2guCi0JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKChhdXRvbG9hZFJlc291cmNlc1VSSXMuY29udGFpbnModXJpKSkgfHwgKGF1dG9sb2FkUmVzb3VyY2VzRXh0cy5jb250YWlucyhhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSkgewotCQkJCQlkZWZlcnJlZExvYWRSZXNvdXJjZXMuYWRkKHVyaSk7Ci0JCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgICByZXR1cm4gZGlkUHJvY2VzczsKLX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzQ29udGFpbnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2VudGx5U2F2ZWRGaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTYXZlZEZpbGVLZXkga2V5ID0gKFNhdmVkRmlsZUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5yZXMuZXF1YWxzKHJlc291cmNlKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2UoSUZpbGUgYUZpbGUsIGJvb2xlYW4gaXNSZW1vdmUpIHsKLQkJTGlzdCByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoYUZpbGUpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKHJlc291cmNlICE9IG51bGwpIHx8IChyZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhyZXNvdXJjZSkpKSB7Ci0JCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2U7Ci0JCQkJCQlpZiAoIXJlZlJlcy5zaG91bGRGb3JjZVJlZnJlc2goKSkKLQkJCQkJCQljb250aW51ZTsgLy8gRG8gbm90IGRvIGFueXRoaW5nCi0JCQkJCX0gZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGlzUmVtb3ZlKQotCQkJCQlkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc291cmNlKSkgewotCQkJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2UpKQotCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZvciBub3csIGRvIHRoZSBzYW1lIGFzIGlmIHRoZSA8Y29kZT5hRmlsZTwvY29kZT4gd2FzIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudHMgb2YgPGNvZGU+YUZpbGU8L2NvZGU+IGhhdmUgY2hhbmdlZCBpbiB0aGUgV29ya2JlbmNoIGFuZCB3ZSBtYXkgbmVlZCB0byB1cGRhdGUKLQkgKiBvdXIgY2FjaGVkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBXZSB3aWxsIHByb2Nlc3MgdGhpcyByZXNvdXJjZSB0byBiZSByZWZyZXNoZWQgYW5kIG5vdCByZW1vdmVkLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBhY3R1YWxseSByZW1vdmVkLgotCSAqLwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hhbmdlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCS8vUHJvY2VzcyByZXNvdXJjZSBhcyBhIHJlZnJlc2guCi0JCXJldHVybiBwcm9jZXNzUmVzb3VyY2UoYUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJCi0JCXJldHVybiByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldFJlc291cmNlcyhJRmlsZSBhRmlsZSkgewotCQkKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsUmVzb3VyY2VzID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlVUkkgcmVzVVJJID0gcmVzLmdldFVSSSgpOwotCQkJSVBhdGggcmVzVVJJUGF0aDsKLQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1BsYXRmb3JtUmVzb3VyY2VVUkkocmVzVVJJKSkgCi0JCQkJcmVzVVJJUGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUocmVzVVJJLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCQllbHNlIAotCQkJCXJlc1VSSVBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHJlc1VSSS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJU3RyaW5nIHJlc1VSSVN0cmluZyA9IHJlc1VSSVBhdGgudG9TdHJpbmcoKTsKLQkJCWlmICghcmVzVVJJU3RyaW5nLmVxdWFscygiIikgJiYgYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmluZGV4T2YocmVzVVJJU3RyaW5nKSAhPSAtMSkKLQkJCQlyZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGEgTU9GIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCXJlY2VudGx5U2F2ZWRGaWxlc0FkZChhRmlsZSxudWxsKTsKLQkJCWlnbm9yZWRGaWxlc0NhY2hlLnJlbW92ZShhRmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSwgUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQlyZWNlbnRseVNhdmVkRmlsZXNBZGQoYUZpbGUsIHJlcyk7Ci0JCQlpZ25vcmVkRmlsZXNDYWNoZS5yZW1vdmUoYUZpbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWNlbnRseVNhdmVkRmlsZXNBZGQoSUZpbGUgZmlsZSwgUmVzb3VyY2UgcmVzKSB7Ci0JCXJldHVybiByZWNlbnRseVNhdmVkRmlsZXMuYWRkKG5ldyBTYXZlZEZpbGVLZXkocmVzLCBmaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhIHByZVNhdmUgaWYgdGhlIHNhdmUgZmFpbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVjZW50bHlTYXZlZExpc3QoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCXJlY2VudGx5U2F2ZWRGaWxlc0ZvcmNlUmVtb3ZlKGFGaWxlKTsKLQkJCWlnbm9yZWRGaWxlc0NhY2hlLnJlbW92ZShhRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc1JlbW92ZShJRmlsZSBmaWxlKSB7Ci0JCQotCQlib29sZWFuIHJlbW92ZWRGcm9tTGlzdCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVjZW50bHlTYXZlZEZpbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVNhdmVkRmlsZUtleSBrZXkgPSAoU2F2ZWRGaWxlS2V5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoa2V5LnNhdmVkRmlsZSAhPSBudWxsICYmIGtleS5zYXZlZEZpbGUuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJTGlzdCByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoZmlsZSk7Ci0JCQkJaWYgKHJlc291cmNlcy5jb250YWlucyhrZXkucmVzKSkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJcmVtb3ZlZEZyb21MaXN0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVkRnJvbUxpc3Q7Ci0JfQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzRm9yY2VSZW1vdmUoSUZpbGUgZmlsZSkgewotCQkKLQkJYm9vbGVhbiByZW1vdmVkRnJvbUxpc3QgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2VudGx5U2F2ZWRGaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTYXZlZEZpbGVLZXkga2V5ID0gKFNhdmVkRmlsZUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5zYXZlZEZpbGUgIT0gbnVsbCAmJiBrZXkuc2F2ZWRGaWxlLmVxdWFscyhmaWxlKSkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJcmVtb3ZlZEZyb21MaXN0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZEZyb21MaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQganVzdCBhZnRlciB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0U2F2ZShJRmlsZSBhRmlsZSkgewotCQkvL1RPRE8gcmVtb3ZlIHRoaXMgbWV0aG9kCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmFQcm9qZWN0PC9jb2RlPiBoYXMgdGhlIHByb2plY3ROYXR1cmVJRC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5Qcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBhUHJvamVjdC5lcXVhbHMoZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcHRpbWl6ZWQgbm90IHRvIGJlIG5vdCBpbnRlcnJlc3RlZCBpbiBmaWxlcyB3aXRoIGFuIGV4dGVuc2lvbiBvZiAuamF2YSBvciAuY2xhc3Mgb3IgaWYgdGhlCi0JICogZmlsZSBoYXMganVzdCBiZWVuIHNhdmVkIGJ5IG91ciBvd24gaW50ZXJuYWwgbWVjaGFuaXNtLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJbkZpbGUoSUZpbGUgYUZpbGUpIHsKLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYgKENMQVNTX0VYVEVOU0lPTi5lcXVhbHMoZXh0ZW5zaW9uKSB8fCBKQVZBX0VYVEVOU0lPTi5lcXVhbHMoZXh0ZW5zaW9uKSB8fCBKQVZBX0FSQ0hJVkUuZXF1YWxzKGV4dGVuc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZWNlbnRseVNhdmVkRmlsZXNSZW1vdmUoYUZpbGUpKSB7Ci0JCQkJY2FjaGVJZ25vcmVkKGFGaWxlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFoYXNJZ25vcmVkKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFscmVhZHkgaWdub3JlZCB0aGlzIDxjb2RlPmZpbGU8L2NvZGU+IGFuZCB0aGF0IGl0cyBtb2RpZmljYXRpb24KLQkgKiBzdGFtcCBpcyB0aGUgc2FtZSBhcyB3aGVuIHdlIHByb2Nlc3NlZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSWdub3JlZChJRmlsZSBmaWxlKSB7Ci0JCUxvbmcgY2FjaGVkU3RhbXAgPSAoTG9uZykgaWdub3JlZEZpbGVzQ2FjaGUuZ2V0KGZpbGUpOwotCQlpZiAoY2FjaGVkU3RhbXAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbG9uZyBzdGFtcCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJcmV0dXJuIGNhY2hlZFN0YW1wLmxvbmdWYWx1ZSgpID09IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIDxjb2RlPmZpbGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlSWdub3JlZChJRmlsZSBmaWxlKSB7Ci0JCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCWlnbm9yZWRGaWxlc0NhY2hlLnB1dChmaWxlLCBuZXcgTG9uZyhzdGFtcCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZUF1dG9sb2FkKFVSSSB1cmkpIHsKLQkJVVJJIG5vcm1hbGl6ZWQgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJYXV0b2xvYWRSZXNvdXJjZXNVUklzLmFkZChub3JtYWxpemVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b2xvYWQoVVJJIHVyaSkgewotCQlVUkkgbm9ybWFsaXplZCA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlhdXRvbG9hZFJlc291cmNlc1VSSXMucmVtb3ZlKG5vcm1hbGl6ZWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQlwdWJsaWMgdm9pZCBlbmFibGVBdXRvbG9hZChTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzRXh0cy5hZGQoZXh0ZW5zaW9uKTsKLQkJCi0JfQotCXB1YmxpYyB2b2lkIGRpc2FibGVBdXRvbG9hZChTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzRXh0cy5yZW1vdmUoZXh0ZW5zaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQlleHRlbmRlcnMgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvSVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NTkwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvSVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDE4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpIFRoaXMgaXMgdGhlIGFic3RyYWN0aW9uIGxheWVyIGZvciB2YWxpZGF0ZSBlZGl0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRlRWRpdENvbnRleHQgZXh0ZW5kcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJWYWxpZGF0ZUVkaXRDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBmVmFsaWRhdG9yKTsKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGZWYWxpZGF0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOGJjNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgY29udHJvbGxlZCByZXNvdXJjZXMgb3IgZmlsZXMgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RpcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgTU9GIFJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBtYW5hZ2VkLiBTeW5jaHJvbml6YXRpb24KLQkgKiBjaGVja2luZyB3aWxsIG9ubHkgd29yayBpZiB5b3UgYXJlIHVzaW5nIHRoZSBlbWYud29ya2JlbmNoIHBsdWdpbiBhcGlzIGZvciBsb2FkaW5nIHJlc291cmNlcy4KLQkgKiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgeW91IGdldCBhbiBpbnN0YW5jZSBvZiBhIDxjb2RlPlJlZmVyZW5jZWRSZXNvdXJjZTwvY29kZT4uIFRoaXMKLQkgKiByZXNvdXJjZSB0eXBlIGlzIGNhcGFibGUgb2YgY2FjaGluZyBpdHMgbGFzdCBrbm93biBzeW5jaHJvbml6YXRpb24gc3RhbXAgdGhhdCBtYXkgYmUgdXNlZCB0bwotCSAqIHRlc3QgaWYgdGhlIHJlc291cmNlIGlzIGNvbnNpdGVudCB3aXRoIHRoZSB1bmRlcmx5aW5nIElGaWxlLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiBJRmlsZXMgdGhhdCBhcmUgbm90IE1PRiBSZXNvdXJjZXMgdGhhdCBhcmUgYWxzbyBiZWluZwotCSAqIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCUxpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBMaXN0IGZyb20gZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHRoYXQgYXJlIGluY29uc2lzdGVudCB3aXRoIHRoZQotCSAqIHVuZGVybHlpbmcgamF2YS5pby5GaWxlLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHByb3ZpZGVyIHRvIGNhY2hlIHRoZSBzeW5jaHJvbml6YXRpb24gc3RhbXAgZm9yIHRoZSBMaXN0IG9mCi0JICogPGNvZGU+cm9Ob25SZXNvdXJjZUZpbGVzPC9jb2RlPi4gVGhpcyBzdGFtcCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbmNvbnNpc3RlbnQKLQkgKiBmaWxlcy4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBvZiBJRmlsZXMgdGhhdCBhcmUgbm90IE1PRiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJvTm9uUmVzb3VyY2VGaWxlcwotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpCi0JICovCi0Jdm9pZCBjYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcyk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMzN2M0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgewotCXN0YXRpYyBmaW5hbCBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSkVNVXRpbFBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBpcyBhY3RpdmF0ZWQgKGJlY29tZXMKLQkgKiBhY3RpdmUpLiBUaGlzIHdpbGwgY2hlY2sgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXMgdG8gc2VlIGlmIHRoZXkgYXJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIGxhc3QgY2FjaGVkIG1vZGlmaWVkIHZhbHVlLiBUaGUgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBzaG91bGQgYmUgcHJlcGFyZWQgdG8KLQkgKiBwcm9tcHQgdGhlIHVzZXIgaWYgdGhleSB3b3VsZCBsaWtlIHRvIHJlZnJlc2ggd2l0aCB0aGUgY29udGVudHMgb24gZGlzayBpZiB3ZSBhcmUgZGlydHkuCi0JICovCi0Jdm9pZCBjaGVja0FjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gbG9vc2VzIGFjdGl2YXRpb24uIFRoaXMgd2lsbAotCSAqIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdAotCSAqIGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gVGhlIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvIHByb21wdCB0aGUgdXNlciBpZgotCSAqIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGUgZmlsZXMgYXJlIGFib3V0IHRvIGJlIG1vZGlmaWVkIGFmdGVyIGEKLQkgKiA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IGJlY29tZXMgYWN0aXZlLiBUaGUgcmV0dXJuZWQgSVN0YXR1cyBtYXkgaGF2ZSBhbiBFUlJPUiBzdGF0dXMgd2hpY2gKLQkgKiBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHRoZSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IHNhdmluZyB0aGUgbW9kaWZpZWQKLQkgKiBjb250ZW50cy4gVGhpcyB3aWxsIGNoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZQotCSAqIHN5bmNocm9uaXplZC4gSWYgdHJ1ZSBpcyByZXR1cm5lZCwgdGhlIHNhdmUgY2FuIHByb2NlZWQuCi0JICovCi0JYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSByZWFkIG9ubHkgZmlsZXMuCi0JICovCi0JYm9vbGVhbiBjaGVja1JlYWRPbmx5KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGI2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgewotCXByb3RlY3RlZCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgTWFwIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGVja2luZ0NvbnNpc3RlbmN5OwotCi0JY2xhc3MgUmVmcmVzaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNlcHRpb247Ci0JCUxpc3QgZmlsZXM7Ci0JCUxpc3QgcmVzb3VyY2VzOwotCi0JCVJlZnJlc2hSdW5uYWJsZShMaXN0IHNvbWVGaWxlcywgTGlzdCBpbmNvbnNpc3RlbnRSZXNvdXJjZXMpIHsKLQkJCWZpbGVzID0gc29tZUZpbGVzOwotCQkJcmVzb3VyY2VzID0gaW5jb25zaXN0ZW50UmVzb3VyY2VzOwotCQl9Ci0KLQkJcHVibGljIENvcmVFeGNlcHRpb24gZ2V0VGhyb3duRXhjZXB0aW9uKCkgewotCQkJcmV0dXJuIHRocm93bkV4Y2VwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCXByZXBhcmVSZXNvdXJjZXNGb3JSZWZyZXNoKHJlc291cmNlcyk7Ci0JCQkJcHJpbVJlZnJlc2hGaWxlcyhmaWxlcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvd25FeGNlcHRpb24gPSBlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlc291cmNlU3RhdGVWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsKFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyIGFQcm92aWRlcikgewotCQlwcm92aWRlciA9IGFQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIDxjb2RlPmFMaXN0ZW5lcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzIGFjdGl2ZSkuCi0JICogVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUKLQkgKiBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gPGNvZGU+YUxpc3RlbmVyPC9jb2RlPiBzaG91bGQgYmUgcHJlcGFyZWQgdG8gcHJvbXB0IHRoZSB1c2VyIGlmCi0JICogdGhleSB3b3VsZCBsaWtlIHRvIHJlZnJlc2ggd2l0aCB0aGUgY29udGVudHMgb24gZGlzayBpZiB3ZSBhcmUgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFwcm92aWRlci5pc0RpcnR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7Ci0JCUxpc3QgaW5jb25zaXN0ZW50RmlsZXMgPSBnZXRGaWxlcyhpbmNvbnNpc3RlbnRSZXNvdXJjZXMpOwotCQlpbmNvbnNpc3RlbnRGaWxlcyA9IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHByZXNlbnRlci5wcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKGluY29uc2lzdGVudEZpbGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tSZWFkT25seSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tSZWFkT25seSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKCk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmVzdWx0ID0gY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzKCkgewotCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29uc2lzdGVuY3koUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ2hlY2tpbmdDb25zaXN0ZW5jeSB8fCBwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7Ci0JCQlMaXN0IGluY29uc2lzdGVudEZpbGVzID0gZ2V0RmlsZXMoaW5jb25zaXN0ZW50UmVzb3VyY2VzKTsKLQkJCWluY29uc2lzdGVudEZpbGVzID0gYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhpbmNvbnNpc3RlbnRGaWxlcyk7Ci0JCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJYm9vbGVhbiBzaG91bGRSZWZyZXNoRmlsZXMgPSB0cnVlOwotCQkJLy9EZWZlY3QgMjA4NjU0ICYgMjA5NjMxIHdhbnQgcHJvbXB0IG5vIG1hdHRlciB3aGF0LgotCQkJaWYgKGFueUZpbGVDaGFuZ2VkU2luY2VMYXN0UmVmcmVzaFByb21wdChpbmNvbnNpc3RlbnRGaWxlcykpIHsKLQkJCQljbGVhckxhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKLQkJCQlzaG91bGRSZWZyZXNoRmlsZXMgPSBwcmVzZW50ZXIucHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goaW5jb25zaXN0ZW50RmlsZXMpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuOwotCQkJaWYgKHNob3VsZFJlZnJlc2hGaWxlcykKLQkJCQlyZWZyZXNoRmlsZXMoaW5jb25zaXN0ZW50RmlsZXMsIGluY29uc2lzdGVudFJlc291cmNlcyk7Ci0JCQllbHNlCi0JCQkJY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQl9IGZpbmFsbHkgewotCQkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMuCi0JICogCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzICE9IG51bGwgJiYgIWluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkgewotCQkJTWFwIG1hcCA9IGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJbG9uZyBzdGFtcCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY29uc2lzdGVudEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZmlsZSA9IChJRmlsZSkgaW5jb25zaXN0ZW50RmlsZXMuZ2V0KGkpOwotCQkJCXN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJCW1hcC5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjYWNoZVZhbGlkYXRlU3RhdGUuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZVZhbGlkYXRlU3RhdGUoSVN0YXR1cyBhU3RhdHVzLCBMaXN0IHJlYWRPbmx5UmVzb3VyY2VzLCBMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgewotCQlpZiAoYVN0YXR1cy5pc09LKCkpIHsKLQkJCWlmIChyZWFkT25seVJlc291cmNlcyAhPSBudWxsICYmICFyZWFkT25seVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRPbmx5UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlYWRPbmx5UmVzb3VyY2VzLmdldChpKTsKLQkJCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuc2V0U3luaHJvbml6YXRpb25TdGFtcChyZXMsIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm92aWRlci5jYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShyb05vblJlc291cmNlRmlsZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTGFzdE5vblJlZnJlc2hTdGF0ZU1hcCgpIHsKLQkJaWYgKGxhc3ROb25SZWZyZXNoU3RhdGVNYXAgIT0gbnVsbCkKLQkJCWxhc3ROb25SZWZyZXNoU3RhdGVNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYW55RmlsZUNoYW5nZWRTaW5jZUxhc3RSZWZyZXNoUHJvbXB0LgotCSAqIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbnlGaWxlQ2hhbmdlZFNpbmNlTGFzdFJlZnJlc2hQcm9tcHQoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwgfHwgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IHNpemUgPSBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlMb25nIHN0YW1wID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCXN0YW1wID0gKExvbmcpIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKS5nZXQoZmlsZSk7Ci0JCQlpZiAoc3RhbXAgPT0gbnVsbCB8fCAoc3RhbXAubG9uZ1ZhbHVlKCkgIT0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWlmIChpbmNvbnNpc3RlbnRGaWxlcyA9PSBudWxsIHx8IGluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0JCUxpc3Qgbm9uUmVzRmlsZXMgPSBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0JCWlmIChub25SZXNGaWxlcyAhPSBudWxsKQotCQkJaW5jb25zaXN0ZW50RmlsZXMuYWRkQWxsKG5vblJlc0ZpbGVzKTsKLQkJcmV0dXJuIGluY29uc2lzdGVudEZpbGVzOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgewotCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZpbGVzOwotCQkvL0RldGVybWluZSBjb25zaXN0ZW5jeSBiYXNlZCBvbiB0aGUgc3luY2hyb25pemF0aW9uIG9mIHRoZSBJRmlsZQotCQlmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgaW5jb25zaXN0ZW50ID0gbnVsbDsKLQkJaW50IHNpemUgPSBmaWxlcy5zaXplKCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5jb25zaXN0ZW50LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCi0JCQlpbmNvbnNpc3RlbnQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gaW5jb25zaXN0ZW50OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEluY29uc2lzdGVudFJlc291cmNlcygpIHsKLQkJTGlzdCBtb2ZSZXNvdXJjZXMgPSBwcm92aWRlci5nZXRSZXNvdXJjZXMoKTsKLQkJTGlzdCBpbmNvbnNpc3RlbnQgPSBudWxsOwotCQlpbnQgc2l6ZSA9IG1vZlJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlcykpIHsKLQkJCQlyZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXM7Ci0JCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQocmVmUmVzKSAmJiAocmVmUmVzLmlzTG9hZGVkKCkgJiYgIXJlZlJlcy5pc05ldygpKSkgewotCQkJCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCi0JCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWluY29uc2lzdGVudC5hZGQocmVmUmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJaW5jb25zaXN0ZW50ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGluY29uc2lzdGVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlcyhMaXN0IHJlZlJlc291cmNlcykgewotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdChyZWZSZXNvdXJjZXMuc2l6ZSgpKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVmUmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlZlJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCBsZWFzdCB0aGUgZmlyc3QgdGltZSBhIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIKLQkgKiBiZWNvbWVzIGFjdGl2ZSBhbmQgaXMgYWJvdXQgdG8gZWRpdCBpdHMgY29udGVudHMuIFRoZSByZXR1cm5lZCBJU3RhdHVzIG1heSBoYXZlIGFuIEVSUk9SCi0JICogc3RhdHVzIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHJvUmVzb3VyY2VzLCBub25SZXNST0ZpbGVzLCByb0ZpbGVzID0gbnVsbDsKLQkJTGlzdFtdIHJlYWRPbmx5ID0gc2VsZWN0UmVhZE9ubHlSZXNvdXJjZXMocHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCkpOwotCQlyb1Jlc291cmNlcyA9IHJlYWRPbmx5WzBdOwotCQlyb0ZpbGVzID0gcmVhZE9ubHlbMV07Ci0JCW5vblJlc1JPRmlsZXMgPSBzZWxlY3RSZWFkT25seUZpbGVzKHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKSk7Ci0JCWlmIChub25SZXNST0ZpbGVzICE9IG51bGwpIHsKLQkJCWlmIChyb0ZpbGVzID09IG51bGwpCi0JCQkJcm9GaWxlcyA9IG5vblJlc1JPRmlsZXM7Ci0JCQllbHNlCi0JCQkJcm9GaWxlcy5hZGRBbGwobm9uUmVzUk9GaWxlcyk7Ci0JCX0KLQkJaWYgKHJvRmlsZXMgPT0gbnVsbCB8fCByb0ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcm9GaWxlcy5zaXplKCldOwotCQlyb0ZpbGVzLnRvQXJyYXkoZmlsZXMpOwotCQlPYmplY3QgY3R4ID0gcHJlc2VudGVyICE9IG51bGwgPyBwcmVzZW50ZXIuZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpIDogbnVsbDsKLQkJSVN0YXR1cyByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBjdHgpOwotCQljYWNoZVZhbGlkYXRlU3RhdGUocmVzdWx0LCByb1Jlc291cmNlcywgbm9uUmVzUk9GaWxlcyk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2VsZWN0UmVhZE9ubHlGaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSByb0ZpbGVzCi0JICovCi0JcHJpdmF0ZSBMaXN0IHNlbGVjdFJlYWRPbmx5RmlsZXMoTGlzdCBmaWxlcykgewotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmlsZXM7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlMaXN0IHJlYWRPbmx5ID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJlYWRPbmx5LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNlbGVjdFJlYWRPbmx5UmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHBhcmFtIHJvRmlsZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3RbXSBzZWxlY3RSZWFkT25seVJlc291cmNlcyhMaXN0IHJlc291cmNlcykgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgTGlzdFtde3Jlc291cmNlcywgbnVsbH07Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUxpc3QgcmVhZE9ubHkgPSBudWxsOwotCQlMaXN0IHJvRmlsZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJlYWRPbmx5LmFkZChyZXMpOwotCQkJCWlmIChyb0ZpbGVzID09IG51bGwpCi0JCQkJCXJvRmlsZXMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJvRmlsZXMuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgTGlzdFtde3JlYWRPbmx5LCByb0ZpbGVzfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZpbGVzKExpc3Qgc29tZUZpbGVzLCBMaXN0IGluY29uc2l0ZW50UmVzb3VyY2VzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlZnJlc2hSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSZWZyZXNoUnVubmFibGUoc29tZUZpbGVzLCBpbmNvbnNpdGVudFJlc291cmNlcyk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOwotCQlpZiAocnVubmFibGUuZ2V0VGhyb3duRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCXRocm93IHJ1bm5hYmxlLmdldFRocm93bkV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SZWZyZXNoRmlsZXMoTGlzdCBzb21lRmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBzb21lRmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIHNvbWVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJZWxzZQotCQkJCXJlZnJlc2hSZXNvdXJjZShmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBSZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5maWxlPC9jb2RlPiB0byBmb3JjZSBhCi0JICogcmVmcmVzaC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoZmlsZSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXJlcy51bmxvYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSB0aGUgcmVzb3VyY2VzIHRvIG5vdCBiZSBkaXJ0eSB0byBlbnN1cmUgdGhhdCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZWlyCi0JICogUmVzb3VyY2VTZXQgd2hlbiB0aGVpciBmaWxlIGlzIHJlZnJlc2hlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzb3VyY2VzRm9yUmVmcmVzaChMaXN0IHJlZlJlc291cmNlcykgewotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXMuc2V0Rm9yY2VSZWZyZXNoKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKSB7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwpCi0JCQlsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTQ1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgewotCS8qKgotCSAqIFByZXNlbnQgdG8gdGhlIHVzZXIgdGhhdCB0aGUgPGNvZGU+aW5jb25zaXN0ZW50RmlsZXM8L2NvZGU+IHdpbGwgbmVlZCB0byBiZSByZWZyZXNoZWQgaW4KLQkgKiB0aGUgd29ya2JlbmNoLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVmcmVzaCBzaG91bGQgb2NjdXIuIFRoZSBMaXN0IHdpbGwgYmUgYSBsaXN0IG9mIElGaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jb25zaXN0ZW50RmlsZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZXh0IChTaGVsbCkgdGhhdCB3b3VsZCBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRlRWRpdCBtZXRob2QuIElmIHRoaXMgbWV0aG9kCi0JICogcmV0dXJucyBudWxsLCBhIHByb21wdCB0byBjaGVjayBvdXQgY29kZSB3aWxsIG5vdCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZVtdLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlPYmplY3QgZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUHJlc2VudCBhIGRpYWxvZyB0byB0aGUgdXNlciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGlzIGFib3V0IHRvIHNhdmUgYW5kIG92ZXJ3cml0ZSB0aGUKLQkgKiBsaXN0IG9mIDxjb2RlPmluY29uc2l0ZW50RmlsZXM8L2NvZGVzPi4gIFJldHVybiB0cnVlIGlmCi0JICogdGhlIG92ZXJ3cml0ZSBzaG91bGQgcHJvY2VlZC4gIFRoZSBsaXN0IG9mIDxjb2RlPmluY29uc2l0ZW50RmlsZXM8L2NvZGVzPiB3aWxsCi0JICogYmUgYSBsaXN0IG9mIElGaWxlcy4gCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgYWN0aW9uIHRoYXQgaXMgYWJvdXQgdG8gZWRpdCBhbnkgY29udGVudHMgb2YgYW55IElGaWxlLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1ZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1ZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVmZTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDE4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aSBIZWFkbGVzcyBWYWxpZGF0ZSBFZGl0IENvbnRleHQgSW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dCBpbXBsZW1lbnRzIElWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXByb3RlY3RlZCBib29sZWFuIGZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZk1lc3NhZ2VVcCA9IGZhbHNlOwotCXByb3RlY3RlZCBFZGl0TW9kZWwgZlZhbGlkYXRvciA9IG51bGw7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dCN2YWxpZGF0ZVN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCkgewotCQkvLyBGb3Igbm93IGRvIG5vdGhpbmcgaW4gaGVhZGxlc3Mgc3RhdGUKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVPdmVyd3JpdGUoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkc1N0YXRlVmFsaWRhdGlvbihib29sZWFuIG5lZWRzU3RhdGVWYWxpZGF0aW9uKSB7Ci0JCWZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IG5lZWRzU3RhdGVWYWxpZGF0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0I3NldEVkaXRNb2RlbChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBmVmFsaWRhdG9yKSB7Ci0JCXRoaXMuZlZhbGlkYXRvciA9IGZWYWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQjdmFsaWRhdGVTdGF0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCXNldEVkaXRNb2RlbChlZGl0TW9kZWwpOwotCQlyZXR1cm4gdmFsaWRhdGVTdGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y2MzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuZW52IHBsdWdpbi4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBtYXN0ZXIgc3dpdGNoIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBwbHVnaW4uCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGRpZmZlcmVudCB0cmFjaW5nIGxldmVsCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2luZm89dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93YXJuaW5nPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZXJyb3I9dHJ1ZQotCi0jIFR1cm4gb24gZGF0YSBmbG93IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZGF0YT10cnVlCi0KLSMgVHVybiBvbiBjb21tYW5kIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvY29tbWFuZD10cnVlCi0KLSMgVHVybiBvbiBlbWl0dGVyIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZW1pdHRlcj10cnVlCi0KLSMgVHVybiBvbiB3ZWIgc2VydmljZSBhbnQgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19hbnQ9dHJ1ZQotCi0jIFR1cm4gb24gd2ViIHNlcnZpY2UgZGV0YWlsZWQgY29tbWFuZCBlbmdpbmUgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19kdF9jbWRfZW5naW5lPXRydWUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTcyZWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODk2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM3OjM2IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQzY2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6MjYgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjNlYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjEwMCwzLjIuMCkiCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZSAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTcxM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI1NhdCBNYXIgMzEgMTY6NTg6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDA1YzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7dmlzaWJpbGl0eTo9cmVleHBvcnQ7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWI3M2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHd0cF91aS8sXAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODE5YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUN1dD1DdXQKLUZMRVhJQkxFX1BST0pFQ1RfUFJFRkVSRU5DRT1KMkVFIFByb2plY3QgTW9kdWxlcwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVdUUCBVSSBQbHVnLWluCi1XVFBfVUlfQWN0aW9uPVdUUCBVSSBBY3Rpb24KLUV4dGVuZGVkX1ZpZXdlcnM9RXh0ZW5kZWQgVmlld2VycwotRXh0ZW5kYWJsZV9XaXphcmQ9RXh0ZW5kYWJsZSBXaXphcmQKLUV4dGVuZGFibGVfV2l6YXJkX1BhZ2U9RXh0ZW5kYWJsZSBXaXphcmQgUGFnZQotRGF0YU1vZGVsV2l6YXJkPURhdGFNb2RlbFdpemFyZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTNhYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ind0cHVpQWN0aW9uIiBuYW1lPSIlV1RQX1VJX0FjdGlvbiIgc2NoZW1hPSJzY2hlbWEvd3RwdWlBY3Rpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5kZWRWaWV3ZXIiIG5hbWU9IiVFeHRlbmRlZF9WaWV3ZXJzIiBzY2hlbWE9InNjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbmRhYmxlV2l6YXJkIiBuYW1lPSIlRXh0ZW5kYWJsZV9XaXphcmQiIHNjaGVtYT0ic2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2l6YXJkUGFnZUdyb3VwIiBuYW1lPSIlRXh0ZW5kYWJsZV9XaXphcmRfUGFnZSIgc2NoZW1hPSJzY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIiBuYW1lPSIlRGF0YU1vZGVsV2l6YXJkIiBzY2hlbWE9InNjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iVUlUZXN0ZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlUZXN0ZXIiPgotICAgICAgPHVpVGVzdGVyCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5VSVRlc3RlckltcGwiPgotICAgICAgPC91aVRlc3Rlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLnNhdmVIYW5kbGVyIgotICAgICAgICAgbmFtZT0iU2F2ZSBIYW5kbGVyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ic2F2ZUhhbmRsZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNhdmVIYW5kbGVyVUkiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIG5hbWU9IlVJIEVuYWJsZW1lbnQgRGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIgotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5VSUVuYWJsZW1lbnRNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPgotICAgICAgPFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCI+Ci0gICAgICA8L1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFscy5PcGVyYXRpb25FeHRlbnNpb24iPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbi51aS5Qb3N0UGFzdGVBY3Rpb25PcGVyYXRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuUGFzdGVBY3Rpb25PcGVyYXRpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkiCi0gICAgICAgICAgY29udGV4dD0iVUkiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZGNhNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24udWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGVmMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWwgPSBQcm9qZWN0IGNvbnRlbnRzOgotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWwgPSBVc2UgJmRlZmF1bHQKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCA9IERpcmVjdG9yJnk6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvd3RwY29tbW9udWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjYxYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvd3RwY29tbW9udWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSUFjdGlvbldUUE9wZXJhdGlvbl9VSV8wPU5vIGFjdGlvbiBhdmFpbGFibGUgZm9yIGV4ZWN1dGlvbi4KLVdUUEFjdGlvbkRpYWxvZ19VSV8wPVNlbGVjdCB0aGUgb3B0aW9uYWwgZGVwZW5kZW50IGFjdGlvbnMgeW91IHdvdWxkIGxpa2UgdG8gZXhlY3V0ZS4KLVdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzA9Um9vdCB0cmVlIGNhbiBub3QgYmUgc2VsZWN0ZWQuCi1XVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8xPU5vIG9wZXJhdGlvbnMgYXJlIHNlbGVjdGVkLgotTWFzdGVyRGVzY3JpcHRvcl9FUlJPUl8yPUlXQUUwMDA1RSBXVFBVSU9wZXJhdGlvbiBlbGVtZW50cyByZXF1aXJlIGV4YWN0bHkgb25lIDxzZWxlY3Rpb25FbmFibGVtZW50IC8+LgotV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzA9T3BlcmF0aW9uIFN0YXR1cwotV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzE9UHJvYmxlbSBleGVjdXRpbmcgb3BlcmF0aW9uLgotVGltZXJRdWV1ZV9FUlJPUl8wPUlXQUUwMDA2RSBDYW4ndCBzdGFydCBhIFRpbWVyUXVldWUgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcKLUV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8wPUlXQUUwMDA3RSBDYW5ub3QgbW9kaWZ5IGlkIGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2V0LgotRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzE9SVdBRTAwMDhFIFRoZSBpZCBjYW5ub3QgYmUgbnVsbAotTWFzdGVyRGVzY3JpcHRvcl9VSV8xPU5vIFwiIHswfSBcIiBhdHRyaWJ1dGUgZGVmaW5lZAotVGltZXJfVUlfMD1JbnZhbGlkIGRlbGF5OiB7MH0KLVRpbWVyX1VJXzE9SW52YWxpZCBpbml0aWFsIGRlbGF5OiB7MH0KLVdUUFdpemFyZF9VSV8wPVdpemFyZCBFcnJvcjogezB9Ci1XVFBXaXphcmRfVUlfMT1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiB7MH0gZmluaXNoZWQuCi1XVFBXaXphcmRfVUlfMj1XaXphcmQgV2FybmluZzogezB9Ci1FeHRlbmRhYmxlV2l6YXJkX1VJXzA9V2l6YXJkIHBhZ2UgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gezB9IHsxfQotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMD1FbGVtZW50OiB7MH0gZG9lcyBub3QgYWxsb3cgcGFnZSBpbnNlcnRpb24gYWZ0ZXIuCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xPXswfSB3aWxsIG5vdCBiZSBjcmVhdGVkCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8yPUNpcmN1bGFyIGRlcGVuZGVuY3ksIGVsZW1lbnQ6IHswfSBjaGVjazogezF9Ci1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8zPUVkaXRvciBkb2VzIG5vdCBhbGxvdyBwYWdlIGluc2VydGlvbnMKLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzQ9UGFyZW50IENsYXNzIE5vdCBGb3VuZCBFcnJvcjogezB9IFxyXG4gZm9yIGF0dHJpYnV0ZTogezF9IGluIHBsdWdpbiB7Mn0gXHJcblBhZ2Ugbm90IGNyZWF0ZWQKLURlbGV0ZV9VSV8wPURlbGV0ZQotTmFtZV89UHJvamVjdCBuYW1lOgotQnJvd3NlXz1Ccm93c2UuLi4KLVByb2plY3RfbG9jYXRpb25fPVByb2plY3QgTG9jYXRpb246Ci1NVUxUSVBMRV9NT0RVTEVfUFJFRl9URVhUPUFsbG93IE11bHRpcGxlIG1vZHVsZXMgcGVyIHByb2plY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNzViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJEYXRhTW9kZWxXaXphcmRFeHRlbnNpb24iIG5hbWU9IkRhdGEgTW9kZWwgV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbiBleHRlbnNpb24gdG8gYSBzcGVjaWZpYyBEYXRhIE1vZGVsIFdpemFyZC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iRGF0YU1vZGVsV2l6YXJkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJEYXRhTW9kZWxXaXphcmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBkYXRhIG1vZGVsIHdpemFyZCBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCB3aXphcmQgY2xhc3MgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDk5MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iZXh0ZW5kYWJsZVdpemFyZCIgbmFtZT0iRXh0ZW5kYWJsZSBXaXphcmQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBkZWNsYXJlcyBhIGRhdGEgbW9kZWwgd2l6YXJkIGFzIGEgdmFsaWQgZXh0ZW5kYWJsZSB3aXphcmQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbmRhYmxlV2l6YXJkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbmRhYmxlV2l6YXJkIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHJlcXVpcmVkIGlkIGZvciB0aGUgZGF0YSBtb2RlbCB3aXphcmQgaW5zdGFuY2UgdG8gYmUgZXh0ZW5kZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwYTljYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJ3aXphcmRQYWdlR3JvdXAiIG5hbWU9IkV4dGVuZGFibGUgV2l6YXJkIFBhZ2UiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBhbGxvd3MgeW91IHRvIGFkZCBhbiBkYXRhIG1vZGVsIHdpemFyZCBwYWdlIHRvIGEgcHJlZGVmaW5lZCBleHRlbnNhYmxlIGRhdGEgbW9kZWwgd2l6YXJkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIi8+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlR3JvdXAiLz4NCi0gICAgICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2VHcm91cCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2l6YXJkSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG1hdGNoIHRoZSBpZCBkZWZpbmVkIGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGVsZW1lbnQgaW4gdGhlIGV4dGVuZGFibGVXaXphcmQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIHNwZWNpZnkgd2hldGhlciB0aGlzIHBhZ2UgYWxsb3dzIGV4dGVuZGVkIHBhZ2VzIGFmdGVyIGl0c2VsZiwgZGVmYXVsdCBpdCB0cnVlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VHcm91cEluc2VydGlvbklEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFnZSBpcyB0byBpbW1lZGlhdGVseSBhZnRlciBhbm90aGVyIHBhZ2UsIHRoaXMgbXVzdCBtYXRjaCB0aGUgcGFnZUlEIG9mIHRoZSBwYWdlIHRvIGluc2VydCBhZnRlci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFnZUdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgdGhlIHBhZ2UgZ3JvdXAgSUQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpemFyZElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBtYXRjaCB0aGUgaWQgZGVmaW5lZCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBlbGVtZW50IGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgY2xhc3MgaXMgYW4gaW5zdGFuY29mIGNvbS5pYm0ud3RwLmNvbW1vbi51aS53aXphcmQuZXh0ZW5zaW9ucy5XaXphcmRFeHRlbnNpb25GYWN0b3J5DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotDQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg5MDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJleHRlbmRlZFZpZXdlciIgbmFtZT0iRXh0ZW5kZWQgVmlld2VycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZXh0ZW5kZWRWaWV3ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0aGUgY29udHJpYnV0aW9uIG9mIG5ldyBmdW5jdGlvbiB0byBhbiBleGlzdGluZyB2aWV3ZXIuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbmRlZFZpZXdlciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5kZWRWaWV3ZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdlcklEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgcmVxdWlyZWQgaWQgZm9yIHRoZSBleHRlbmRlZFZpZXdlciBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRWaWV3ZXJJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZCB1c2VkIHRvIHNwZWNpZnkgYSBwYXJlbnQgdmlld2VyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgZmFjdG9yeSBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBvcHRpb25hbCBwYXRoIHRvIGFuIGljb24gaW1hZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSByZXF1aXJlZCBsYWJlbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4dGVuZGVkIHZpZXdlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgc2V0dGluZyB0byBhc3NvY2lhdGUgdGhlIGV4dGVuZGVkIHZpZXdlciB3aXRoIGEgc3BlY2lmaWMgZnVuY3Rpb24gZ3JvdXAgaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvd3RwdWlBY3Rpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4ODYxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvd3RwdWlBY3Rpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0id3RwdWlBY3Rpb24iIG5hbWU9IldUUCBVSSBBY3Rpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZm9yIFdUUCBPcGVyYXRpb25zIHdoaWNoIG5lZWQgdG8gYmUgdGllZCB0byBhIGdlbmVyaWMgVUkgYWN0aW9uLCBzdWNoIGFzIENVVCwgQ09QWSwgUEFTVEUsIERFTEVURSwgYW5kIFJFTkFNRS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFzdGVyT3BlcmF0aW9uIi8+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzbGF2ZU9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibWFzdGVyT3BlcmF0aW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBBIG1hc3Rlck9wZXJhdGlvbiBlbmFibGVzIGFuIGV4aXN0aW5nIFdUUCBPcGVyYXRpb24gdG8gYmUgdXNlZCBpbiBhIFVJIGFjdGlvbi4gR2VuZXJpYyBJZHMgYWdncmVnYXRlIGEgc2V0IG9mIG1hc3Rlck9wZXJhdGlvbnMgZm9yIHRoZSBzYW1lIEFic3RyYWN0IGFjdGlvbiAobGlrZSBhICZxdW90O0NVVCZxdW90OyBvcGVyYXRpb24pLiBXVFAgT3BlcmF0aW9ucyBhcmUgdGhlbXNlbHZlcyBleHRlbmRpYmxlLCBzbyBmb3IgYW55IG1hc3Rlck9wZXJhdGlvbiBkZWZpbmVkLCB0aGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBwcmV8cG9zdCBvcGVyYXRpb25zLiBUaGVzZSBwcmV8cG9zdCBvcGVyYXRpb24gY2FuIGhhdmUgc2xhdmVPcGVyYXRpb24gZWxlbWVudHMgZGVmaW5lZCB3aGljaCBpbmRpY2F0ZSB0aGUgcHJlfHBvc3Qgb3BlcmF0aW9uIG1heSBiZSBydW4gaW5kZXBlbmRlbnRseS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWxlY3Rpb25FbmFibGVtZW50Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuZGVkR2VuZXJpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgR2VuZXJpYyBBY3Rpb24geW91IHdvdWxkIGxpa2UgdG8gY29udHJpYnV0ZSB0by4gKGUuZy4gVGhlIGlkIGZvciBDVVQsIENPUFksIFBBU1RFLCBERUxFVEUsIFJFTkFNRSkuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Mgb2YgeW91ciBvcGVyYXRpb24uIFlvdXIgb3BlcmF0aW9uIG11c3QgYmUgYSBXVFBPcGVyYXRpb24gYW5kIG11c3QgcHJvdmlkZSBhIG5vLWFyZ3VtZW50cyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgcHJvdmlkZWQsIHRoZSBnZXREZWZhdWx0T3BlcmF0aW9uKCkgcmV0dXJuZWQgYnkgdGhlIGRhdGFNb2RlbCB3aWxsIGJlIHVzZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBuYW1lIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3B1bGF0b3JDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgcG9wdWxhdG9yQ2xhc3Mga25vd3MgaG93IHRvIHByb3ZpZGUgYSBXVFAgT3BlcmF0aW9uIERhdGEgTW9kZWwgYmFzZWQgb24gYSBnaXZlbiBzZWxlY3Rpb24uIFRoZSBnZXREZWZhdWx0T3BlcmF0aW9uKCkgbWV0aG9kIG9mIHRoZSBkYXRhIG1vZGVsIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgb3BlcmF0aW9uQ2xhc3MgaXMgcHJvdmlkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsd2F5c0V4ZWN1dGUiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gZGV0ZXJtaW5lIGV4ZWN1dGlvbiBjb250ZXh0DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlSWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBkZWZpbmUgYW4gb3ZlcnJpZGFibGUgaWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgaWRlbnRpZmljYXRpb24gZm9yIG9wZXJhdGlvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0aW9uRW5hYmxlbWVudCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIHNlbGVjdGlvbkVuYWJsZW1lbnQgZWxlbWVudCBhbGxvd3MgeW91IHRvIGZpbHRlciB3aGljaCBraW5kcyBvZiBzZWxlY3Rpb24geW91ciBvYmplY3QgaXMgYXBwbGljYWJsZSB0byB1c2luZyBTdGFuZGFyZCBFY2xpcHNlIEFjdGlvbiBFeHByZXNpb25zLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzbGF2ZU9wZXJhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBvcGVyYXRpb25zIHdoaWNoIGV4dGVuZCBhIGRlY2xhcmVkIG1hc3RlciBvcGVyYXRpb24uIElmIGEgcHJlfHBvc3Qgb3BlcmF0aW9uIG9mIGEgbWFzdGVyIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnQsIHRoZW4gdGhlIHByZXxwb3N0IG9wZXJhdGlvbiB3aWxsIGJlIGNvbnNpZGVyIHJlcXVpcmVkLCBhbmQgbm90IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Mgb2YgeW91ciBvcGVyYXRpb24uIFlvdXIgb3BlcmF0aW9uIG11c3QgYmUgYSBXVFBPcGVyYXRpb24gYW5kIG11c3QgcHJvdmlkZSBhIG5vLWFyZ3VtZW50cyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBGb3Igc2xhdmUgb3BlcmF0aW9ucywgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIG1hc3RlciBvcGVyYXRpb24gd2lsbCBiZSBwcm92aWRlZC4gVGhlcmVmb3JlLCBzbGF2ZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBkYXRhIG1vZGVsIHVzaW5nIGEgc2VwZXJhdGUgcG9wdWxhdG9yQ2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBuYW1lIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBmb3IgeW91ciBhY3Rpb24gKGlmIHRoZSBvcGVyYXRpb24gaXMgb3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgJnF1b3Q7JWtleSZxdW90OyBmb3IgdHJhbnNsYXRhYmxlIHRleHQgc3RvcmVkIGluIHBsdWdpbi5wcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib3IiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFuZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0U3RhdGUiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RDbGFzcyI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFkYXB0YWJsZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBjbGFzcyBhcyBhZGFwdGFibGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImFuZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RDbGFzcyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RTdGF0ZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgb2JqZWN0IHN0YXRlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyBmb3IgYW4gb2JqZWN0IHN0YXRlIG5hbWUgdG8gY2hlY2sgdGhlIHNlbGVjdGVkIG9iamVjdCZhcG9zO3MgdmFsdWUgaXMgbWF0Y2hpbmcgd2l0aA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0OyEtLSBUaGUgZXhhbXBsZXMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgYmVlbiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhleSByZWZlcmVuY2Ugb25seSBleHRlbnNpb24gcG9pbnQgSURzLiBUaGVzZSBleGFtcGxlcyBtdXN0IGJlIGNvcnJlY3RlZCBiZWZvcmUgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIC0tJmd0Ow0KLSZsdDshLS0NCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgdHdvIE1hc3RlciBPcGVyYXRpb25zICgmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQSZsdDsvY29kZSZndDsgYW5kICZsdDtjb2RlJmd0O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25CJmx0Oy9jb2RlJmd0Oykgd2hpY2ggYXJlIGF0dGFjaGVkIHRvIHRoZSBHZW5lcmljIElEICZsdDtjb2RlJmd0O2NvbS5hY21lLnVpLldUUE9wdGlvbmFsT3BlcmF0aW9uVGVzdCZsdDsvY29kZSZndDsuIA0KLVRoZSBzY2VuYXJpbyBoYXMgTWFzdGVyIEEgd2hpY2ggaGFzIGFzIGEgcHJlLW9wZXJhdGlvbiBvZiBTbGF2ZSBBIGFuZCBhIHBvc3Qtb3BlcmF0aW9uIG9mIFNsYXZlIEMuIFNsYXZlIEEgaXMgbWFkZSBvcHRpb25hbCBieSB0aGUgJmx0O2NvZGUmZ3Q7c2xhdmVPcGVyYXRpb24mbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQsIHdoaWxlIFNsYXZlIEMgd2lsbCBhbHdheXMgYmUgcnVuIChubyAmbHQ7Y29kZSZndDtzbGF2ZU9wZXJhdGlvbiZsdDsvY29kZSZndDsgaXMgZ2l2ZW4gdG8gcnVuIGl0IHNlcGVyYXRlbHkpLiBTbGF2ZSBBIGZ1cnRoZXIgaGFzIGFuIG9wdGlvbmFsIHByZS1vcGVyYXRpb24gKFNsYXZlIEIpIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluZGVwZW50bHkgb2YgZWl0aGVyIFNsYXZlIEEgb3IgTWFzdGVyIEEuDQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53dHB1aUFjdGlvbiZxdW90OyZndDsNCi0gICAgICAmbHQ7bWFzdGVyT3BlcmF0aW9uDQotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLkFjbWVPcGVyYXRpb25Qb3B1bGF0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVtYXN0ZXJfYV9uYW1lJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsNCi0gICAgICAgICAgICBleHRlbmRlZEdlbmVyaWNJZD0mcXVvdDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslbWFzdGVyX2FfZGVzY3JpcHRpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9tYXN0ZXJPcGVyYXRpb24mZ3Q7IA0KLSAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7U2xhdmUgQSZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zbGF2ZU9wZXJhdGlvbiZndDsgDQotICAgICAgJmx0O3NsYXZlT3BlcmF0aW9uDQotICAgICAgICAgICAgbmFtZT0mcXVvdDtTbGF2ZSBCJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQiZxdW90OyZndDsNCi0gICAgICAmbHQ7L3NsYXZlT3BlcmF0aW9uJmd0OyAgICAgIA0KLSAgICAgICZsdDttYXN0ZXJPcGVyYXRpb24NCi0gICAgICAgICAgICBwb3B1bGF0b3JDbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uQWNtZU9wZXJhdGlvblBvcHVsYXRvciZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7RUFSIFByb2plY3QgQWN0aW9uJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkImcXVvdDsNCi0gICAgICAgICAgICBleHRlbmRlZEdlbmVyaWNJZD0mcXVvdDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmcXVvdDsmZ3Q7DQotICAgICAgICAgICAgJmx0O3NlbGVjdGlvbkVuYWJsZW1lbnQmZ3Q7IA0KLSAgICAgICAgICAgICAmbHQ7b2JqZWN0U3RhdGUgbmFtZT0mcXVvdDtwcm9qZWN0TmF0dXJlJnF1b3Q7IHZhbHVlPSZxdW90O29yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSZxdW90OyAvJmd0Ow0KLSAgICAgICAgICAgICZsdDsvc2VsZWN0aW9uRW5hYmxlbWVudCZndDsNCi0gICAgICAmbHQ7L21hc3Rlck9wZXJhdGlvbiZndDsgICANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsgICANCi0tLSZndDsNCi0mbHQ7IS0tDQotRm9yIGVhY2ggb2YgdGhlIHNsYXZlT3BlcmF0aW9ucyByZWZlcmVuY2VkIGFib3ZlLCB5b3UgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBXVFAgT3BlcmF0aW9uIEV4dGVuc2lvbiBkZWNsYXJlZCBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7IA0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBpZD0mcXVvdDt3dHB1aUFjaXRvbi5BY21lLkV4dGVuc2lvbnMmcXVvdDsNCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRXh0ZW5kYWJsZU9wZXJhdGlvbiZxdW90OyZndDsNCi0gICAgICAmbHQ7ZXh0ZW5kYWJsZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9leHRlbmRhYmxlT3BlcmF0aW9uJmd0Ow0KLSAgICAgICZsdDtleHRlbmRhYmxlT3BlcmF0aW9uDQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9leHRlbmRhYmxlT3BlcmF0aW9uJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uJnF1b3Q7Jmd0Oy0tJmd0Ow0KLSAgICAgICZsdDshLS0gTWFkZSBvcHRpb25hbCBieSB0aGUgYWJvdmUgZGVjbGFyYXRpb24gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7LS0mZ3Q7DQotICAgICAgJmx0OyEtLSBNYWRlIG9wdGlvbmFsIGJ5IHRoZSBhYm92ZSBkZWNsYXJhdGlvbiAtLSZndDsNCi0gICAgICAmbHQ7IS0tJmx0O29wZXJhdGlvbkV4dGVuc2lvbg0KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25CJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90OyZndDsNCi0gICAgICAmbHQ7L29wZXJhdGlvbkV4dGVuc2lvbiZndDstLSZndDsgICANCi0gICAgICAmbHQ7IS0tIE5vbi1vcHRpb25hbCBvcGVyYXRpb24sIHdpbGwgYWx3YXlzIHJ1biAtLSZndDsNCi0gICAgICAmbHQ7IS0tJmx0O29wZXJhdGlvbkV4dGVuc2lvbg0KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25DJnF1b3Q7DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7ICANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgDQotJmx0Oy9wcmUmZ3Q7DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLUluIGdlbmVyYWwsIHVzZXJzIGV4dGVuZGluZyBleGlzdGluZyBhY3Rpb25zIG9ubHkgbmVlZCB0byBkZWNsYXJlIHRoZSBmb2xsb3dpbmc6IA0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0Ow0KLSAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiZxdW90OyZndDstLSZndDsgDQotICZsdDshLS0gVGhlIGFjdGlvbiByZWZlcmVuY2VkIG11c3QgYmUgZGVjbGFyZWQgYXMgZXh0ZW5zaWJsZSBieSB0aGUgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRXh0ZW5kYWJsZU9wZXJhdGlvbiBleHRlbnNpb24gcG9pbnQgLS0mZ3Q7ICAgICAgICAgDQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0mcXVvdDsuLi5ZT1VSIENMQVNTLi4uJnF1b3Q7ICAgICAgICAgICAgDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Li4uSUQgT0YgRVhJU1RJTkcgT1BFUkFUSU9OLi4uJnF1b3Q7Jmd0OyANCi0gICAgICAmbHQ7L29wZXJhdGlvbkV4dGVuc2lvbiZndDsgDQotICZsdDsvZXh0ZW5zaW9uJmd0OyAgICAgIA0KLSZsdDsvcHJlJmd0OyAgICAgIA0KLS0tJmd0Ow0KLSZsdDshLS0NCi1BbmQgaWYgeW91ciBvcGVyYXRpb24gaXMgb3B0aW9uYWwgZGVjbGFyZSB0aGUgc2xhdmVPcGVyYXRpb246DQotLS0mZ3Q7DQotJmx0OyEtLQ0KLSZsdDtwcmUmZ3Q7IA0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24mcXVvdDsmZ3Q7IA0KLSAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7Li5OQU1FIE9GIFlPVVIgT1BFUkFUSU9OLi4uJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7Li4uREVTQ1JJUFRJT04gT0YgWU9VUiBBQ1RJT04uLi4mcXVvdDsNCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0mcXVvdDsuLi5ZT1VSIENMQVNTLi4uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvc2xhdmVPcGVyYXRpb24mZ3Q7IA0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAgICAgIA0KLSZsdDsvcHJlJmd0Ow0KLS0tJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvQWRkYWJsZVBhZ2VHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvQWRkYWJsZVBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2MzMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotcHVibGljIGludGVyZmFjZSBBZGRhYmxlUGFnZUdyb3VwIGV4dGVuZHMgIElETVBhZ2VHcm91cAotewotICBwdWJsaWMgdm9pZCBhZGRQYWdlKCBJV2l6YXJkUGFnZSBwYWdlICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxTeW5jaEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlZDI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxTeW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbFN5bmNoSGVscGVyIGltcGxlbWVudHMgSURhdGFNb2RlbExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMaW51eCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiTGludXgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJvdGVjdGVkIE1hcCB3aWRnZXRUb1Byb3BlcnR5SGFzaDsKLQlwcm90ZWN0ZWQgTWFwIHByb3BlcnR5VG9XaWRnZXRIYXNoOwotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9EZXBDb250cm9sczsKLQotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotCXByb3RlY3RlZCBXaWRnZXQgY3VycmVudFdpZGdldDsKLQlwcm90ZWN0ZWQgV2lkZ2V0IGN1cnJlbnRXaWRnZXRGcm9tRXZlbnQ7IC8vIFRPRE8gTTQgc2VlIGlmIHRoaXMgc2hvdWxkIGJlIHNldCB3aXRoIGZvcgotCS8vIGxpc3RlbmVycwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0KLQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJcmV0dXJuOwotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSB0ZXh0KQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQodGV4dCk7Ci0JCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kaWZ5VGV4dExpc3RlbmVyIG1vZGlmeVRleHRMaXN0ZW5lcjsKLQlwcml2YXRlIFRpbWVkTW9kaWZ5TGlzdGVuZXIgdGltZWRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJcmV0dXJuOwotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBjb21ibykKLQkJCQlyZXR1cm47Ci0KLQkJCXRyeSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IGNvbWJvOwotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQoY29tYm8pOwotCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQkvLyBPbiBhIGNvbWJvIHNlbGVjdGlvbiBsaW51eCBmaXJlcyAyIGV2ZW50czsKLQkJCQkvLyB0aGUgZmlyc3QgY2xlYXJzIHRoZSB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSBpZ25vcmVkIHdoZW4gdGhlIHR5cGUgaXMgbm90IFN0cmluZwotCQkJCS8vIHRoZSBzZWNvbmQgc2V0cyB0aGUgbmV3IHZhbHVlCi0JCQkJaWYgKGlzTGludXggJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPT0gMCAmJiBkZXNjcmlwdG9ycy5sZW5ndGggIT0gMCAmJiAhKGRlc2NyaXB0b3JzWzBdLmdldFByb3BlcnR5VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkZXNjcmlwdGlvbi5lcXVhbHMoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKSkgewotCQkJCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgY29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ID09IGNvbWJvKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQoY29tYm8pOwotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPj0gMCkgewotCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tYm9MaXN0ZW5lciBjb21ib0xpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ID09IGJ1dHRvbikKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGJ1dHRvbik7Ci0JCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ldyBCb29sZWFuKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBtb2RlbDsKLQkJZGF0YU1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lciBjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIGNsYXNzIENoZWNrQm94Vmlld2VyTGlzdGVuZXIgaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlDaGVja2JveFRhYmxlVmlld2VyIGNoZWNrQm94VGFibGVWaWV3ZXI7Ci0JCQlDaGVja2JveFRyZWVWaWV3ZXIgY2hlY2tCb3hUcmVlVmlld2VyOwotCQkJT2JqZWN0W10gaXRlbXMgPSBudWxsOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIENoZWNrYm94VGFibGVWaWV3ZXIpIHsKLQkJCQljaGVja0JveFRhYmxlVmlld2VyID0gKENoZWNrYm94VGFibGVWaWV3ZXIpIHZpZXdlcjsKLQkJCQlpdGVtcyA9IGNoZWNrQm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQl9IGVsc2UgaWYgKHZpZXdlciBpbnN0YW5jZW9mIENoZWNrYm94VHJlZVZpZXdlcikgewotCQkJCWNoZWNrQm94VHJlZVZpZXdlciA9IChDaGVja2JveFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCQlpdGVtcyA9IGNoZWNrQm94VHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJCX0KLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSB3aWRnZXRUb1Byb3BlcnR5SGFzaC5nZXQodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCQlzZXRQcm9wZXJ0eUl0ZW1zKHByb3BlcnR5TmFtZSwgaXRlbXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaW50IGZsYWcgPSBldmVudC5nZXRGbGFnKCk7Ci0JCWlmIChmbGFnID09IERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcpCi0JCQlzZXRFbmFibGVtZW50KHByb3BlcnR5TmFtZSwgZXZlbnQuaXNQcm9wZXJ0eUVuYWJsZWQoKSk7Ci0JCWVsc2UKLQkJCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJY3VycmVudFByb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotCQl0cnkgewotCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFByb3BlcnR5ID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5SXRlbXMoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0W10gaXRlbXMpIHsKLQkJY3VycmVudFByb3BlcnR5ID0gcHJvcGVydHlOYW1lOwotCQl0cnkgewotCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgaXRlbXMpOwotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFByb3BlcnR5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFVJIHRvIGhhdmUgdGhlIHByb3BlcnR5IHZhbHVlIGRlZmluZWQgaW4gdGhlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBsaW5rIElEYXRhTW9kZWxMaXN0ZW5lciBmb3IgdGhlIGZsYWcgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2ggJiYgcHJvcGVydHlUb1dpZGdldEhhc2guY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkgewotCQkJaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRUaHJlYWQoKSl7Ci0JCQkJZG9TeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRvU3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBydW4gb24gdGhlIFVJIHRocmVhZAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gZmxhZwotCSAqLwotCXByaXZhdGUgdm9pZCBkb1N5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJdHJ5IHsKLQkJCWN1cnJlbnRXaWRnZXQgPSAoV2lkZ2V0KSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ICE9IG51bGwgJiYgY3VycmVudFdpZGdldCAhPSBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50KSB7Ci0JCQkJLy9XZSBtdXN0IGhvbGQgYSBjb3B5IGluIGEgdGVtcCB2YXJpYWJsZSBiZWNhdXNlIHNldHRpbmcgdGhlIHdpZGdldCB2YWx1ZQotCQkJCS8vbWF5IHRyaWdnZXIgYW4gZXZlbnQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCBhZ2Fpbi4KLQkJCQlXaWRnZXQgd2lkZ2V0ID0gY3VycmVudFdpZGdldDsKLQkJCQl0cnkgewotCQkJCQlpZ25vcmVNb2RpZnlFdmVudCA9IHRydWU7Ci0JCQkJCWlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGV4dCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRleHQpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKENvbWJvKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJfSBlbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQnV0dG9uKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoQnV0dG9uKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExhYmVsKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoTGFiZWwpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExpc3QpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGFibGUpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUYWJsZSkgY3VycmVudFdpZGdldCk7Ci0JCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBUcmVlKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVHJlZSkgY3VycmVudFdpZGdldCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJLy9QYXNzIHRoZSBjb3B5IG9mIHRoZSBjdXJyZW50V2lkZ2V0Ci0JCQkJc2V0RW5hYmxlbWVudCgoQ29udHJvbCkgd2lkZ2V0LCBkYXRhTW9kZWwuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljdXJyZW50V2lkZ2V0ID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChjb250cm9sLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbmFibGVtZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggIT0gbnVsbCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHByb3BlcnR5VG9XaWRnZXRIYXNoLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCUNvbnRyb2xbXSBkZXBlbmRlbnRzID0gKENvbnRyb2xbXSkgd2lkZ2V0VG9EZXBDb250cm9scy5nZXQoY29udHJvbCk7Ci0JCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0JCQkJQ29udHJvbCBkZXAgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlkZXAgPSBkZXBlbmRlbnRzW2ldOwotCQkJCQlpZiAoZGVwLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQkJCQlkZXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULkNIRUNLKSA9PSBTV1QuQ0hFQ0sgfHwgKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULlJBRElPKSA9PSBTV1QuUkFESU8pIHsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0gY2hlY2tlZCkgewotCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24oY2hlY2tlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQ29tYm8gY29tYm8pIHsKLQkJaWYgKGZsYWcgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyB8fCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkvLyBEaXNwbGF5IHByb3BlcnRpZXMgc2hvdWxkIG9ubHkgZmlyZSBpZiB0aGUgY29udGVudHMgY2hhbmdlLgotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7Ci0JCWludCBzZWxJbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxJbmRleCA8IDAgfHwgIW5ld1RleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oc2VsSW5kZXgpKSkgewotCQkJU3RyaW5nW10gaXRlbXMgPSBjb21iby5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXS5lcXVhbHMobmV3VGV4dCkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbWJvLnNldFRleHQobmV3VGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRleHQgdGV4dCkgewotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIW5ld1RleHQuZXF1YWxzKHRleHQuZ2V0VGV4dCgpKSkgewotCQkJdGV4dC5zZXRUZXh0KG5ld1RleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRhYmxlIHRhYmxlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXNldFRhYmxlSXRlbXNDaGVja2VkKHRhYmxlLmdldEl0ZW1zKCksIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoZWxlbWVudHMpOwotCQlUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlSXRlbXNbaV07Ci0JCQlpZiAoZWxlbWVudExpc3QuY29udGFpbnMoaXRlbS5nZXREYXRhKCkpKQotCQkJCWl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCWVsc2UKLQkJCQlpdGVtLnNldENoZWNrZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVJdGVtc0NoZWNrZWQoVGFibGVJdGVtW10gdGFibGVJdGVtcywgYm9vbGVhbiBiKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLQkJCXRhYmxlSXRlbXNbaV0uc2V0Q2hlY2tlZChiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgVHJlZSB0cmVlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWphdmEudXRpbC5MaXN0IGVsZW1lbnRMaXN0ID0gQXJyYXlzLmFzTGlzdChlbGVtZW50cyk7Ci0JCVRyZWVJdGVtW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlpZiAoZWxlbWVudExpc3Quc2l6ZSgpID09IDApIHsKLQkJCXNldFRyZWVJdGVtc0dyZXkodHJlZUl0ZW1zLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRyZWVJdGVtcy5sZW5ndGggPiAwKQotCQkJc2V0VHJlZUl0ZW1DaGVja2VkKHRyZWVJdGVtcywgZWxlbWVudExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyZWVJdGVtc0dyZXkoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGJvb2xlYW4gYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWVJdGVtc1tpXTsKLQkJCWl0ZW0uc2V0R3JheWVkKGIpOwotCQkJc2V0VHJlZUl0ZW1zR3JleSh0cmVlSXRlbXNbaV0uZ2V0SXRlbXMoKSwgYik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlSXRlbUNoZWNrZWQoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGphdmEudXRpbC5MaXN0IGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnModHJlZUl0ZW1zW2ldLmdldERhdGEoKSkpewotCQkJCXRyZWVJdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCXRyZWVJdGVtc1tpXS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfWVsc2V7Ci0JCQkJdHJlZUl0ZW1zW2ldLnNldEdyYXllZCh0cnVlKTsKLQkJCX0KLQkJCVRyZWVJdGVtW10gY2hpbGRlcm5JdGVtcyA9IHRyZWVJdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGNoaWxkZXJuSXRlbXMubGVuZ3RoID4gMCkgewotCQkJCXRyZWVJdGVtc1tpXS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQlzZXRUcmVlSXRlbUNoZWNrZWQoY2hpbGRlcm5JdGVtcywgaXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIExhYmVsIGxhYmVsKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghbmV3VGV4dC5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkgewotCQkJbGFiZWwuc2V0VGV4dChuZXdUZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBMaXN0IGxpc3QpIHsKLQkJT2JqZWN0IG5ld0NvbnRlbnRzID0gZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChuZXdDb250ZW50cyA9PSBudWxsKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbMF0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBtb2RlbENvbnRlbnRzID0gKGphdmEudXRpbC5MaXN0KSBuZXdDb250ZW50czsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1ttb2RlbENvbnRlbnRzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsQ29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IG1vZGVsQ29udGVudHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkJfSBlbHNlIGlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgbmV3Q29udGVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hBbGxVSVdpdGhNb2RlbCgpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2gpIHsKLQkJCUNvbGxlY3Rpb24ga2V5cyA9IHByb3BlcnR5VG9XaWRnZXRIYXNoLmtleVNldCgpOwotCQkJaWYgKCFrZXlzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIHByb3BlcnR5TmFtZXMgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IG51bGw7Ci0JCQkJd2hpbGUgKHByb3BlcnR5TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCXByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnR5TmFtZXMubmV4dCgpOwotCQkJCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaENvbXBvc2l0ZShXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwQ29udHJvbHMpIHsKLQkJaWYgKG51bGwgPT0gd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gpCi0JCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9PSBudWxsKQotCQkJcHJvcGVydHlUb1dpZGdldEhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaC5wdXQod2lkZ2V0LCBwcm9wZXJ0eU5hbWUpOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5wdXQocHJvcGVydHlOYW1lLCB3aWRnZXQpOwotCQlpZiAoZGVwQ29udHJvbHMgIT0gbnVsbCkgewotCQkJaWYgKHdpZGdldFRvRGVwQ29udHJvbHMgPT0gbnVsbCkKLQkJCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdpZGdldFRvRGVwQ29udHJvbHMucHV0KHdpZGdldCwgZGVwQ29udHJvbHMpOwotCQl9Ci0JCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaFRleHQodGV4dCwgcHJvcGVydHlOYW1lLCBmYWxzZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gaXNUaW1lTW9kaWZpZWQsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZSh0ZXh0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKGlzVGltZU1vZGlmaWVkKQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRUaW1lZExpc3RlbmVyKCkpOwotCQllbHNlCi0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeVRleHRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaExhYmVsKExhYmVsIGxhYmVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUobGFiZWwsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHN5bmNoIHRoZSBjb250ZW50cyBvZiB0aGUgPGNvZGU+bGlzdDwvY29kZT4gdG8gdGhlIExpc3QgZWxlbWVudHMgcmV0dXJuZWQgZnJvbQotCSAqIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoTGlzdChMaXN0IGxpc3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShsaXN0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jaCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBDb21ibyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lLiBUaGUKLQkgKiBwb3NzaWJsZSB2YWx1ZXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFyZSBkZXRlcm1pbmVkIGJ5IHJldHVybiBvZgotCSAqIElEYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykuCi0JICogCi0JICogQHBhcmFtIGNvbWJvCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBkZXBlbmRlbnRDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoQ29tYm8oQ29tYm8gY29tYm8sIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjb21ibywgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNvbWJvTGlzdGVuZXIpIHsKLQkJCWNvbWJvTGlzdGVuZXIgPSBuZXcgQ29tYm9MaXN0ZW5lcigpOwotCQl9Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jIHRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNoZWNrYm94IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eU5hbWUuIFRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIG11c3QgY29udGFpbiBhIGphdmEubGFuZy5Cb29sZWFuIHR5cGVkIE9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tib3gKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGRlcGVuZGVudENvbnRyb2xzCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hDaGVja2JveChCdXR0b24gY2hlY2tib3gsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjaGVja2JveCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCWNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUYWJsZVZpZXdlcihDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUodGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG51bGwgPT0gY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKSB7Ci0JCQljaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIgPSBuZXcgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lcigpOwotCQl9Ci0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUcmVlVmlld2VyKENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJc3luY2hDb21wb3NpdGUodHJlZVZpZXdlci5nZXRDb250cm9sKCksIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpIHsKLQkJCWNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lciA9IG5ldyBDaGVja0JveFZpZXdlckxpc3RlbmVyKCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFJhZGlvKEJ1dHRvbiByYWRpbywgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCS8vIFVzZXMgY2hlY2tib3ggc3luY2hlcgotCQlzeW5jaENoZWNrYm94KHJhZGlvLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQlwcml2YXRlIFRpbWVkTW9kaWZ5TGlzdGVuZXIgZ2V0VGltZWRMaXN0ZW5lcigpIHsKLQkJaWYgKHRpbWVkTW9kaWZ5TGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRpbWVkTW9kaWZ5TGlzdGVuZXIgPSBuZXcgVGltZWRNb2RpZnlMaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQkJV2lkZ2V0IHcgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQkJCQlpZiAoY3VycmVudFdpZGdldCA9PSB3IHx8IHcuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHcpOwotCQkJCQlzZXRUZXh0UHJvcGVydHkocHJvcGVydHlOYW1lLCAoVGV4dCkgdyk7Ci0JCQkJfQotCQkJfSkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXN1cGVyLm1vZGlmeVRleHQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFRleHQgdGV4dCkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRleHQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBnZXRNb2RpZnlUZXh0TGlzdGVuZXIoKSB7Ci0JCWlmIChudWxsID09IG1vZGlmeVRleHRMaXN0ZW5lcikKLQkJCW1vZGlmeVRleHRMaXN0ZW5lciA9IG5ldyBNb2RpZnlUZXh0TGlzdGVuZXIoKTsKLQkJcmV0dXJuIG1vZGlmeVRleHRMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGF0YU1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQljaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCW1vZGlmeVRleHRMaXN0ZW5lciA9IG51bGw7Ci0JCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbnVsbDsKLQkJdGltZWRNb2RpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCXdpZGdldFRvRGVwQ29udHJvbHMgPSBudWxsOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2Y2JmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWkuV2FybmluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5QYWdlR3JvdXBNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSURNUGFnZUhhbmRsZXIgewotCQotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBBZGRhYmxlUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXA7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQotCXByaXZhdGUgUGFnZUdyb3VwTWFuYWdlciBwYWdlR3JvdXBNYW5hZ2VyOwotCXByaXZhdGUgUGFnZUV4dGVuc2lvbk1hbmFnZXIgcGFnZUV4dGVuc2lvbk1hbmFnZXI7Ci0KLQkvLyBwcml2YXRlIElXaXphcmRQYWdlIGZpcnN0cGFnZTsKLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIElEIHRoYXQgY2xpZW50cyBzaG91bGQgZXh0ZW5kIHRvIGFkZCB0byB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRJRCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgcm9vdCBvcGVyYXRpb24gZm9yIHRoaXMgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gZ2V0Um9vdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZ2V0RGF0YU1vZGVsKCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgZmluYWxpemVkIHRvIGhhbmRsZSB0aGUgYWRkaW5nIG9mIGV4dGVuZGVkIHBhZ2VzLiBDbGllbnRzIHNob3VsZCBvdmVycmlkZQotCSAqIGRvQWRkUGFnZXMoKSB0byBhZGQgdGhlaXIgcGFnZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWluaXQoKTsKLQkJZG9BZGRQYWdlcygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBwYWdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCX0KLQotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJcGFnZUdyb3VwTWFuYWdlci5yZXNldCgpOwotCQlyZXR1cm4gZ2V0TmV4dFBhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0KLQkJSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQotCQkvLyBJZiBhbiBlcnJvciBvY2N1cmVkIHRoZW4gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIG5leHQgcGFnZSB3aWxsIGJlIHRoZSBzYW1lLgotCQlpZiAoY3VycmVudFBhZ2UgIT0gbmV4dFBhZ2UgJiYgbmV4dFBhZ2UgIT0gbnVsbCkgewotCQkJbmV4dFBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCQkJbmV4dFBhZ2Uuc2V0UHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlKTsKLQkJfQotCi0JCXJldHVybiBjdXJyZW50UGFnZSA9PSBuZXh0UGFnZSA/IG51bGwgOiBuZXh0UGFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyZXR1cm4gcGFnZSAhPSBudWxsID8gcGFnZS5nZXRQcmV2aW91c1BhZ2UoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKCFzdXBlci5jYW5GaW5pc2goKSB8fCAhZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlciBnZXRQYWdlR3JvdXBNYW5hZ2VyKCkgewotCQlyZXR1cm4gcGFnZUdyb3VwTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldFBhZ2VFeHRlbnNpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gcGFnZUV4dGVuc2lvbk1hbmFnZXI7Ci0JfQotCi0JLy8gVE9ETyBuZWVkIHRvIGltcGxlbWVudCB0aGlzLiBQZXJoYXBzIGluIHRoZSBQYWdlR3JvdXBNYW5hZ2VyCi0JLy8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFmdGVyRmluaXNoRXJyb3IoKSB7Ci0JCS8vIElXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIERhdGFNb2RlbFdpemFyZFBhZ2Ugd3RwUGFnZSA9IChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlc1tpXTsKLQkJLy8gd3RwUGFnZS52YWxpZGF0ZVBhZ2UodHJ1ZSk7Ci0JCS8vIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4ZWN1dGluZygpIHsKLQkJcmV0dXJuIGV4ZWN1dGluZzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGluZyA9IGZhbHNlOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGluZyA9IHRydWU7Ci0JCQlpZiAocHJlUGVyZm9ybUZpbmlzaCgpKSB7Ci0JCQkJc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQotCQkJCWZpbmFsIElTdGF0dXMgc3QgPSBydW5PcGVyYXRpb25zKCk7Ci0KLQkJCQlpZiAoc3QuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCVdUUFVJUGx1Z2luLmxvZyhzdCk7Ci0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgbmV3IENvcmVFeGNlcHRpb24oc3QpLCAwLCBmYWxzZSk7Ci0JCQkJfSBlbHNlIGlmKHN0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKXsKLQkJCQkJV2FybmluZ0RpYWxvZy5vcGVuV2FybmluZyhnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzIsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIHN0LmdldE1lc3NhZ2UoKSwgc3QsIElTdGF0dXMuV0FSTklORyk7Ci0JCQkJfQotCi0JCQkJcG9zdFBlcmZvcm1GaW5pc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJV1RQVUlQbHVnaW4ubG9nKGV4Yyk7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzEsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIGV4YywgMCwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW5nID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgcnVuT3BlcmF0aW9ucygpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQljbGFzcyBDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkJCXB1YmxpYyBUaHJvd2FibGUgY2F1Z2h0ID0gbnVsbDsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJCQl0cnkgewotCQkJCQlpZiAocm9vdE9wZXJhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkvL1RoaXMgd2lsbCBiZSB0aGUgdHlwaWNhbCBjYXNlIGJlY2F1c2UgbW9zdCB3aXphcmRzIHdpbGwKLQkJCQkJCS8vbm90IGluaXRpYWxpemUgdGhlIHJvb3Qgb3BlcmF0aW9uIGR1cmluZyBpbml0LgotCQkJCQkJcm9vdE9wZXJhdGlvbiA9IGdldFJvb3RPcGVyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlzdGF0dXNbMF0gPSByb290T3BlcmF0aW9uLmV4ZWN1dGUocG0sIG51bGwpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWNhdWdodCA9IGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcygpOwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4ocnVuRm9ya2VkKCksIGlzQ2FuY2VsYWJsZSgpLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlydW5uYWJsZS5jYXVnaHQgPSBlOwotCQl9Ci0JCWlmIChydW5uYWJsZS5jYXVnaHQgIT0gbnVsbCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHJ1bm5hYmxlLmNhdWdodCk7Ci0JCQlzdGF0dXNbMF0gPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJpZCIsIDAsIHJ1bm5hYmxlLmNhdWdodC5nZXRNZXNzYWdlKCksIHJ1bm5hYmxlLmNhdWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgcnVubmFibGUuY2F1Z2h0LCAwLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnVuZG9BbGxDdXJyZW50T3BlcmF0aW9ucygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0byBwZXJmb3JtIGFueSB0YXNrcyBwcmlvciB0byBydW5uaW5nIHRoZSBvcGVyYXRpb24uIFJldHVybiB0cnVlIHRvCi0JICogaGF2ZSB0aGUgb3BlcmF0aW9uIHJ1biBhbmQgZmFsc2UgdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZVBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzYXJ5IGFmdGVyIHBlcmZvcm1pbmcgRmluaXNoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnN0b3JlRGVmYXVsdFNldHRpbmdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmRQYWdlKQotCQkJKChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlKS5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHdoZW4gc3RvcmluZyB0aGUgZGVmYXVsdAotCSAqIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqIEBwYXJhbSBwYWdlSW5kZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhJV2l6YXJkUGFnZSBwYWdlLCBpbnQgcGFnZUluZGV4KSB7Ci0JCXN0b3JlRGVmYXVsdFNldHRpbmdzKHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBpcyBhbGxvd2VkIHRvIGJlIGNhbmNlbGxlZC4gVGhlIGRlZmF1bHQKLQkgKiBpcyBmYWxzZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIGZhbHNlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcnVuIGZvcmtlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuRm9ya2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlpZiAobnVsbCA9PSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGdldERlZmF1bHRQcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobnVsbCAhPSByb290UGFnZUdyb3VwKSB7Ci0JCQlMaXN0IHBhZ2VzID0gcm9vdFBhZ2VHcm91cC5nZXRQYWdlcyhkYXRhTW9kZWwpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQl7Ci0JCQkJT2JqZWN0IHBhZ2UgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJV2l6YXJkUGFnZSkKLQkJCQl7Ci0JCQkJCSgoSVdpemFyZFBhZ2UpcGFnZSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobnVsbCAhPSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gYSBTaW1wbGVQYWdlR3JvdXAuIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gb3ZlcnJpZGVkIHRoaXMgbWV0aG9kIHRvCi0JICogcmV0dXJuIGEgZGlmZmVyZW50IHJvb3QgcGFnZSBncm91cCBmb3IgdGhlIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJU3RyaW5nIGlkID0gZ2V0V2l6YXJkSUQoKTsKLQkJLy8gRm9yIHRoZSByb290IHBhZ2UgZ3JvdXAgdGhlIHdpemFyZCBpZCBhbmQgdGhlIGdyb3VwIGlkIGFyZSB0aGUgc2FtZS4KLQkJU2ltcGxlUGFnZUdyb3VwIHBhZ2VHcm91cCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoaWQsIGlkKTsKLQkJcGFnZUdyb3VwLnNldFBhZ2VIYW5kbGVyKHRoaXMpOwotCQlyZXR1cm4gcGFnZUdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVudmlyb25tZW50IGNyZWF0ZUVudmlyb25tZW50KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyb290UGFnZUdyb3VwLmFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXJvb3RQYWdlR3JvdXAgPSBjcmVhdGVSb290UGFnZUdyb3VwKCk7Ci0JCWlmIChuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpKSB7Ci0JCQlyb290T3BlcmF0aW9uID0gZ2V0Um9vdE9wZXJhdGlvbigpOwotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKHJvb3RPcGVyYXRpb24sIHJvb3RQYWdlR3JvdXApOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKGdldERhdGFNb2RlbCgpLCByb290UGFnZUdyb3VwKTsKLQkJfQotCQlwYWdlRXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBQYWdlRXh0ZW5zaW9uTWFuYWdlcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIHRydWUgaWYgdGhleSByZXF1aXJlIHRoZSBydW5uaW5nCi0JICogb2YgdGhlIG9wZXJhdGlvbiBkdXJpbmcgcGFnZSB0dXJuaW5nLgotCSAqIAotCSAqIEByZXR1cm4gQSBib29sZWFuIGRlZmF1bHRlZCB0byBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHx8IGdldFBhZ2VHcm91cE1hbmFnZXIoKS5oYXNNdWx0aXBsZVBhZ2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzc2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsV2l6YXJkRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIgcmVhZGVyOwotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIERhdGFNb2RlbFdpemFyZCBieSB0aGUgc3BlY2lmaWVkIGlkIGFuZAotCSAqIGNvbnN0cnVjdHMgYSBuZXcgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBJRGF0YU1vZGVsCi0JICogbG9va2VkIHVwIHdpdGggdGhlIHNhbWUgaWQuIElmIHRoZSBEYXRhTW9kZWxXaXphcmQgaXMgbm90IGZvdW5kIHRoZW4gYQotCSAqIFJ1bnRpbWVFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBEYXRhTW9kZWxXaXphcmQKLQkgKiBAcmV0dXJuIGEgbmV3IERhdGFNb2RlbFdpemFyZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGNyZWF0ZVdpemFyZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChpZCkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIGlkIHJldHVyZWQgZnJvbQotCSAqIDxjb2RlPmRhdGFNb2RlbC5nZXRJRCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBhIG5ldyBEYXRhTW9kZWxXaXphcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFdpemFyZCBjcmVhdGVXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIGxvYWRXaXphcmQoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgbG9hZFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFdpemFyZChkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNsYXNzIGFzIHRoZSBpZC4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bwotCSAqIDxjb2RlPmNyZWF0ZVdpemFyZChjbGFzc0lELmdldE5hbWUoKSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0lECi0JICogICAgICAgICAgICB0aGUgY2xhc3Mgd2hvc2UgbmFtZSBpcyB0aGUgaWQgb2YgdGhlIERhdGFNb2RlbFdpemFyZAotCSAqIEByZXR1cm4gYSBuZXcgRGF0YU1vZGVsV2l6YXJkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgY3JlYXRlV2l6YXJkKENsYXNzIGRhdGFNb2RlbFByb3ZpZGVySUQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChkYXRhTW9kZWxQcm92aWRlcklELmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdiZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5FWFQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRVZJT1VTID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01QT1NJVEVfQk9SREVSID0gU1dULk5VTEw7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRmlyc3RUaW1lVG9QYWdlID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIE1hcCB2YWxpZGF0aW9uTWFwOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgU3RyaW5nIGluZm9wb3BJRDsKLQlwcml2YXRlIERhdGFNb2RlbFdpemFyZCB3aXphcmQ7Ci0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwcmV2aW91c1BhZ2U7Ci0KLQkvKioKLQkgKiBKMkVFV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KLQotCS8qKgotCSAqIEoyRUVXaXphcmRQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuIFRoaXMKLQkgKiBtZXRob2QgaGFzIGJlZW4gYWJzdHJhY3QgYW5kIGl0IHVzZXMgdGhlIHRlbXBsYXRlIHBhdHRlcm4gdG8gZ2V0IHRoZSBjb3JyZWN0IGl0ZW1zIHNldHVwIGluCi0JICogdGhlIGNvcnJlY3Qgb3JkZXIuIFNlZSB0aGUgc2V0IG9mIG1ldGhvZHMgYmVsb3cgdGhhdCBhcmUgY2FsbGVkIGluIHRoaXMgbWV0aG9kLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQgY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhCi0JICogPGNvZGU+Z2V0Q29udHJvbDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcCA9IGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWFkZEV4dGVuZGVkQ29udHJvbHModG9wKTsKLQkJc2V0Q29udHJvbCh0b3ApOwotCQlzZXR1cEluZm9wb3AodG9wKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlbmRlZENvbnRyb2xzKENvbXBvc2l0ZSB0b3ApIHsKLQkJSVdpemFyZCBfd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCWlmIChfd2l6YXJkIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkKSB7Ci0JCQlQYWdlRXh0ZW5zaW9uTWFuYWdlciBwYWdlRXh0ZW5zaW9uTWFuYWdlciA9ICgoRGF0YU1vZGVsV2l6YXJkKSBfd2l6YXJkKS5nZXRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQkJcGFnZUV4dGVuc2lvbk1hbmFnZXIuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHRvcCwgbW9kZWwsIGdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKQotCQkJdmFsaWRhdGlvbk1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJZWxzZSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gbmV3IEhhc2hNYXAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQkvLyBUT0RPIHdoeSBpcyB0aGF0IGxhc3QgZ2V0TmV4dFBhZ2UoKSBjYWxsIGhlcmU/Pz8KLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCkgJiYgKChudWxsICE9IHdpemFyZCAmJiB3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmhhc05leHRQYWdlKCkgfHwgbnVsbCAhPSBnZXROZXh0UGFnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkUGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmQoSVdpemFyZCBuZXdXaXphcmQpIHsKLQkJc3VwZXIuc2V0V2l6YXJkKG5ld1dpemFyZCk7Ci0JCWlmIChuZXdXaXphcmQgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmQpIHsKLQkJCXdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpIG5ld1dpemFyZDsKLQkJfQotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0JCXJldHVybiBwcmV2aW91c1BhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuc2V0UHJldmlvdXNQYWdlKHBhZ2UpOwotCQlwcmV2aW91c1BhZ2UgPSBwYWdlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCByZXR1cm4gdGhlIG1vZGVsIHByb3BlcnR5IG5hbWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gdGhpcyBwYWdlIGluIHRoZQotCSAqIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgcHJlc2VudCB0aGVpciBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcCBsZXZlbCBDb21wb3NpdGUgZm9yIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0IHVwIGluZm8gcG9wIGhvb2tzIGlmIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEluZm9wb3AoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGdldEluZm9wb3BJRCgpICE9IG51bGwpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgZ2V0SW5mb3BvcElEKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlCi0JICogZGVmYXVsdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkCi0JICogYW5kIG5lZWQgdG8gYmUgcmVzdG9yZWQuCi0JICogCi0JICogQHNlZSBzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgTGlzdGVuZXJzIHRvIGNvbnRyb2xzIGF0IHRoaXMgcG9pbnQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXZlbnRzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRvIGFkZCBsaXN0ZW5lcnMgdG8gaXRzIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBiZWluZyBtYWRlIGN1cnJlbnQgYW5kIHZpc2libGUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJdHJ5IHsKLQkJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgbW92aW5nIGJhY2sgb25lIHBhZ2UuCi0JCQlpZiAobnVsbCAhPSB3aXphcmQgJiYgd2l6YXJkLmdldFByZXZpb3VzUGFnZSh3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmdldEN1cnJlbnRQYWdlKCkpID09IHRoaXMpIHsKLQkJCQl3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLm1vdmVCYWNrT25lUGFnZSgpOwotCQkJfQotCi0JCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaXNGaXJzdFRpbWVUb1BhZ2UgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiB0cnVlIHVubGVzcyBpdCBpcyB0aGUgZmlyc3QgdGltZSBlbnRlcmluZyB0aGlzIHBhZ2UgaW4KLQkgKiB3aGljaCBjYXNlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHBhZ2UgYW5kIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vdC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGV5IGRvIG5vdCB3YW50IHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKSB7Ci0JCXJldHVybiAhaXNGaXJzdFRpbWVUb1BhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gdHJ1ZSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IHRpbWUgZW50ZXJpbmcgdGhpcyBwYWdlIGluCi0JICogd2hpY2ggY2FzZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBub3QuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhleSBkbyBub3Qgd2FudCB0aGlzIGRlZmF1bHQgYmVoYXZpb3IuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2Ugc2hvd1ZhbGlkYXRvaW5FcnJvcnNPbkVudGVyIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZU9uRW50ZXIoKSB7Ci0JCXJldHVybiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGl0aW5nIHRoZSBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIHN0YXR1cy5oYXNFcnJvcihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGlzCi0JICogbWV0aG9kLCBpdCBtdXN0IGNhbGwgc3VwZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlIGJhc2VkIG9uIHRoZSBsYXN0IGVycm9yIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yID0gc3RhdHVzLmdldExhc3RFcnJNc2coKTsKLQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKQotCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBpbmZvID0gc3RhdHVzLmdldExhc3RJbmZvTXNnKCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pCi0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpCi0JCQkJc2V0TWVzc2FnZSh3YXJuaW5nLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9IGVsc2UgaWYgKCFlcnJvci5lcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCkpKQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0V2FybmluZ1N0YXR1cyhrZXksIHdhcm5pbmdNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPiBtZXRob2Qgc2V0cwotCSAqIHRoZSBjb250cm9sIHRvIHRoZSBnaXZlbiB2aXNpYmlsaXR5IHN0YXRlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZW50ZXIoKTsKLQkJfSBlbHNlCi0JCQlleGl0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBXaXphcmQganVzdCBwcmlvciB0byBydW5uaW5nIHRoZSBwZXJmb3JtRmluaXNoIG9wZXJhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBzdG9yZSB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBwYWdlIGlzIG5vdyBiZWluZyB2YWxpZGF0ZWQuIEF0IHRoaXMgdGltZSwgZWFjaCBjb250cm9sIGlzIHZhbGlkYXRlZCBhbmQgdGhlbiB0aGUKLQkgKiBjb250cm9scyBhcmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cyB3aGljaCB3YXMgdXBkYXRlZCBkdXJpbmcKLQkgKiA8Y29kZT52YWxpZGF0ZUNvbnRyb2xzKCk8L2NvZGU+LiBGaW5hbGx5LCBpdCB3aWxsIGRpc3BsYXkgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgaXQKLQkgKiB3aWxsIHNldCB0aGUgcGFnZSBjb21wbGV0ZS4gU3ViY2xhc3NlcyB3aWxsIG5vdCB0eXBpY2FsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQl2YWxpZGF0ZVBhZ2UodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKGJvb2xlYW4gc2hvd01lc3NhZ2UpIHsKLQkJaWYgKCFpc1ZhbGlkYXRpbmcpIHsKLQkJCWlzVmFsaWRhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlpZiAoc2hvd01lc3NhZ2UpCi0JCQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShzdGF0dXMuZ2V0TGFzdEVyck1zZygpID09IG51bGwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGluZGl2aWR1YWwgY29udHJvbHMuIFVzZSB2YWxpZGF0aW9uIGtleXMgdG8ga2VlcCB0cmFjayBvZiBlcnJvcnMuCi0JICogCi0JICogQHNlZSBzZXRPS1N0YXR1cyhJbnRlZ2VyKSBhbmQgc2V0RXJyb3JNZXNzYWdlKEludGVnZXIsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbGlkYXRlQ29udHJvbHNCYXNlKCkgewotCQlpZiAoIXZhbGlkYXRpb25NYXAuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvcE5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXTsKLQkJCQlJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB2YWxpZGF0aW9uTWFwLmdldChwcm9wTmFtZSk7Ci0JCQkJaWYgKHZhbEtleSAhPSBudWxsKQotCQkJCQl2YWxpZGF0ZVByb3BlcnR5KHByb3BOYW1lLCB2YWxLZXkpOwotCQkJCWlmICghZ2V0U3RhdHVzKHZhbEtleSkpCi0JCQkJCXJldHVybiBwcm9wTmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHZhbGlkYXRpb25rZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBJbnRlZ2VyIHZhbGlkYXRpb25LZXkpIHsKLQkJc2V0T0tTdGF0dXModmFsaWRhdGlvbktleSk7Ci0JCUlTdGF0dXMgc3RhdHVzMSA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFzdGF0dXMxLmlzT0soKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMxLmlzTXVsdGlTdGF0dXMoKSA/IHN0YXR1czEuZ2V0Q2hpbGRyZW4oKVswXS5nZXRNZXNzYWdlKCkgOiBzdGF0dXMxLmdldE1lc3NhZ2UoKTsKLQkJCXN3aXRjaCAoc3RhdHVzMS5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJc2V0RXJyb3JTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQkJc2V0V2FybmluZ1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCQlzZXRJbmZvU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiBjb250cm9scyBhZnRlciB2YWxpZGF0aW9uLiBTdWJsY2Fzc2VzIHNob3VsZCBjaGVjayB0aGUgc3RhdHVzIG9mCi0JICogdmFsaWRhdGlvbiBrZXlzIHRvIGRldGVybWluZSBlbmFibGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGlzRmlyc3RUaW1lVG9QYWdlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0VGltZVRvUGFnZSgpIHsKLQkJcmV0dXJuIGlzRmlyc3RUaW1lVG9QYWdlOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIHNldEphdmFTdGF0dXNNZXNzYWdlKElTdGF0dXMgamF2YVN0YXR1cywgSW50ZWdlciBzdGF0dXNLZXksIFN0cmluZyBtZXNzYWdlKSB7Ci0JLy8gaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JLy8gc2V0V2FybmluZ1N0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIGVsc2UKLQkvLyBzZXRFcnJvclN0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RUaW1lVG9QYWdlKGJvb2xlYW4gYikgewotCQlpc0ZpcnN0VGltZVRvUGFnZSA9IGI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdvdERhdGFNb2RlbFdpemFyZCA9IGZhbHNlOwotCXByaXZhdGUgRGF0YU1vZGVsV2l6YXJkIGRhdGFNb2RlbFdpemFyZCA9IG51bGw7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFdpemFyZCBnZXREYXRhTW9kZWxXaXphcmQoKXsKLQkJaWYoIWdvdERhdGFNb2RlbFdpemFyZCl7Ci0JCQlnb3REYXRhTW9kZWxXaXphcmQgPSB0cnVlOwotCQkJSVdpemFyZCB3aXphcmQgPSBnZXRXaXphcmQoKTsKLQkJCWlmKHdpemFyZCBpbnN0YW5jZW9mIERhdGFNb2RlbFdpemFyZCl7Ci0JCQkJZGF0YU1vZGVsV2l6YXJkID0gKERhdGFNb2RlbFdpemFyZCl3aXphcmQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbFdpemFyZDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChmaW5hbCBEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlEYXRhTW9kZWxXaXphcmQgdyA9IGdldERhdGFNb2RlbFdpemFyZCgpOwotCQlpZih3ID09IG51bGwgfHwgIXcuaXNFeGVjdXRpbmcoKSkKLQkJewotCQkgICAgZmluYWwgUnVubmFibGUgdWlDaGFuZ2VzID0gbmV3IFJ1bm5hYmxlKCkKLQkJICAgIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkgICAgICAgIHsKLSAgICAgICAgCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAoIWlzUGFnZUNvbXBsZXRlKCkgJiYgZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcpKSkgewotICAgICAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJCQkJCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAJCQkJCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotICAgICAgICAJCQkJCQlicmVhazsKLSAgICAgICAgCQkJCQl9Ci0gICAgICAgIAkJCQl9Ci0gICAgICAgIAkJCX0KLQkJICAgICAgICB9Ci0JCSAgICB9OwotCQkgICAgaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRUaHJlYWQoKSl7Ci0JCSAgICAJdWlDaGFuZ2VzLnJ1bigpOwotCQkgICAgfSBlbHNlIHsKLQkJICAgIAlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModWlDaGFuZ2VzKTsKLQkJICAgIH0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQkJc3luY2hIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBpbmZvcG9wSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb3BvcElEKFN0cmluZyBpbmZvcG9wSUQpIHsKLQkJdGhpcy5pbmZvcG9wSUQgPSBpbmZvcG9wSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMDVjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURNUGFnZUdyb3VwIAotewotICBwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cElEKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cEluc2VydGlvbklEKCk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkRGF0YU9wZXJhdGlvblRvUnVuKCk7Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0gIAotICBwdWJsaWMgSURNUGFnZUhhbmRsZXIgZ2V0UGFnZUhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICk7Ci0gIAotICBwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTcwZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLS8qKgotICogCi0gKiBUaGUgd2l6YXJkIGZyYW1ld29yayBhbGxvd3MgcGFnZSBncm91cHMgdG8gYmUgaW5zZXJ0ZWQgYWZ0ZXIgb3RoZXIgcGFnZSBncm91cC4KLSAqIElmIG1vcmUgdGhhbiBvbmUgcGFnZSBncm91cCBpbnNlcnRzIGl0c2VsZiBhZnRlciBhIHBhcnRpY3VsYXIgcGFnZSBncm91cCBpdCBtYXkKLSAqIG5vdCBiZSBkZXRlcm1pbmlzdGljIHdoaWNoIHBhZ2UgZ3JvdXAgc2hvdWxkIGZvbGxvdyBlYWNoIG90aGVyLiAgVGhpcyBjbGFzcwotICogYWxsb3dzIGEgcGFydGljdWxhciBwYWdlIGdyb3VwIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggc3Vic2VxdWVudCBwYWdlCi0gKiBncm91cHMgc2hvdWxkIGJlIG9yZGVyZWQuCi0gKiAKLSAqIEZvciBleGFtcGxlOiBBIHBhZ2UgZ3JvdXAgVCBoYXMgdGhyZWUgcGFnZSBncm91cHMgWCwgWSwgYW5kIFogdGhhdCBoYXZlIHJlZ2lzdGVyZWQKLSAqICAgICAgICAgICAgICB2aWEgdGhlIHdpemFyZFBhZ2VHcm91cCBleHRlbnNpb24gcG9pbnQgdG8gZm9sbG93IGl0LgotICogICAgICAgICAgICAgIFRoZSB3aXphcmQgZnJhbWV3b3JrIHdpbGwgY2FsbCBnZXROZXh0R3JvdXAgd2l0aDoKLSAqICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggbnVsbCwgeyAiWCIsICJZIiwgIloiIH0gKQotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyICJYIiwgIlkiLCAiWiIsIG9yIG51bGwgaWYgbm8gcGFnZSBncm91cAotICogICAgICAgICAgICAgIHNob3VsZCBmb2xsb3cuICBJZiAiWSIgd2FzIHJldHVybmVkIHRoZW4gYSBzdWJlcXVlbnQgY2FsbAotICogICAgICAgICAgICAgIHdpbGwgYmUgbWFkZSBieSB0aGUgZnJhbWV3b3JrIHdpdGg6Ci0gKiAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoICJZIiwgeyAiWCIsICJZIiwgIloiIH0gKQotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgIEFnYWluIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gZWl0aGVyICJYIiwgIlkiLCAiWiIsIG9yIG51bGwgaWYgbm8gcGFnZQotICogICAgICAgICAgICAgIGdyb3VwIHNob3VsZCBmb2xsb3cgdGhpcyBwYWdlIGdyb3VwICJZIi4KLSAqICAgICAgICAgICAgICAKLSAqIE5vdGU6IGFueSBwYWdlIGdyb3VwIGNhbiBoYXZlIGEgcGFnZSBncm91cCBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCBpdCBzbyB0aGlzIG1ldGhvZAotICogICAgICAgY2FsbCBpcyByZWN1cnNpdmUgaW4gbmF0dXJlLiAgRm9yIGV4YW1wbGU6IHRoZSBwYWdlIGdyb3VwIFkgbWlnaHQgaGF2ZSBwYWdlCi0gKiAgICAgICBncm91cHMgWTEsIFkyLCBhbmQgWTMgZm9sbG93aW5nIGl0LiAgVGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjYWxsczoKLSAqICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJYIiwgIlkiLCAiWiIgfSApICAvLyAiWSIgaXMgc2VsZWN0ZWQgdXNpbmcgVHMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICBZLmdldE5leHRHcm91cCggbnVsbCwgeyAiWTEiLCAiWTIiLCAiWTMiIH0gKSAvLyAiWTEiIGlzIHNlbGVjdGVkIHVzaW5nIFlzIGhhbmRsZXIuCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgRm9yIHRoaXMgZXhhbXBsZSBZMSBoYXMgbm8gcGFnZSBncm91cHMgZm9sbG93aW5nIGl0LgotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCAiWSIsIHsgIlgiLCAiWSIsICJaIiB9ICkgIC8vIG51bGwgaXMgc2VsZWN0ZWQgdXNpbmcgVHMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBGb3IgdGhpcyBleGFtcGxlLCB0aGUgVCBoYW5kbGVyIGRlY2lkZWQgdGhhdCBubyBwYWdlIGdyb3VwIGZvbGxvd2VkIFkgbm90IGV2ZW4gWCBvciBaLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE1QYWdlR3JvdXBIYW5kbGVyIAotewotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBjdXJyZW50UGFnZUdyb3VwSUQgdGhlIGN1cnJlbnQgcGFnZSBncm91cCBJRC4gIFRoaXMgdmFsdWUgd2lsbCBiZSBudWxsIHRoZSBmaXJzdCB0aW1lIAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICogQHBhcmFtIHBhZ2VHcm91cElEcyBhIGxpc3Qgb2YgcGFnZSBncm91cCBJRHMgdGhhdCBmb2xsb3cgdGhlIHBhZ2UgZ3JvdXAgZm9yIHRoaXMgaGFuZGxlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBwYWdlIGdyb3VwIGlkIHRoYXQgc2hvdWxkIGZvbGxvdyBjdXJyZW50UGFnZUdyb3VwSUQsIG9yIGl0Ci0gICAqIHNob3VsZCByZXR1cm4gbnVsbCBpZiBubyBwYWdlIGdyb3VwIGZvbGxvd3MgY3VycmVudFBhZ2VHcm91cElELgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cCggU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MTlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURNUGFnZUhhbmRsZXIgewotCi0JLyoqCi0JICogcmV0dXJuIHRoaXMgYXMgdGhlIHBhZ2UgbmFtZSBpZiB0aGUgZXhwZWN0ZWROZXh0UGFnZU5hbWUgb3IgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lIHNob3VsZAotCSAqIGJlIHNraXBwZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1BBR0UgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5TS0lQX1BBR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBwcmVmaXggdGhpcyBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcGFnZSB3aGljaCBvY2N1cnMgYmVmb3JlIHRoZSBwYWdlIHRoYXQgc2hvdWxkIGJlCi0JICogcmV0dXJuZWQuIEUuRy4gc3VwcG9zZSB5b3VyIHBhZ2UgY29udHJpYnV0aW9ucyBrbm93IGFib3V0IHBhZ2VzIEEsIEIgYW5kIEMsIGFuZCB5b3Ugd2FudCB0aGUKLQkgKiB0byBza2lwIHBhZ2VzIEIgYW5kIEMsIHdoZW4gZ29pbmcgdG8gdGhlIG5leHQgcGFnZSBmcm9tIEEuIFRvIGRvIHRoaXMsIHJldHVybiBQQUdFX0FGVEVSK0MuCi0JICogVGhlIGZyYW1ld29yayB3aWxsIHRoZW4gYXNrIHRoZSB3aXphcmQgZm9yIHRoZSBwYWdlIHRoYXQgbm9ybWFsbHkgY29tZXMgYWZ0ZXIgcGFnZSBDLgotCSAqIFBBR0VfQkVGT1JFIHdvcmtzIHNpbWlsYXJseS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0FGVEVSID0gIklETUV4dGVuZGVkUGFnZUhhbmRsZXIuUEFHRV9BRlRFUiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHNhbWUgYXMgUEFHRV9BRlRFUiwgZXhjZXB0IGZvciByZXR1cmluZyB0aGUgcGFnZSBiZWZvcmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9CRUZPUkUgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5QQUdFX0JFRk9SRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFnZSB0aGF0IHNob3VsZCBiZSBuZXh0Ci0JICogCi0JICogQHBhcmFtIGN1cnJlbnRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhlIHdpemFyZCBpcyBjdXJyZW50bHkgb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROZXh0UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgbmV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUgcHJldmlvdXMKLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGUgd2l6YXJkIGlzIGN1cnJlbnRseSBvbgotCSAqIEBwYXJhbSBleHBlY3RlZE5leHRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBwcmV2aW91cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1BhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9QYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJlYThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1BhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5Db21tb25VSVBsdWdpbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBvcmdhbml6ZXMgdGhlIHdpemFyZCBwYWdlIGV4dGVuc2lvbnMgZm9yIGEgcGFydGljdWxhciB3aXphcmQuIAotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRXh0ZW5zaW9uTWFuYWdlciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB3aGVyZSB0aGUgd2l6YXJkIHBhZ2UgZXh0ZW5zaW9ucyBhcmUKLQkgKiBjb250cmlidXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lOVF9XSVpBUkRfUEFHRV9HUk9VUCA9ICJ3aXphcmRQYWdlR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCdzIGVsZW1lbnQgd2hlcmUgdGhlIHdpemFyZCBwYWdlCi0JICogZXh0ZW5zaW9ucyBhcmUgY29udHJpYnV0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9XSVpBUkRfUEFHRSA9ICJ3aXphcmRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIHdpemFyZElEOwotCXByaXZhdGUgRE1XaXphcmRQYWdlRWxlbWVudFtdIGVsZW1lbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgcGFnZSBleHRlbnNpb24gbWFuYWdlciBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHdpemFyZCAtCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHRvIGNvbnN0cnVjdCB0aGUgbWFuYWdlciBmb3IuCi0JICovCi0JcHVibGljIFBhZ2VFeHRlbnNpb25NYW5hZ2VyKERhdGFNb2RlbFdpemFyZCB3aXphcmQpIHsKLQkJdGhpcy53aXphcmRJRCA9IHdpemFyZC5nZXRXaXphcmRJRCgpOwotCQlsb2FkRWxlbWVudHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGFkZGl0aW9uYWwgY29udHJvbHMgYXJlIGNvbnRyaWJ1dGVkIGJ5IHRoZSB3aXphcmQgcGFnZSBleHRlbnNpb25zCi0JICogdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4gZWxlbWVudCBvZiB0aGUKLQkgKiA8Y2l0ZT53aXphcmRQYWdlR3JvdXA8L2NpdGU+IGV4dGVuc2lvbiBwb2ludCBhbmQgdGhlIDxjaXRlPndpemFyZElEPC9jaXRlPgotCSAqIGF0dHJpYnV0ZSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgd2l6YXJkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIHdoZXJlIHRoZSBhZGRpdGlvbmFsIGNvbnRyb2xzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGFkZGVkIHRvLgotCSAqIEBwYXJhbSBtb2RlbCAtCi0JICogICAgICAgICAgICB0aGUgZGF0YSBtb2RlbCBvZiB0aGUgd2l6YXJkLgotCSAqIEBwYXJhbSBwYWdlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5kZWQgd2l6YXJkIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmICh3aXphcmRJRC5lcXVhbHMoZWxlbWVudC5nZXRXaXphcmRJRCgpKSkgewotCQkJCWVsZW1lbnQuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHBhcmVudCwgbW9kZWwsIHBhZ2VOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZEVsZW1lbnRzKCkgeyAKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgUE9JTlRfV0laQVJEX1BBR0VfR1JPVVApOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhbGxFbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGFsbEVsZW1lbnRzW2ldOwotCQkJaWYgKEVMRU1FTlRfV0laQVJEX1BBR0UuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJlc3VsdC5hZGQobmV3IERNV2l6YXJkUGFnZUVsZW1lbnQoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCQotCQllbGVtZW50cyA9IChETVdpemFyZFBhZ2VFbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBETVdpemFyZFBhZ2VFbGVtZW50W10geyB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1NpbXBsZVBhZ2VHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTM2ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VHcm91cCBpbXBsZW1lbnRzIEFkZGFibGVQYWdlR3JvdXAgewotCXByaXZhdGUgU3RyaW5nIGdyb3VwSUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbG93RXh0ZW5kZWRQYWdlczsKLQlwcml2YXRlIFN0cmluZyByZXF1aXJlZERhdGFPcGVyYXRpb247Ci0JcHJpdmF0ZSBTZXQgICAgZGF0YU1vZGVsSURzOwotCi0JcHJpdmF0ZSBJRE1QYWdlSGFuZGxlciBwYWdlSGFuZGxlcjsKLQlwcml2YXRlIElETVBhZ2VHcm91cEhhbmRsZXIgcGFnZUdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIFZlY3RvciBwYWdlczsKLQotCXB1YmxpYyBTaW1wbGVQYWdlR3JvdXAoU3RyaW5nIGdyb3VwSUQsIFN0cmluZyB3aXphcmRJRCwgYm9vbGVhbiBhbGxvd0V4dGVuZGVkUGFnZXMsIFN0cmluZyByZXF1aXJlRGF0YU9wZXJhdGlvbikgewotCQl0aGlzLmdyb3VwSUQgPSBncm91cElEOwotCQl0aGlzLndpemFyZElEID0gd2l6YXJkSUQ7Ci0JCXRoaXMuYWxsb3dFeHRlbmRlZFBhZ2VzID0gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCQl0aGlzLnJlcXVpcmVkRGF0YU9wZXJhdGlvbiA9IHJlcXVpcmVEYXRhT3BlcmF0aW9uOwotCQlwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlUGFnZUdyb3VwKFN0cmluZyBncm91cElELCBTdHJpbmcgd2l6YXJkSUQpIHsKLQkJdGhpcyhncm91cElELCB3aXphcmRJRCwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXBhZ2VzLmFkZChwYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcyhJV2l6YXJkUGFnZVtdIG5ld1BhZ2VzKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuZXdQYWdlcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCXBhZ2VzLmFkZChuZXdQYWdlc1tpbmRleF0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpIHsKLQkJcmV0dXJuIGFsbG93RXh0ZW5kZWRQYWdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWdlR3JvdXBIYW5kbGVyKElETVBhZ2VHcm91cEhhbmRsZXIgaGFuZGxlcikgewotCQlwYWdlR3JvdXBIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VIYW5kbGVyKElETVBhZ2VIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcGFnZUhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUhhbmRsZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQkKLQlwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRFeHRlbmRlZFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiAoSVdpemFyZFBhZ2VbXSkgcGFnZXMudG9BcnJheShuZXcgSVdpemFyZFBhZ2VbMF0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBncm91cElEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKSB7Ci0JCXJldHVybiByZXF1aXJlZERhdGFPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHdpemFyZElEOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RGF0YU1vZGVsSURzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsSURzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbElEcyhTZXQgZGF0YU1vZGVsSURzKSB7Ci0JCXRoaXMuZGF0YU1vZGVsSURzID0gZGF0YU1vZGVsSURzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBkMTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBFcnJvckRpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzU2NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmZvRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgSW5mb0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDg2MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotICAvKioKLSAgICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotICAvKioKLSAgICogVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0gIC8qKgotICAgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLSAgcHJvdGVjdGVkIFRleHQgZGV0YWlsczsKLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogRmlsdGVyIG1hc2sgZm9yIGRldGVybWluaW5nIHdoaWNoIHN0YXR1cyBpdGVtcyB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotICAvKioKLSAgICogVGhlIG1haW4gc3RhdHVzIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1czsKLSAgCi0gIHByaXZhdGUgUG9pbnQgc2F2ZWRTaXplID0gbnVsbDsKLQotICAvKioKLSAgICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+U3RhdHVzPC9jb2RlPikuCi0gICAqLwotICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Qgc3RhdHVzTGlzdDsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgIHRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZSA9PSBudWxsID8gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9ibGVtX09jY3VycmVkIikgOiAvLyROT04tTkxTLTEkCi0gIGRpYWxvZ1RpdGxlOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBKRmFjZVJlc291cmNlcy5mb3JtYXQoIlJlYXNvbiIsIG5ldyBPYmplY3RbXSB7IG1lc3NhZ2UsIHN0YXR1cy5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIHN0YXR1c0xpc3QgPSBBcnJheXMuYXNMaXN0KHN0YXR1cy5nZXRDaGlsZHJlbigpKTsKLSAgICB0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPayBvcgotICAgKiBEZXRhaWxzIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlCi0gICAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgRGV0YWlscyBidXR0b24gd2FzIHByZXNzZWQgdGhlbiB0b2dnbGUgdGhlIGRpc3BsYXlpbmcKLSAgICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLSAgICogdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpCi0gICAgeyAvLyB3YXMgdGhlIGRldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0gICAgICB0b2dnbGVEZXRhaWxzQXJlYSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0gICAgfQotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIFdpbmRvdy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQodGl0bGUpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzCi0gICAqIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotCi0gICAgLy8gY3JlYXRlIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgQ29tcG9zaXRlIGltYWdlQW5kTGFiZWwgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGltYWdlQW5kTGFiZWwuc2V0TGF5b3V0KGdsKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgSW1hZ2UgaW1hZ2UgPSBnZXREaWFsb2dJbWFnZSgpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGltYWdlQW5kTGFiZWwsIDApOwotICAgICAgaW1hZ2Uuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSgKLSAgICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBtZXNzYWdlCi0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChpbWFnZUFuZExhYmVsLCBTV1QuUkVBRF9PTkxZfFNXVC5XUkFQKTsKLSAgICAgIHRleHQuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0gICAgICBkYXRhLndpZHRoSGludCA9Ci0gICAgICAgIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotICAgICAKLSAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIHRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY3JlYXRlRHJvcERvd25MaXN0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgdGhlIGxpc3QKLSAgICBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotICAgIC8vIGZpbGwgdGhlIGxpc3QKLSAgICBwb3B1bGF0ZUxpc3QobGlzdCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRhdGEuaGVpZ2h0SGludCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpICogTElTVF9JVEVNX0NPVU5UOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBsaXN0Q3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgcHJvdGVjdGVkIFRleHQgY3JlYXRlRHJvcERvd25EZXRhaWxzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBkZXRhaWxzID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0gICAgLy9kZXRhaWxzLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIDI1NSwgMjU1LCAyNTUpOwotICAgIGRldGFpbHMuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMsIHN0YXR1cywgMCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBkZXRhaWxzLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGV0YWlscy5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgZGV0YWlsc0NyZWF0ZWQgPSB0cnVlOwotICAgIHJldHVybiBkZXRhaWxzOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICovCi0gIC8qKgotICAgKiBFeHRlbmRzIDxjb2RlPldpbmRvdy5vcGVuKCk8L2NvZGU+LiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheQotICAgKiB0aGUgZXJyb3IuIElmIHlvdSBzcGVjaWZpZWQgYSBtYXNrIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqLwotICBwdWJsaWMgaW50IG9wZW4oKQotICB7Ci0gICAgaWYgKHNob3VsZERpc3BsYXkoc3RhdHVzLCBkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyoqCi0gICAqIFRoaXMgZXNzZW50aWFsbHkgZG9lcyB0aGUgd29yayBvZiBhIGZhY3RvcnkgT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvCi0gICAqIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotICAgKiBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2ggdG8gZGlzcGxheSBhbGwgc3VjaAotICAgKiBpdGVtcyB3aXRob3V0IGZpbHRlcmluZy4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMpCi0gIHsKLQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBJU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gb3BlbkluZm8oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIG9wZW5XYXJuaW5nKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIG9wZW5FcnJvcigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBDaG9pY2VbXSBvcHRpb25zKQotICB7Ci0KLSAgICByZXR1cm4gb3Blbk9wdGlvbnMoCi0gICAgICBwYXJlbnQsCi0gICAgICBkaWFsb2dUaXRsZSwKLSAgICAgIG1lc3NhZ2UsCi0gICAgICBzdGF0dXMsCi0gICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUiwKLSAgICAgIG9wdGlvbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotICAgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3Ugd2lzaAotICAgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLiBUaGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcigKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgRXJyb3JEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBFcnJvckRpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkluZm8oCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIEluZm9EaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBJbmZvRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuV2FybmluZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgV2FybmluZ0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IFdhcm5pbmdEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5PcHRpb25zKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotICAgIE9wdGlvbnNEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBPcHRpb25zRGlhbG9nKAotICAgICAgICBwYXJlbnRTaGVsbCwKLSAgICAgICAgdGl0bGUsCi0gICAgICAgIG1lc3NhZ2UsCi0gICAgICAgIHN0YXR1cywKLSAgICAgICAgZGlzcGxheU1hc2ssCi0gICAgICAgIG9wdGlvbnMpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcyB0aGUKLSAgICogY2hpbGQgc3RhdGkgb2YgdGhlIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUgZm9ybWF0Ci0gICAqIGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzCi0gICAqIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIEl0ZXJhdG9yIGVudW1lcmF0aW9uID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBlbnVtZXJhdGlvbi5uZXh0KCk7Ci0gICAgICBwb3B1bGF0ZUxpc3QobGlzdCwgY2hpbGRTdGF0dXMsIDApOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHNiLmFwcGVuZChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICBsaXN0LmFkZChzYi50b1N0cmluZygpKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlTGlzdChsaXN0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEZXRhaWxzKFRleHQgdGV4dCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgU3RyaW5nICAgIHRhYkNoYXJzICAgID0gcmVwZWF0KCAnICcsIG5lc3RpbmcgKiAyICk7Ci0gICAgU3RyaW5nICAgIG1lc3NhZ2VMaW5lID0gdGFiQ2hhcnMgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgVGhyb3dhYmxlIGV4Y2VwdCAgICAgID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgIAotICAgIHRleHQuYXBwZW5kKCBtZXNzYWdlTGluZSApOwotICAgIAotICAgIGlmKCBleGNlcHQgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gdHJhY2UgPSBnZXRTdGFja1RyYWNlKCBleGNlcHQgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNlLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIHRleHQuYXBwZW5kKCB0YWJDaGFycyArICIgICAgIiArIHRyYWNlW2luZGV4XSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwb3B1bGF0ZURldGFpbHModGV4dCwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotICAgKiBAcGFyYW0gbWFzawotICAgKiAgICAgICAgICAgIGEgbWFzayBhcyBwZXIgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0YXR1cyBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQKLSAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU3RhdHVzIHN0YXR1cywgaW50IG1hc2spCi0gIHsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhdHVzLm1hdGNoZXMobWFzayk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoaWxkcmVuW2ldLm1hdGNoZXMobWFzaykpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotICAgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKQotICB7Ci0gICAgUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgIGludCAgIG5ld0hlaWdodCAgPSAtMTsKLSAgICAKLSAgICBpZiAoZGV0YWlsc0NyZWF0ZWQpCi0gICAgewotICAgICAgZGV0YWlscy5kaXNwb3NlKCk7Ci0gICAgICBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLSAgICAgIAotICAgICAgLy8gV2l0aG91dCB0aGUgZm9sbG93aW5nIGNvbXB1dGVTaXplIGNhbGwgdGhlIHNldFNpemUgY2FsbCBiZWxvdyB0aHJvd3MgYW4gYXJyYXkgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uCi0gICAgICAvLyBWZXJ5IHdlaXJkLgotICAgICAgZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgCi0gICAgICBuZXdIZWlnaHQgPSBzYXZlZFNpemUueTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmKCBzYXZlZFNpemUgPT0gbnVsbCApIHNhdmVkU2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgIAotICAgICAgZGV0YWlscyA9IGNyZWF0ZURyb3BEb3duRGV0YWlscygoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLSAgICAgIGRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0gICAgICBuZXdIZWlnaHQgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLSAgICB9Ci0KLQotICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+IDQwMCA/IDQwMCA6IG5ld0hlaWdodDsKLSAgICAKLSAgICBnZXRTaGVsbCgpLnNldFNpemUoIG5ldyBQb2ludCh3aW5kb3dTaXplLngsIG5ld0hlaWdodCkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIFZlY3RvciAgICAgICBsaW5lcyAgICAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciAgcHJpbnRXcml0ZXIgID0gbmV3IFByaW50V3JpdGVyKCBzdHJpbmdXcml0ZXIgKTsKLSAgICAKLSAgICBleGMucHJpbnRTdGFja1RyYWNlKCBwcmludFdyaXRlciApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlciggc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBzdHJpbmdSZWFkZXIgKTsKLSAgICBTdHJpbmcgICAgICAgICBsaW5lICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgCi0gICAgICB3aGlsZSggbGluZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbGluZXMuYWRkKCBsaW5lLnRyaW0oKSApOwotICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlsaW5lcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIHJlcGVhdCggY2hhciB0aGVfY2hhciwgaW50IGNvdW50ICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCBjb3VudCApOwotCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBidWYuYXBwZW5kKCB0aGVfY2hhciApOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NjliMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9PcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICBwcml2YXRlIENob2ljZVtdIGNob2ljZXM7Ci0gIHByaXZhdGUgaW50IHJldHVybkNvZGVfOwotCi0gIHB1YmxpYyBPcHRpb25zRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gY2hvaWNlcykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlczsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgYnV0dG9uIGZvciBlYWNoIG9wdGlvbnMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpLCBjaG9pY2VzW2ldLmdldExhYmVsKCksIHRydWUpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKQotICB7Ci0gICAgaWYgKGlkID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKQotICAgICAgLy8gd2FzIHRoZSBEZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotICAgICAgc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFJldHVybkNvZGUoaWQpOwotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5Db2RlKGludCBpZCkKLSAgewotICAgIHJldHVybkNvZGVfID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFJldHVybkNvZGUoKQotICB7Ci0gICAgcmV0dXJuIHJldHVybkNvZGVfOwotICB9Ci0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIGNhc2UgSVN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2EzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotLyoqCi0qIENvbnN0YW50cyBmb3Igc3RhdHVzIGRpYWxvZ3MKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0RpYWxvZ0NvbnN0YW50cyB7Ci0KLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX0lEID0gMjsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19UT19BTExfSUQgPSA0OwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSUQgPSAxOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJPSyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0lEID0gMDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiRGV0YWlscyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfSUQgPSAxMzsKLQotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19UT19BTExfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19UT19BTExfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiQ2FuY2VsIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX0NBTkNFTF9MQUJFTCIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2ZDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1dhcm5pbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdhcm5pbmdEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBXYXJuaW5nRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0ssIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLSAgICAgIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmZmNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIElFbnZpcm9ubWVudCBjbGFzcyBmb3IgdGhlIEVjbGlwc2UgSUVudmlyb25tZW50LgotICogVGhpcyBJRW52aXJvbm1lbnQgY3VycmVudGx5IHN1cHBvcnRzIHRoZSAicGxhdGZvcm0iIHByb3RvY29sIGFuZCB0aGUgImZpbGUiCi0gKiBwcm90b2NvbC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQKLXsKLSAgcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5IHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotICBwcml2YXRlIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotICBwcml2YXRlIElMb2cgICAgICAgICAgICAgIGxvZ2dlcl8gICAgICAgICAgPSBudWxsOwotICAKLSAgcHVibGljIEVjbGlwc2VFbnZpcm9ubWVudCgpCi0gIHsKLSAgICB0aGlzKCBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFY2xpcHNlRW52aXJvbm1lbnQoIElTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIHsKLSAgICBJVVJJU2NoZW1lIGVjbGlwc2VTY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8gICAgICA9IG5ldyBTaW1wbGVVUklGYWN0b3J5KCk7Ci0gICAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIGVjbGlwc2VTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICAgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIGZpbGVTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRMb2coKQotICAgKi8KLSAgcHVibGljIElMb2cgZ2V0TG9nKCkKLSAgewotCSAgaWYoIGxvZ2dlcl8gPT0gbnVsbCApCi0gICAgeyAgCi0gICAgICBsb2dnZXJfID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsgCi0gICAgfTsKLQkKLSAgICByZXR1cm4gbG9nZ2VyXzsKLSAgfQotICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFN0YXR1c0hhbmRsZXIoKQotICAgKi8KLSAgcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c0hhbmRsZXJfOwotICB9Ci0KLSAgLyoqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLSAgICovCi0gIHB1YmxpYyBJVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiB1cmlGYWN0b3J5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkYzgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWkuU3RhdHVzRGlhbG9nQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgRWNsaXBzZSBVSSB2ZXJzaW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBJU3RhdHVzSGFuZGxlcgotewotICBwcml2YXRlIFNoZWxsICAgICAgICBzaGVsbF87Ci0gIAotICBwdWJsaWMgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgdGhpcyggbmV3IFNoZWxsKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcihTaGVsbCBzaGVsbCkKLSAgewotICAgIHNoZWxsXyA9IHNoZWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cywgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAgIGludCByZXN1bHQgPQotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfV0FSTklORywKLQkJCQludWxsLAotCQkJCXN0YXR1cywKLQkJCQljaG9pY2VzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgIGlmIChjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCkgPT0gcmVzdWx0KQotICAgICAgICByZXR1cm4gY2hvaWNlc1tpXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChJU3RhdHVzIHN0YXR1cykgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiB1c2VyT2sgPSBmYWxzZTsKLSAgICAKLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIC8vIGFuIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCB3ZSBuZWVkIHRvIHN0b3AgZXhlY3V0aW5nIHRoZSBjb21taW5nCi0gICAgICAvLyBjb21tYW5kcwotICAgICAgY2FzZSBTdGF0dXMuRVJST1IgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRFcnJvclN0YXR1cyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkcgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRXYXJuaW5nKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgCi0gICAgICBjYXNlIFN0YXR1cy5JTkZPIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gdHJ1ZTsKLSAgICAgICAgcmVwb3J0SW5mbyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoICF1c2VyT2sgKSB0aHJvdyBuZXcgU3RhdHVzRXhjZXB0aW9uKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydFdhcm5pbmcoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBpbnQgdXNlclJlc3BvbnNlID0KLSAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfV0FSTklORywKLSAgICAgICAgbnVsbCwKLSAgICAgICAgc3RhdHVzKTsKLSAgICByZXR1cm4gKHVzZXJSZXNwb25zZSA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydEVycm9yU3RhdHVzKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgIHNoZWxsXywKLSAgICAgIE1lc3NhZ2VzLlRJVExFX0VSUk9SLAotICAgICAgbnVsbCwKLSAgICAgIHN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIE1lc3NhZ2VzLlRJVExFX0lORk8sCi0gICAgICAgIG51bGwsCi0gICAgICAgIHN0YXR1cyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzI5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpLmVudmlyb25tZW50IjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfV0FSTklORzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfRVJST1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRJVExFX0lORk87Ci0gIAotICBzdGF0aWMKLSAgewotICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoIEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvZW52aXJvbm1lbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZkZTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1USVRMRV9XQVJOSU5HPVdhcm5pbmc6Ci1USVRMRV9FUlJPUj1FcnJvcjoKLVRJVExFX0lORk89SW5mbzoKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9Db21tb25VSVBsdWdpbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI1NWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblVJUGx1Z2luQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYwY2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCk7Ci0KLQkvKgotCSAqIHRoaXMgaXMgb3B0aW9uYWwKLQkgKi8KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgY3JlYXRlUGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCkgCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCQkKLQkvKioKLQkgKiBUaGlzIHBhZ2UgZ3JvdXAgaGFuZGxlciBjYW4gYmUgb3B0aW9uYWxseSBvdmVycmlkZW4uCi0JICovCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgY3JlYXRlUGFnZUdyb3VwSGFuZGxlciggSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCApCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcwY2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAqIGdpdmVuIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRoZQotICogPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4gZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZUdyb3VwPC9jaXRlPgotICogZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgewotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBwb2ludHMgdG8gdGhlIHdpemFyZCwgd2hpY2ggcGFnZXMgYXJlCi0JICogZXh0ZW5kZWQgYnkgdGhlIGN1cnJlbnQgY29udHJpYnV0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9XSVpBUkRfSUQgPSAid2l6YXJkSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZmFjdG9yeSBjbGFzcyBuYW1lLCB3aGVyZSBpcwotCSAqIHRoZSBKYXZhIGNvZGUgdGhhdCBjb250cmlidXRlcyB0aGUgbmV3IGNvbnRyb2xzIHRvIHRoZSB3aXphcmQgcGFnZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFN0cmluZyB3aXphcmRJRDsKLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgZmFjdG9yeUVsZW1lbnQ7Ci0JCi0JcHJpdmF0ZSBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RE1XaXphcmRQYWdlRWxlbWVudDwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+IHRvIHdyYXAuCi0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCQotCQl3aXphcmRJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9XSVpBUkRfSUQpOwotCQlyZWFkRmFjdG9yeShlbGVtZW50KTsKLQkJCi0JCWxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElkZW50aWZpYWJsZSNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJU3RyaW5nIGlkID0gd2l6YXJkSUQ7Ci0JCWlmIChmYWN0b3J5RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZCA9IGlkICsgIkAiICsgZmFjdG9yeUVsZW1lbnQuY2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBpZDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBJZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIHdpemFyZCB3aGljaCBwYWdlcyB0aGUgY3VycmVudCBleHRlbnNpb24gd2lsbAotCSAqIGNvbnRyaWJ1dGUgdG8uCi0JICogCi0JICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiB3aXphcmRJRDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGN1cnJlbnQgZXh0ZW5zaW9uIGNvbnRyaWJ1dGVzIGFkZGl0aW9uYWwgY29udHJvbHMgdG8gdGhlIHNwZWNpZmllZAotCSAqIHBhcmVudCBjb21wb3NpdGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSB3aXphcmQgcGFnZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKGZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlmYWN0b3J5RWxlbWVudC5jcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMocGFyZW50LCBtb2RlbCwgcGFnZU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjdG9yaWVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFTEVNRU5UX0ZBQ1RPUlkpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwgJiYgZmFjdG9yaWVzLmxlbmd0aCA+IDApIHsKLQkJCWZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KGZhY3Rvcmllc1swXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZDVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hlcmUgdGhlIGFjdHVhbCBleHRlbmRpbmcgb2YgdGhlIHdpemFyZCBwYWdlcyBoYXBwZW4uCi0gKiAKLSAqIDxwPgotICogSW1wbGVtZW50YXRpb24gb2YgdGhpcyBhYnN0cmFjdCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKLSAqIDxjaXRlPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3J1b3A8L2NpdGU+IGV4dGVuc2lvbgotICogcG9pbnQgPiA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPiA+IDxjaXRlPmZhY3Rvcnk8L2NpdGU+ID4gPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBrcmFldgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjkwYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gYnVnIDIxMzkyNwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVUkgPSAib3JnLmVjbGlwc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JSGFzaE1hcCB3aXphcmRQbHVnaW5JRE1hcCA9IG51bGw7Ci0KLQlUcmVlTWFwIHdpemFyZFBhZ2VFbGVtZW50cyA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFRyZWVTZXQgd2l6YXJkRXh0UGFnZUVsZW1lbnRzID0gbnVsbDsKLQlMaXN0IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIFdpemFyZFBhZ2VFeHRlbnNpb25SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpIHsKLQkJc2V0dXBXaXphcmRQbHVnaW5JRE1hcCgpOwotCQlyZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JCXBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwV2l6YXJkUGx1Z2luSURNYXAoKSB7Ci0JCXdpemFyZFBsdWdpbklETWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gZ2V0IGVkaXRvciBwbHVnaW4gYW5kIHNhdmUgaXQgdG8gYSBoYXNoIG1hcAotCQkvLyBOb3RlOiBlZGl0b3JzIGV4dGVuc2lvbiBpZCBpcyBkaWZmZXJlbnQgZnJvbSBlZGl0b3IgaWQKLQotCQlJRXh0ZW5zaW9uUG9pbnRbXSBwb2ludCA9IG5ldyBJRXh0ZW5zaW9uUG9pbnRbXXtQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KE9SR19FQ0xJUFNFX1VJLCAiZXhwb3J0V2l6YXJkcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoT1JHX0VDTElQU0VfVUksICJpbXBvcnRXaXphcmRzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChPUkdfRUNMSVBTRV9VSSwgIm5ld1dpemFyZHMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiLCAiZXh0ZW5kYWJsZVdpemFyZCIpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwb2ludC5sZW5ndGg7IHgrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludFt4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgd2l6YXJkSUQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50c1tpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQl3aXphcmRQbHVnaW5JRE1hcC5wdXQod2l6YXJkSUQsIHBsdWdpbklEKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQl3aXphcmRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZU1hcCgpOwotCQkvLyB3aXphcmRFeHRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZVNldCgpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFJlYWQgYWxsIHBhZ2UgZXh0ZW5zaW9ucyBpbnRvIGVkaXRvclBhZ2VFbGVtZW50cwotCQlyZWFkZXIgPSBuZXcgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpOwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpIHsKLQkJCXN1cGVyKENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LkVMRU1FTlRfUEFHRV9HUk9VUCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKCFETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuRUxFTUVOVF9QQUdFX0dST1VQLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBwdXQgdGhlIGVsZW1lbnQgaW50byBhIGhhc2htYXAsIHdpemFyZElEIGFzIGtleSwKLQkJCS8vIGxpc3Qgb2YgcGFnZSBlbGVtZW50cyBhcyBvYmplY3QKLQkJCVN0cmluZyB3aXphcmRJRCA9IG5ld0VsZW1lbnQuZ2V0V2l6YXJkSUQoKTsKLQkJCWlmICghd2l6YXJkUGFnZUVsZW1lbnRzLmNvbnRhaW5zS2V5KHdpemFyZElEKSkgewotCQkJCXdpemFyZFBhZ2VFbGVtZW50cy5wdXQod2l6YXJkSUQsIGNyZWF0ZVBhZ2VNYXBFbnRyeShuZXdFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCVRyZWVNYXAgcGFnZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJCQlpbnNlcnRQYWdlRWxlbWVudChwYWdlTWFwLCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnNlcnRQYWdlRWxlbWVudChUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAobmV3RWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQgPT0gbnVsbCkgewotCQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIG5ldyBUcmVlU2V0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50LnBhZ2VJbnNlcnRpb25JRDsKLQkJCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldFBhZ2VFbGVtZW50KGVsZW1lbnROYW1lLCBwYWdlTWFwKTsKLQkJCQlpbnNlcnRFeHRQYWdlRWxlbWVudChwYWdlTWFwLCBwYXJlbnRFbGVtZW50LCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJbmV3RWxlbWVudC5nZXRQYWdlSW5zZXJ0aW9uSUQoKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluc2VydEV4dFBhZ2VFbGVtZW50KFRyZWVNYXAgcGFnZU1hcCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IHBhcmVudEVsZW1lbnQsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmFkZChuZXdFbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoIXBhcmVudEVsZW1lbnQuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzAsIG5ldyBPYmplY3RbXXtwYXJlbnRFbGVtZW50LmdldFBhZ2VJRCgpfSkpOwotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMSwgbmV3IE9iamVjdFtde25ld0VsZW1lbnQuZ2V0UGFnZUlEKCl9KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJVHJlZVNldCBzZXQgPSAoVHJlZVNldCkgcGFnZU1hcC5nZXQocGFyZW50RWxlbWVudCk7Ci0JCQlzZXQuYWRkKG5ld0VsZW1lbnQpOwotCi0JCQlpZiAobmV3RWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIpCi0JCQkJcGFnZU1hcC5wdXQobmV3RWxlbWVudCwgbmV3IFRyZWVTZXQoKSk7Ci0KLQkJCWlmIChub25TeW5jZWRQYWdlRWxlbWVudExpc3QuY29udGFpbnMobmV3RWxlbWVudCkpCi0JCQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnJlbW92ZShuZXdFbGVtZW50KTsKLQkJfQotCi0JCXByaXZhdGUgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGdldFBhZ2VFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgVHJlZU1hcCBtYXApIHsKLQkJCVNldCBrZXlTZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRQYWdlSUQoKS5lcXVhbHMoZWxlbWVudE5hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQotCQlwcml2YXRlIFRyZWVNYXAgY3JlYXRlUGFnZU1hcEVudHJ5KERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQkJVHJlZVNldCBwYWdlRXh0ZW5zaW9uU2V0ID0gbmV3IFRyZWVTZXQoKTsKLQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIHBhZ2VFeHRlbnNpb25TZXQpOwotCQkJcmV0dXJuIHBhZ2VNYXA7Ci0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uRWxlbWVudHMoU3RyaW5nIHdpemFyZElEKSB7Ci0JCVRyZWVNYXAgdHJlZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJcmV0dXJuIHRyZWVNYXAuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbXSBnZXRQYWdlRWxlbWVudHMoU3RyaW5nIHdpemFyZElEKSB7Ci0JCVRyZWVNYXAgZWxlbWVudE1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJaWYgKGVsZW1lbnRNYXAgPT0gbnVsbCB8fCBlbGVtZW50TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbMF07Ci0JCX0KLQkJQXJyYXlMaXN0IGFscmVhZHlWaXN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50TWFwLnNpemUoKSk7Ci0JCVNldCBhbGxQYWdlRWxlbWVudHNMaXN0ID0gZWxlbWVudE1hcC5rZXlTZXQoKTsKLQkJQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudE1hcC5zaXplKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhZ2VFbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFscmVhZHlWaXN0ZWRMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZWxlbWVudC5nZXRJRCgpLCBudWxsKS5pc0VuYWJsZWQoKSkgewotCQkJCW9yZGVyZWRQYWdlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJVHJlZVNldCB0cmVlU2V0ID0gKFRyZWVTZXQpIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmICh0cmVlU2V0ICE9IG51bGwgJiYgIXRyZWVTZXQuaXNFbXB0eSgpKQotCQkJCQlmbGF0ZW5UcmVlU2V0KHRyZWVTZXQsIGFsbFBhZ2VFbGVtZW50c0xpc3QsIGFscmVhZHlWaXN0ZWRMaXN0LCBvcmRlcmVkUGFnZUxpc3QsIGVsZW1lbnRNYXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYWdlQXJyYXkob3JkZXJlZFBhZ2VMaXN0KTsKLQotCX0KLQotCXByaXZhdGUgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W10gZ2V0UGFnZUFycmF5KEFycmF5TGlzdCBvcmRlcmVkUGFnZUxpc3QpIHsKLQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W10gcGFnZUVsZW1lbnRzID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFtvcmRlcmVkUGFnZUxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkUGFnZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXBhZ2VFbGVtZW50c1tpXSA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG9yZGVyZWRQYWdlTGlzdC5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIHBhZ2VFbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmxhdGVuVHJlZVNldChUcmVlU2V0IHRyZWVTZXQsIFNldCBhbGxQYWdlRWxlbWVudHNMaXN0LCBBcnJheUxpc3QgYWxyZWFkeVZpc3RlZExpc3QsIEFycmF5TGlzdCBvcmRlcmVkUGFnZUxpc3QsIFRyZWVNYXAgZWxlbWVudE1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0cmVlU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhbHJlYWR5VmlzdGVkTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMiwgbmV3IE9iamVjdFtde2VsZW1lbnQuZ2V0UGFnZUlEKCksIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudC5BVFRfUEFHRV9JTlNFUlRJT05fSUR9KSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChhbGxQYWdlRWxlbWVudHNMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJVHJlZVNldCBzZXQgPSAoVHJlZVNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJb3JkZXJlZFBhZ2VMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlhbHJlYWR5VmlzdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJZmxhdGVuVHJlZVNldChzZXQsIGFsbFBhZ2VFbGVtZW50c0xpc3QsIGFscmVhZHlWaXN0ZWRMaXN0LCBvcmRlcmVkUGFnZUxpc3QsIGVsZW1lbnRNYXApOwotCQkJfSBlbHNlIHsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWFscmVhZHlWaXN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBpZiBjaGlsZCBlbGVtZW50cyBhcmUgcmVhZCBpbiBiZWZvcmUgcGFyZW50IGVsZW1lbnQuIERvIHBvc3QgcmVhZC4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGxpc3RSZW1vdmVPYmplY3RzOwotCi0JcHJpdmF0ZSB2b2lkIHBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQlsaXN0UmVtb3ZlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Qobm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5nZXQoaSk7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldChlbGVtZW50LndpemFyZElEKTsKLQkJCWlmIChlbGVtZW50LnBhZ2VJbnNlcnRpb25JRCA9PSBudWxsKSB7Ci0JCQkJYWRkVG9GaXJzdEF2aWFsaWFibGUocGFnZU1hcCwgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKHJlYWRlciAhPSBudWxsICYmIHBhZ2VNYXAgIT0gbnVsbCkKLQkJCQlyZWFkZXIuaW5zZXJ0UGFnZUVsZW1lbnQocGFnZU1hcCwgZWxlbWVudCk7Ci0JCX0KLQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnJlbW92ZUFsbChsaXN0UmVtb3ZlT2JqZWN0cyk7Ci0JCWlmICghbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmlzRW1wdHkoKSkKLQkJCWxvZ01pc3NpbmdDbGFzc0Vycm9yKCk7Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhZ2VNYXAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0ZpcnN0QXZpYWxpYWJsZShUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCWJvb2xlYW4gaW5zZXJ0Tm90Rm91bmQgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikgewotCQkJCVRyZWVTZXQgc2V0ID0gKFRyZWVTZXQpIHBhZ2VNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCXNldC5hZGQobmV3RWxlbWVudCk7Ci0JCQkJbGlzdFJlbW92ZU9iamVjdHMuYWRkKG5ld0VsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAoaW5zZXJ0Tm90Rm91bmQpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2dnZXIubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMyk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dNaXNzaW5nQ2xhc3NFcnJvcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25TeW5jZWRQYWdlRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmdldChpKTsKLQkJCWxvZ2dlci5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfNCwgbmV3IE9iamVjdFtde2VsZW1lbnQucGFnZUluc2VydGlvbklELCBlbGVtZW50LmdldFBhZ2VJRCgpLCBlbGVtZW50LnBsdWdpbklEfSkpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWpiUGFnZUV4dGVuc2lvblJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwOWE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAqIGdpdmVuIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgdGhlCi0gKiA8Y2l0ZT5mYWN0b3J5PC9jaXRlPiBlbGVtZW50IGFzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4KLSAqIGVsZW1lbnQgb2YgdGhlIDxjaXRlPndpemFyZFBhZ2VHcm91cDwvY2l0ZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCBleHRlbmRzIENvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHBvaW50cyB0byBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgKiBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+Ci0JICogYWJzdHJhY3QgY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyB0aGUgYWN0dWFsIGpvYiBvbiBleHRlbmRpbmcgYSB3aXphcmQKLQkgKiBwYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSBnaXZlbgotCSAqIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdG8gd3JhcC4KLQkgKi8KLQlwdWJsaWMgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJCi0JCWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYWRkaXRpb25hbCBjb250cm9scyBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+IGFic3RyYWN0IGNsYXNzLCB0aGF0IGlzCi0JICogZGVmaW5lZCBpbiB0aGUgPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPiBhdHRyaWJ1dGUsIGlzIGluaXRpYWxpemVkLiBUaGVuCi0JICogdGhlIG1ldGhvZCBmb3J3YXJkcyB0aGUgY2FsbCB0byB0aGUgZmFjdG9yeSBjbGFzcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKCFpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQpCi0JCQlpbml0UGFnZUZhY3RvcnkoKTsKLQotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXdpemFyZFBhZ2VGYWN0b3J5LmNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhwYXJlbnQsIG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZUZhY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRQYWdlRmFjdG9yeSA9IChETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTX05BTUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3IgZ2V0dGluZyBwYWdlIGZhY3Rvcnk6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaXNQYWdlRmFjdG9yeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3YWE3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBR0VfSUQgPSAicGFnZUdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0laQVJEX0lEID0gIndpemFyZElEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFUVVJUkVTX0RBVEFfT1BFUkFUSU9OX0lEID0gInJlcXVpcmVzRGF0YU9wZXJhdGlvbklkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RBVEFfTU9ERUxfSURTID0gImRhdGFNb2RlbElkcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9BTExPV1NfRVhURU5ERURfUEFHRVNfQUZURVIgPSAiYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBR0VfSU5TRVJUSU9OX0lEID0gInBhZ2VHcm91cEluc2VydGlvbklEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlR3JvdXBGYWN0b3J5RWxlbWVudCB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpemFyZElEOwotCXB1YmxpYyBTdHJpbmcgcGFnZUdyb3VwSUQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB3aXphcmRGYWN0b3J5RWxlbWVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXF1aXJlc0RhdGFPcGVyYXRpb25JZDsKLQlwcm90ZWN0ZWQgU2V0IGRhdGFNb2RlbElEczsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhZ2VJbnNlcnRpb25JRDsKLQlwcml2YXRlIGludCBsb2FkT3JkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvYWRPcmRlckNvdW50ZXI7Ci0KLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwdWJsaWMgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50MSkgewotCQlzdXBlcihlbGVtZW50MSk7Ci0JCXBsdWdpbklEID0gZWxlbWVudDEuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCXdpemFyZElEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9XSVpBUkRfSUQpOwotCQlwYWdlR3JvdXBJRCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfUEFHRV9JRCk7Ci0JCXJlcXVpcmVzRGF0YU9wZXJhdGlvbklkID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9SRVFVSVJFU19EQVRBX09QRVJBVElPTl9JRCk7Ci0JCWRhdGFNb2RlbElEcyA9IGdldERhdGFNb2RlbElkcyggZWxlbWVudDEgKTsKLQkJcmVhZEFsbG93c0V4dGVuZGVkUGFnZUFmdGVyKGVsZW1lbnQxKTsKLQkJcGFnZUluc2VydGlvbklEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9QQUdFX0lOU0VSVElPTl9JRCk7Ci0JCXJlYWRGYWN0b3J5KGVsZW1lbnQxKTsKLQkJdmFsaWRhdGVTZXR0aW5ncygpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0gIHByaXZhdGUgU2V0IGdldERhdGFNb2RlbElkcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBIYXNoU2V0IGlkcyAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgU3RyaW5nICBpZExpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREFUQV9NT0RFTF9JRFMpOwotICAgIAotICAgIGlmKCBpZExpc3QgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gZGF0YU1vZGVsSURzID0gaWRMaXN0LnNwbGl0KCAiICoiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFNb2RlbElEcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBpZHMuYWRkKCBkYXRhTW9kZWxJRHNbaW5kZXhdICk7ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGlkczsKLSAgfQotICAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTZXR0aW5ncygpIHsKLQkJaWYgKHdpemFyZElEID09IG51bGwgfHwgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW5jb21wbGV0ZSBwYWdlIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCByZWFkQWxsb3dzRXh0ZW5kZWRQYWdlQWZ0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCVN0cmluZyBhbGxvd3NQYWdlQWZ0ZXJWYWx1ZSA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSKTsKLQkJYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzUGFnZUFmdGVyVmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKGFsbG93c1BhZ2VBZnRlclZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGVsZW1lbnQxLmdldENoaWxkcmVuKEVMRU1FTlRfRkFDVE9SWSk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCAmJiBmYWN0b3JpZXMubGVuZ3RoID4gMCkgewotCQkJd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQoZmFjdG9yaWVzWzBdLCBwYWdlR3JvdXBJRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgY3JlYXRlUGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCXJldHVybiBJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLCBvKTsKLQkJLyoKLQkJICogaWYgKG8gPT0gbnVsbCkgcmV0dXJuIEdSRUFURVJfVEhBTjsgV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IChXaXphcmRQYWdlRWxlbWVudCkgbzsgaWYKLQkJICogKGdldElEKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldElEKCkgPT0gbnVsbCkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmCi0JCSAqIChnZXRJRCgpID09IG51bGwpIHJldHVybiBHUkVBVEVSX1RIQU47IGVsc2UgaWYgKGVsZW1lbnQuZ2V0SUQoKSA9PSBudWxsKSByZXR1cm4KLQkJICogTEVTU19USEFOOwotCQkgKiAKLQkJICogaW50IHByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoKTsgaW50IGVsZW1lbnRQcmlvcml0eSA9ZWxlbWVudC5nZXRQcmlvcml0eSgpOwotCQkgKiAKLQkJICogaWYgKHByaW9yaXR5ID09IGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmIChwcmlvcml0eSA8Ci0JCSAqIGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIEdSRUFURVJfVEhBTjsgaWYgKHByaW9yaXR5ID4gZWxlbWVudFByaW9yaXR5KSByZXR1cm4gTEVTU19USEFOOwotCQkgKiByZXR1cm4gRVFVQUw7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBwbHVnaW5JRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBJRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlSW5zZXJ0aW9uSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQlyZXR1cm4gbG9hZE9yZGVyOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcgotCSAqICAgICAgICAgICAgVGhlIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKSB7Ci0JCXRoaXMuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQoKSB7Ci0JCXJldHVybiByZXF1aXJlc0RhdGFPcGVyYXRpb25JZDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKFN0cmluZyBkYXRhT3BlcmF0aW9uSWQpIHsKLQkJcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQgPSBkYXRhT3BlcmF0aW9uSWQ7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWxJRHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsSUQoU2V0IG5ld0RhdGFNb2RlbElEcykgewotCQlkYXRhTW9kZWxJRHMgPSBuZXdEYXRhTW9kZWxJRHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRGYWN0b3J5RWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZEZhY3RvcnlFbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgd2l6YXJkRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZEZhY3RvcnlFbGVtZW50KFN0cmluZyB3aXphcmRGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZEZhY3RvcnlFbGVtZW50ID0gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZElECi0JICogICAgICAgICAgICBUaGUgd2l6YXJkSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZElEKFN0cmluZyB3aXphcmRJRCkgewotCQl0aGlzLndpemFyZElEID0gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuCi0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQgZ2V0V2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudChETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlSUQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VJRChTdHJpbmcgcGFnZUlEKSB7Ci0JCXRoaXMucGFnZUdyb3VwSUQgPSBwYWdlSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBnZXRQYWdlSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0YmEyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJvdGVjdGVkIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkOwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUdyb3VwSUQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGFnZUdyb3VwSUQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJdGhpcy5wYWdlR3JvdXBJRCA9IHBhZ2VHcm91cElEOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBjcmVhdGVQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoIWlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkKQotCQkJaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRE1QYWdlSGFuZGxlciBoYW5kbGVyID0gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkKLQkJCWluaXRQYWdlRmFjdG9yeSgpOwotCi0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEYXRhTW9kZWxXaXphcmRQYWdlW10gcGFnZXMgPSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJCi0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApCi0JewotCSAgaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkgaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCQotCSAgaWYoIHdpemFyZFBhZ2VHcm91cEZhY3RvcnkgPT0gbnVsbCApIHJldHVybiBudWxsOwotCSAgCi0JICByZXR1cm4gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBkYXRhTW9kZWwsIHBhZ2VHcm91cElEICk7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaW5pdFBhZ2VGYWN0b3J5KCkgewotCQl0cnkgewotCQkJd2l6YXJkUGFnZUdyb3VwRmFjdG9yeSA9IChETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBnZXR0aW5nIHBhZ2UgZmFjdG9yeTogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlN2I3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT04gPSAiRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UID0gIkRhdGFNb2RlbFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2hNYXAgZXh0ZW5zaW9uczsKLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIoKSB7Ci0JCXN1cGVyKFdUUFVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lEKTsKLQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MpOwotCQlpZiAobnVsbCA9PSBjbGFzc05hbWUgfHwgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlhZGRFeHRlbnNpb24oaWQsIGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5zaW9uKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGV4dGVuc2lvbnMuY29udGFpbnNLZXkoaWQpKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkR1cGxpY2F0ZSAiICsgRUxFTUVOVCArICIgIiArIEFUVFJJQlVURV9JRCArICIgIiArIGlkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJZXh0ZW5zaW9ucy5wdXQoaWQsIGVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlleHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgZXh0ZW5zaW9ucy5nZXQoaWQpOwotCQlpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIG5vdCBmb3VuZCBmb3IgIiArIEFUVFJJQlVURV9JRCArICI6ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkIGdldFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRFeHRlbnNpb24oZGF0YU1vZGVsLmdldElEKCkpOwotCi0JCXRyeSB7Ci0JCQl3aXphcmQgPSAoRGF0YU1vZGVsV2l6YXJkKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJCXdpemFyZC5zZXREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHdpemFyZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWVlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIE1hcCBleHRlbmRlZFZpZXdlck1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIEVsZW1lbnRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSID0gImV4dGVuZGVkVmlld2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfSUQgPSAidmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9WSUVXRVJfSUQgPSAicGFyZW50Vmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9HUk9VUF9JRCA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSgpIHsKLQkJc3VwZXIoV1RQVUlQbHVnaW4uUExVR0lOX0lELCBXVFBVSVBsdWdpbi5FWFRFTkRFRF9WSUVXRVJfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgdmlld2VySUQpIHsKLQkJcmV0dXJuIChEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yTWFwKCkuZ2V0KHZpZXdlcklEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFbGVtZW50cy5FWFRFTkRFRF9WSUVXRVIpKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQoZGVzY3JpcHRvci5nZXRWaWV3ZXJJRCgpLCBkZXNjcmlwdG9yKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuZGVkVmlld2VyTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5kZWRWaWV3ZXJNYXAoKSB7Ci0JCWlmIChleHRlbmRlZFZpZXdlck1hcCA9PSBudWxsKQotCQkJZXh0ZW5kZWRWaWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRWaWV3ZXJNYXA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RGVzY3JpcHRvck1hcCgpIHsKLQkJaWYgKGRlc2NyaXB0b3JNYXAgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvck1hcDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdmlld2VySUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBwYXJlbnRWaWV3ZXJJRCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGljb24gPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uR3JvdXBJRCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmdDYWNoZSA9IG51bGw7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQkJdGhpcy52aWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5WSUVXRVJfSUQpOwotCQkJdGhpcy5wYXJlbnRWaWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5QQVJFTlRfVklFV0VSX0lEKTsKLQkJCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLkZBQ1RPUllfQ0xBU1MpOwotCQkJdGhpcy5pY29uID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLklDT04pOwotCQkJdGhpcy5sYWJlbCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5MQUJFTCk7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5GVU5DVElPTl9HUk9VUF9JRCk7Ci0JCX0KLQotCQlwdWJsaWMgSUV4dGVuc2libGVWaWV3RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKSB7Ci0JCQlJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5KSB0aGlzLmVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihnZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmYWN0b3J5Q2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJCXJldHVybiBmYWN0b3J5Q2xhc3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbkdyb3VwSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uR3JvdXBJRCgpIHsKLQkJCXJldHVybiBmdW5jdGlvbkdyb3VwSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJY29uKCkgewotCQkJcmV0dXJuIGljb247Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsYWJlbC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRWaWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50Vmlld2VySUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB2aWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gdmlld2VySUQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKHRvU3RyaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQl0b1N0cmluZ0NhY2hlID0gIkV4dGVuc2libGVWaWV3UmVnaXN0cnkuSW5mbyBbdmlld2VySUQ9XCIiICsgZ2V0Vmlld2VySUQoKSArICJcIixwYXJlbnRWaWV3ZXJJRD1cIiIgKyBnZXRQYXJlbnRWaWV3ZXJJRCgpICsgIlwiLGZhY3RvcnlDbGFzcz0iICsgZ2V0RmFjdG9yeUNsYXNzKCkgKyAiXCIsZnVuY3Rpb25Hcm91cElEPVwiIiArIGdldEZ1bmN0aW9uR3JvdXBJRCgpICsgIlwiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJcmV0dXJuIHRvU3RyaW5nQ2FjaGU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lFeHRlbnNpYmxlVmlld0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lFeHRlbnNpYmxlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxOTM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2libGVWaWV3RmFjdG9yeSB7Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSU9wZXJhdGlvbk5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2I1Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSU9wZXJhdGlvbk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDUsIDIwMDQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25Ob2RlIHsKLQotCXB1YmxpYyBJT3BlcmF0aW9uTm9kZVtdIGdldENoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKTsKLQotCS8qKgotCSAqIFNhbWUgYXMgY2FsbGluZyBzZXRDaGVja2VkKGNoZWNrZWQsIHRydWUpCi0JICogCi0JICogQHBhcmFtIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCXB1YmxpYyBJT3BlcmF0aW9uTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c0V4ZWN1dGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQWJzdHJhY3RXVFBVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNmMjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQWJzdHJhY3RXVFBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMTAsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuSU1zZ0xvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V1RQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSU1zZ0xvZ2dlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBBYnN0cmFjdFdUUFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsgCi0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdUUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRQbHVnaW5JRCgpKTsKLQkJCXNldFJlbmRlcmVyKGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNmM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Nsb3NhYmxlV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENsb3NhYmxlV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gbmV3V2l6YXJkCi0JICovCi0JcHVibGljIENsb3NhYmxlV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJV2l6YXJkIG5ld1dpemFyZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2hBbmRDbG9zZSgpIHsKLQkJc3VwZXIuZmluaXNoUHJlc3NlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0RNUGFnZUdyb3VwRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFlZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURNUGFnZUdyb3VwIHsKLQlwcml2YXRlIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBwYWdlR3JvdXBFbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IHBhZ2VzOwotCQotCXB1YmxpYyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXBhZ2VHcm91cEVsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldERhdGFNb2RlbElEcygpOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKXsKLQkJaWYgKHBhZ2VzID09IG51bGwpIHsKLQkJCXBhZ2VzID0gQXJyYXlzLmFzTGlzdChwYWdlR3JvdXBFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpKTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUdyb3VwRWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJbnNlcnRpb25JRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2Y1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9EaXNwbGF5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTksIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlVdGlsaXR5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCWVsc2UKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI0NDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBZGRlZCBhIERldGFpbHMgYnV0dG9uIHRvIHRoZSBNZXNzYWdlRGlhbG9nIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZS4KLSAqIAotICogQm9ycm93ZWQgZnJvbSBhbiBlY2xpcHNlIEludGVybmFsRXJyb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0sgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByaXZhdGUgVGhyb3dhYmxlIGRldGFpbDsKLQlwcml2YXRlIGludCBkZXRhaWxCdXR0b25JRCA9IC0xOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JcHJpdmF0ZSBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4ID0gMDsKLQkvKioKLQkgKiBTaXplIG9mIHRoZSB0ZXh0IGluIGxpbmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX0xJTkVfQ09VTlQgPSAxNTsKLQotCXB1YmxpYyBFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWRlZmF1bHRCdXR0b25JbmRleCA9IGRlZmF1bHRJbmRleDsKLQkJdGhpcy5kZXRhaWwgPSBkZXRhaWw7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCX0KLQotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHJpZ3RoIHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCUJ1dHRvbiBiID0gZ2V0QnV0dG9uKGRlZmF1bHRCdXR0b25JbmRleCk7Ci0JCWIuc2V0Rm9jdXMoKTsKLQkJYi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oYik7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZXRhaWwgYnV0dG9uOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERldGFpbEJ1dHRvbihpbnQgaW5kZXgpIHsKLQkJZGV0YWlsQnV0dG9uSUQgPSBpbmRleDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gZGV0YWlsQnV0dG9uSUQpIHsKLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRSZXR1cm5Db2RlKGJ1dHRvbklkKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQuZGlzcG9zZSgpOwotCQkJdGV4dCA9IG51bGw7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25UZXh0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCQlQb2ludCBuZXdTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCS8vIHByaW50IHRoZSBzdGFja3RyYWNlIGluIHRoZSB0ZXh0IGZpZWxkCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCVByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOwotCQkJZGV0YWlsLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQlpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEVycm9yKSAmJiAoKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0gZWxzZSBpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgJiYgKCgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0KLQkJCXBzLmZsdXNoKCk7Ci0JCQliYW9zLmZsdXNoKCk7Ci0JCQl0ZXh0LnNldFRleHQoYmFvcy50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIFRFWFRfTElORV9DT1VOVDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGVmYXVsdEluZGV4LCBib29sZWFuIHNob3dDYW5jZWwpIHsKLQkJU3RyaW5nW10gbGFiZWxzOwotCQlpZiAoZGV0YWlsID09IG51bGwpCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTCA6IExBQkVMU19PSzsKLQkJZWxzZQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA6IExBQkVMU19PS19ERVRBSUxTOwotCQlFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgRXJyb3JEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIGRldGFpbCwgRVJST1IsIGxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJaWYgKGRldGFpbCAhPSBudWxsKQotCQkJZGlhbG9nLnNldERldGFpbEJ1dHRvbihsYWJlbHMubGVuZ3RoIC0gMSk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCS8vIGNyZWF0ZSBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCAwKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQkJLy8gY3JlYXRlIG1lc3NhZ2UKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNzc4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0V4ZWN1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4ZWN1dGlvbkxpc3RlbmVyCi17Ci0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG9FeGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzY5YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9HZW5lcmljV2l6YXJkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1dpemFyZE5vZGUgaW1wbGVtZW50cyBJV2l6YXJkTm9kZSB7Ci0KLQlwcm90ZWN0ZWQgSVdpemFyZCB3aXphcmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgR2VuZXJpY1dpemFyZE5vZGUuCi0JICovCi0JcHVibGljIEdlbmVyaWNXaXphcmROb2RlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAod2l6YXJkICE9IG51bGwpCi0JCQl3aXphcmQuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNnZXRDb250ZW50cygpCi0JICovCi0JcHVibGljIFBvaW50IGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSVdpemFyZCBnZXRXaXphcmQoKSB7Ci0JCWlmICh3aXphcmQgPT0gbnVsbCkKLQkJCXdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0byBjcmVhdGUgdGhlIHdpemFyZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpOwotCi0JLyoKLQkgKiBAc2VlIElXaXphcmROb2RlI2lzQ29udGVudENyZWF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGVudENyZWF0ZWQoKSB7Ci0JCXJldHVybiB3aXphcmQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZSNnZXRFeHRlbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRFeHRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmI2ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9sb2NhdGlvbkxhYmVsOwotCi0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDM4YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBsaXN0SXRlbXM7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEVKQlNlbGVjdGl2ZUltcG9ydERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdE1lc3NhZ2VEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIExpc3RNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgamF2YS5sYW5nLlN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCwgU3RyaW5nW10gbmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJbGlzdEl0ZW1zID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgYW4gYXJlYSBvZiB0aGUgZGlhbG9nIHdoaWNoIGFwcGVhcnMgYmVsb3cgdGhlIG1lc3NhZ2UgYW5kCi0JICogYWJvdmUgdGhlIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMKLQkgKiBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgY3VzdG9tIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBjdXN0b20gYXJlYSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgMCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGxpc3RJdGVtcyAhPSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsaXN0LnNldEl0ZW1zKGxpc3RJdGVtcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgY29uZmlybSAoT0svQ2FuY2VsKSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIE9LIGJ1dHRvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gT0sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGVycm9yIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCB3YXJuaW5nIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIG9rIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzJlYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3QgewotCXByaXZhdGUgZmluYWwgc3RhdGljIEFjdGlvbkxpc3RlbmVyW10gTlVMTF9BUlJBWSA9IG5ldyBBY3Rpb25MaXN0ZW5lclswXTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IEFjdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJMaXN0ID0gTlVMTF9BUlJBWTsKLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdGVuZXIgYXMgYSBsaXN0ZW5lciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKGwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBOVUxMX0FSUkFZKSB7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBsaXN0ZW5lciBhZGRlZCwKLQkJCS8vIGluaXRpYWxpemUgdGhlIGxpc3RzCi0JCQlsaXN0ZW5lckxpc3QgPSBuZXcgQWN0aW9uTGlzdGVuZXJbXXtsfTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSBjb3B5IHRoZSBhcnJheSBhbmQgYWRkIHRoZSBuZXcgbGlzdGVuZXIKLQkJCWludCBpID0gbGlzdGVuZXJMaXN0Lmxlbmd0aDsKLQkJCUFjdGlvbkxpc3RlbmVyW10gdG1wID0gbmV3IEFjdGlvbkxpc3RlbmVyW2kgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJMaXN0LCAwLCB0bXAsIDAsIGkpOwotCi0JCQl0bXBbaSArIDFdID0gbDsKLQotCQkJbGlzdGVuZXJMaXN0ID0gdG1wOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGxpc3RlbmVybGlzdAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJDb3VudCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyTGlzdC5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEFjdGlvbkxpc3RlbmVyW10gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAobCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVyTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJaWYgKGxpc3RlbmVyTGlzdFtpXS5lcXVhbHMobCkpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlBY3Rpb25MaXN0ZW5lcltdIHRtcCA9IG5ldyBBY3Rpb25MaXN0ZW5lcltsaXN0ZW5lckxpc3QubGVuZ3RoIC0gMV07Ci0JCQkvLyBDb3B5IHRoZSBsaXN0IHVwIHRvIGluZGV4Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVyTGlzdCwgMCwgdG1wLCAwLCBpbmRleCk7Ci0JCQkvLyBDb3B5IGZyb20gdHdvIHBhc3QgdGhlIGluZGV4LCB1cCB0bwotCQkJLy8gdGhlIGVuZCBvZiB0bXAgKHdoaWNoIGlzIHR3byBlbGVtZW50cwotCQkJLy8gc2hvcnRlciB0aGFuIHRoZSBvbGQgbGlzdCkKLQkJCWlmIChpbmRleCA8IHRtcC5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lckxpc3QsIGluZGV4ICsgMSwgdG1wLCBpbmRleCwgdG1wLmxlbmd0aCAtIGluZGV4KTsKLQkJCS8vIHNldCB0aGUgbGlzdGVuZXIgYXJyYXkgdG8gdGhlIG5ldyBhcnJheSBvciBudWxsCi0JCQlsaXN0ZW5lckxpc3QgPSAodG1wLmxlbmd0aCA9PSAwKSA/IE5VTExfQVJSQVkgOiB0bXA7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjMzZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLQotcHVibGljIGNsYXNzIE5ld1Byb2plY3RHcm91cCBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLyBjb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8gZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuTmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5Ccm93c2VfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZEaXJEaWFsb2dMYWJlbCA9ICJEaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCi0JcHVibGljIE5ld1Byb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUNvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9udChmb250KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCS8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotCQlHcm91cCBwcm9qZWN0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvamVjdEdyb3VwLnNldEZvbnQoZm9udCk7Ci0JCXByb2plY3RHcm91cC5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0KLQkJZmluYWwgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godXNlRGVmYXVsdHNCdXR0b24sIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBudWxsKTsKLQotCQlHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0JCWNyZWF0ZVVzZXJTcGVjaWZpZWRQcm9qZWN0TG9jYXRpb25Hcm91cChwcm9qZWN0R3JvdXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVVc2VyU3BlY2lmaWVkUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHByb2plY3RHcm91cCkgewotCQlGb250IGZvbnQgPSBwcm9qZWN0R3JvdXAuZ2V0Rm9udCgpOwotCQkvLyBsb2NhdGlvbiBsYWJlbAotCQlmaW5hbCBMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCk7Ci0KLQkJLy8gcHJvamVjdCBsb2NhdGlvbiBlbnRyeSBmaWVsZAotCQlsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0Rm9udChmb250KTsKLQotCQkvLyBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIElEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IG1vZGVsOwotCi0JCWNsYXNzIExvY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQkJCXByaXZhdGUgYm9vbGVhbiB0eXBpbmcgPSBmYWxzZTsKLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXR5cGluZyA9IHRydWU7Ci0JCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTiwgbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXR5cGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHVzZURlZmF1bHQgPSBsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTik7Ci0JCQkJaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbG9jYXRpb25MYWJlbC5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJaWYgKHVzZURlZmF1bHQpIHsKLQkJCQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQobG9jYWxNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGxvY2FsTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCF0eXBpbmcpIHsKLQkJCQkJaWYgKCh1c2VEZWZhdWx0ICYmIERFRkFVTFRfTE9DQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgfHwgKCF1c2VEZWZhdWx0ICYmIFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSkgewotCQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCgoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpOwotCi0JCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChuZXcgRGF0YU1vZGVsRXZlbnQobW9kZWwsIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRykpOwotCi0JCWxvY2F0aW9uUGF0aEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbW9kZWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0JCVN0cmluZyBkaXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJaWYgKGRpck5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWRpck5hbWUgPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQltb2RlbCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3YjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZSA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBzaXplOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0KLQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDApCi0JCQkJZHJhd1RvcFJpZ2h0KGZPdmVybGF5c1swXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkKLQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykKLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9QYWdlR3JvdXBNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkNvbW1vblVJUGx1Z2luQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUGFnZUdyb3VwTWFuYWdlciB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQlwcml2YXRlIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwOwotCXByaXZhdGUgSGFzaE1hcCBncm91cFRhYmxlOwotCXByaXZhdGUgSGFzaFNldCBvcGVyYXRpb25zUnVuOwotCXByaXZhdGUgU3RhY2sgcGFnZUdyb3VwU3RhY2s7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0YWNrRW50cnkgc2F2ZWRUb3BFbnRyeTsKLQlwcml2YXRlIGludCBzYXZlZFN0YWNrU2l6ZTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgcGF1c2VBZnRlckV4ZWN1dGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCwgSURNUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXApIHsKLQotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJdGhpcy5ncm91cFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5wYWdlR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCQl0aGlzLnJvb3RQYWdlR3JvdXAgPSByb290UGFnZUdyb3VwOwotCi0KLQkJUGFnZUdyb3VwRW50cnkgcm9vdFBhZ2VHcm91cEVudHJ5ID0gbmV3IFBhZ2VHcm91cEVudHJ5KHJvb3RQYWdlR3JvdXApOwotCQllbGVtZW50cyA9IGdldFBhZ2VHcm91cEV4dGVuc2lvbnMoKTsKLQkJZ3JvdXBUYWJsZS5wdXQodGhpcy5yb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHJvb3RQYWdlR3JvdXBFbnRyeSk7Ci0KLQkJaWYgKHRoaXMucm9vdFBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCS8vIEZpbmQgYWxsIHRoZSBwYWdlIGdyb3VwcyB0aGF0IGZvbGxvdyB0aGlzIHJvb3QgcGFnZSBncm91cC4KLQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHJvb3RQYWdlR3JvdXApOwotCQl9Ci0JfQotCi0JcHVibGljIFBhZ2VHcm91cE1hbmFnZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24sIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwKSB7Ci0JCXRoaXMocm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKSwgcm9vdFBhZ2VHcm91cCk7Ci0JCXRoaXMub3BlcmF0aW9uc1J1biA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcm9vdE9wZXJhdGlvbi5hZGRPcGVyYXRpb25MaXN0ZW5lcihuZXcgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgaW50IG5vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0RXhlY3V0aW9uVHlwZSgpKSB7Ci0JCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUk9MTEJBQ0sgOgotCQkJCQkJaWYgKGV2ZW50LmdldE9wZXJhdGlvblR5cGUoKSA9PSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVEKSB7Ci0JCQkJCQkJb3BlcmF0aW9uc1J1bi5yZW1vdmUoZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFIDoKLQkJCQkJCWlmIChldmVudC5nZXRPcGVyYXRpb25UeXBlKCkgPT0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCkgewotCQkJCQkJCW9wZXJhdGlvbnNSdW4uYWRkKGV2ZW50LmdldE9wZXJhdGlvbigpLmdldElEKCkpOwotCQkJCQkJCWlmIChudWxsICE9IHBhdXNlQWZ0ZXJFeGVjdXRpb24gJiYgZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKS5lcXVhbHMocGF1c2VBZnRlckV4ZWN1dGlvbikpIHsKLQkJCQkJCQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEdyb3VwQWZ0ZXIoU3RyaW5nIHBhZ2VHcm91cElELCBJRE1QYWdlR3JvdXAgcGFnZUluc2VydEdyb3VwKSB7Ci0JCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChwYWdlR3JvdXBJRCk7Ci0KLQkJaWYgKHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXBFbnRyeS5wYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRm9yd2FyZE9uZVBhZ2UoKSB7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJc2F2ZVN0YWNrSW5mbygpOwotCi0JCXRyeSB7Ci0JCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGMpOwotCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJvb3RPcGVyYXRpb24ucm9sbEJhY2sobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJCXBhZ2VGb3VuZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKHBhZ2VGb3VuZCA9PSBmYWxzZSkgewotCQkJLy8gSWYgd2UgbW92ZWQgZm9yd2FyZCBhbmQgdGhlcmUgd2Fzbid0IGEgcGFnZSB0aGVuIHdlIHdpbGwgcmVzdG9yZSB0aGUgc3RhY2suCi0JCQkvLyBOb3JtYWxseSwgdGhpcyB3b3VsZG4ndCBoYXBwZW4gc2luY2UgYSBjYWxsIHRvIGhhc05leHRQYWdlIHdvdWxkIGhhdmUgaW5kaWNhdGVkCi0JCQkvLyB0aGF0IHRoZXJlIHdhc24ndCBhIHBhZ2UuCi0JCQlyZXN0b3JlU3RhY2tJbmZvKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQmFja09uZVBhZ2UoKSB7Ci0JCWlmIChwYWdlR3JvdXBTdGFjay5lbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCi0JCS8vIFBvcCB0aGUgbGFzdCBwYWdlLgotCQlpZiAoIXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQuZW1wdHkoKSkKLQkJCXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQucG9wKCk7Ci0KLQkJLy8gTm93IGZpbmQgdGhlIHByZXZpb3VzIHBhZ2UuCi0JCWJvb2xlYW4gZm91bmRQcmV2aW91c1BhZ2UgPSBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpOwotCi0JCXdoaWxlICghZm91bmRQcmV2aW91c1BhZ2UgJiYgIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCWlmIChyb290T3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAodG9wRW50cnkucmFuT3BlcmF0aW9ucykgewotCQkJCQl0cnkgewotCQkJCQkJcm9vdE9wZXJhdGlvbi5yb2xsQmFjayhudWxsLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFnZUdyb3VwU3RhY2sucG9wKCk7Ci0KLQkJCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJCWZvdW5kUHJldmlvdXNQYWdlID0gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKTsKLQkJCQl0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJcGFnZUdyb3VwU3RhY2suY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBudWxsOwotCi0JCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQlpbnQgcGFnZUluZGV4ID0gdG9wRW50cnkuZ2V0VG9wUGFnZUluZGV4KCk7Ci0KLQkJCXBhZ2UgPSBwYWdlSW5kZXggPT0gLTEgPyBudWxsIDogKElXaXphcmRQYWdlKSB0b3BFbnRyeS5wYWdlR3JvdXBFbnRyeS5nZXRQYWdlcygpLmdldChwYWdlSW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGhhc011bGl0cGxlUGFnZXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNdWx0aXBsZVBhZ2VzKCkgewotCQlpZiAobnVsbCA9PSBoYXNNdWxpdHBsZVBhZ2VzKSB7Ci0JCQlpbnQgcGFnZUNvdW50ID0gMDsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VDb3VudCArPSByb290RW50cnkuZ2V0UGFnZXMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgcGFnZUNvdW50IDwgMiAmJiBpIDwgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpOyBpKyspIHsKLQkJCQlwYWdlQ291bnQgKz0gKChQYWdlR3JvdXBFbnRyeSkgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZ2V0KGkpKS5nZXRQYWdlcygpLnNpemUoKTsKLQkJCX0KLQkJCWhhc011bGl0cGxlUGFnZXMgPSBwYWdlQ291bnQgPiAxID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gaGFzTXVsaXRwbGVQYWdlcy5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0UGFnZSgpIHsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlzYXZlU3RhY2tJbmZvKCk7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKGZhbHNlKTsKLQkJcmVzdG9yZVN0YWNrSW5mbygpOwotCi0JCXJldHVybiBwYWdlRm91bmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kb0FsbEN1cnJlbnRPcGVyYXRpb25zKCkgewotCQl3aGlsZSAoIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCW1vdmVCYWNrT25lUGFnZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0UGFnZUdyb3VwRXh0ZW5zaW9ucygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRUxFTUVOVF9QQUdFX0dST1VQKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYWxsRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBhbGxFbGVtZW50c1tpXTsKLQkJCWlmIChFTEVNRU5UX1BBR0VfR1JPVVAuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB7IH0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKCF0b3BFbnRyeS5wYWdlc1JldHVybmVkLmVtcHR5KCkpIHsKLQkJCXRvcEVudHJ5LnBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhZ2VGb3VuZCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gcGFnZUZvdW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kTmV4dFBhZ2UoYm9vbGVhbiBydW5PcGVyYXRpb25zKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQlpbnQgbmV3UGFnZUluZGV4ID0gdG9wRW50cnkuZmluZE5leHRQYWdlSW5kZXgoKTsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlpZiAobmV3UGFnZUluZGV4ID09IC0xKSB7Ci0JCQkvLyBPdXIgcGFnZSBoYW5kbGVyIGRpZG4ndCBmaW5kIGEgcGFnZSBzbyB3ZSB3aWxsIHNlZSBpZiB0aGVyZSBpcyBhIHBhZ2UgZ3JvdXAgdGhhdAotCQkJLy8gZm9sbG93cyB0aGlzIHBhZ2UgZ3JvdXAgdGhhdCBjYW4gZmluZCBhIHBhZ2UuCi0JCQl0b3BFbnRyeS5wYWdlc0NvbXBsZXRlID0gdHJ1ZTsKLQotCQkJU3RhY2tFbnRyeSBuZXh0U3RhY2tFbnRyeSA9IGZpbmROZXh0UGFnZUdyb3VwKHBhZ2VHcm91cFN0YWNrKTsKLQotCQkJaWYgKG5leHRTdGFja0VudHJ5ICE9IG51bGwpIHsKLQkJCQlJRE1QYWdlR3JvdXAgcGFnZUdyb3VwID0gbmV4dFN0YWNrRW50cnkucGFnZUdyb3VwRW50cnkucGFnZUdyb3VwOwotCQkJCVN0cmluZyByZXF1aXJlc09wZXJhdGlvbnNJZCA9IHBhZ2VHcm91cC5nZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpOwotCi0JCQkJLy8gSWYgdGhpcyBncm91cCByZXF1aXJlcyBhbiBvcGVyYXRpb24gYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJ1bgotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBydW4gaXQuCi0JCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCAmJiBydW5PcGVyYXRpb25zICYmIHJlcXVpcmVzT3BlcmF0aW9uc0lkICE9IG51bGwgJiYgIW9wZXJhdGlvbnNSdW4uY29udGFpbnMocmVxdWlyZXNPcGVyYXRpb25zSWQpKSB7Ci0JCQkJCXBhdXNlQWZ0ZXJFeGVjdXRpb24gPSByZXF1aXJlc09wZXJhdGlvbnNJZDsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJc3RhdHVzID0gcm9vdE9wZXJhdGlvbi5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJbmV4dFN0YWNrRW50cnkucmFuT3BlcmF0aW9ucyA9IHRydWU7Ci0KLQkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCS8vIFRPRE8gbmVlZCBhIGJldHRlciBlcnJvciBmZWVkYmFjayBtZWNoYW5pc20gaGVyZS4KLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwYWdlR3JvdXBTdGFjay5wdXNoKG5leHRTdGFja0VudHJ5KTsKLQkJCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UocnVuT3BlcmF0aW9ucyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5ldyBwYWdlIGluIHRoZSBwYWdlIGhhbmRsZXIuCi0JCQlwYWdlRm91bmQgPSB0cnVlOwotCQkJdG9wRW50cnkucGFnZXNSZXR1cm5lZC5wdXNoKG5ldyBJbnRlZ2VyKG5ld1BhZ2VJbmRleCkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVN0YWNrSW5mbygpIHsKLQkJaWYgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlzYXZlZFRvcEVudHJ5ID0gbmV3IFN0YWNrRW50cnkoKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKSk7Ci0JCX0KLQkJc2F2ZWRTdGFja1NpemUgPSBwYWdlR3JvdXBTdGFjay5zaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVTdGFja0luZm8oKSB7Ci0JCWlmIChzYXZlZFN0YWNrU2l6ZSA9PSAwKSB7Ci0JCQlwYWdlR3JvdXBTdGFjay5yZW1vdmVBbGxFbGVtZW50cygpOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwU3RhY2suc2V0U2l6ZShzYXZlZFN0YWNrU2l6ZSAtIDEpOwotCQkJcGFnZUdyb3VwU3RhY2sucHVzaChzYXZlZFRvcEVudHJ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5kZWRQYWdlcyhJRE1QYWdlR3JvdXAgcGFnZUdyb3VwKSB7Ci0JCVN0cmluZyB3aXphcmRJZCA9IHJvb3RQYWdlR3JvdXAuZ2V0V2l6YXJkSUQoKTsKLQkJU3RyaW5nIHBhZ2VHcm91cElkID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCWludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJRE1QYWdlR3JvdXBFbGVtZW50SW1wbCBwYWdlSW5zZXJ0R3JvdXAgPSBuZXcgRE1QYWdlR3JvdXBFbGVtZW50SW1wbChlbGVtZW50c1tpbmRleF0pOwotCQkJU3RyaW5nIHBhZ2VJbnNlcnRHcm91cElkID0gcGFnZUluc2VydEdyb3VwLmdldFBhZ2VHcm91cEluc2VydGlvbklEKCk7Ci0JCQlpZiAocGFnZUluc2VydEdyb3VwLmdldFdpemFyZElEKCkuZXF1YWxzKHdpemFyZElkKSAmJiAobnVsbCA9PSBwYWdlSW5zZXJ0R3JvdXBJZCB8fCBwYWdlSW5zZXJ0R3JvdXBJZC5lcXVhbHMocGFnZUdyb3VwSWQpKSkgewotCQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0KLQkJCQkvLyBJZiB0aGlzIHBhZ2UgZ3JvdXAgaGFzIHBhZ2UgdGhlbiBhZGQgdGhlbQotCQkJCWlmIChwYWdlSW5zZXJ0R3JvdXAuZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpKSB7Ci0JCQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHBhZ2VJbnNlcnRHcm91cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBhZ2VHcm91cChJRE1QYWdlR3JvdXAgcGFnZUdyb3VwLCBJRE1QYWdlR3JvdXAgaW5zZXJ0ZWRQYWdlR3JvdXApIHsKLQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJUGFnZUdyb3VwRW50cnkgbmV4dEdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KGluc2VydGVkUGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCi0JCWlmIChwYWdlR3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQlwYWdlR3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShwYWdlR3JvdXApOwotCQkJZ3JvdXBUYWJsZS5wdXQocGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHBhZ2VHcm91cEVudHJ5KTsKLQkJfQotCi0JCWlmIChuZXh0R3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQluZXh0R3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShpbnNlcnRlZFBhZ2VHcm91cCk7Ci0JCQlncm91cFRhYmxlLnB1dChpbnNlcnRlZFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCBuZXh0R3JvdXBFbnRyeSk7Ci0JCX0KLQotCQlwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmFkZChuZXh0R3JvdXBFbnRyeSk7Ci0JfQotCi0JcHVibGljIFN0YWNrRW50cnkgZmluZE5leHRQYWdlR3JvdXAoU3RhY2sgc3RhY2spIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5wZWVrKCk7Ci0JCVBhZ2VHcm91cEVudHJ5IG5leHRQYWdlR3JvdXAgPSB0b3BFbnRyeS5nZXROZXh0UGFnZUdyb3VwKG51bGwpOwotCQlpbnQgcGFyZW50SW5kZXggPSB0b3BFbnRyeS5wYXJlbnRHcm91cEluZGV4OwotCQlpbnQgcHJldlBhcmVudEluZGV4ID0gc3RhY2suc2l6ZSgpIC0gMTsKLQotCQkvLyBSZWN1cnNlIHVwIHRocm91Z2ggdGhlIHBhcmVudHMgdG8gZmluZCB0aGUgbmV4dCBncm91cCBpZiBuZWVkZWQuCi0JCXdoaWxlIChwYXJlbnRJbmRleCAhPSAtMSAmJiBuZXh0UGFnZUdyb3VwID09IG51bGwpIHsKLQkJCVN0YWNrRW50cnkgcGFyZW50U3RhY2tFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5lbGVtZW50QXQocGFyZW50SW5kZXgpOwotCi0JCQluZXh0UGFnZUdyb3VwID0gcGFyZW50U3RhY2tFbnRyeS5nZXROZXh0UGFnZUdyb3VwKHRvcEVudHJ5LmdldElkKCkpOwotCQkJcHJldlBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7Ci0JCQlwYXJlbnRJbmRleCA9IHBhcmVudFN0YWNrRW50cnkucGFyZW50R3JvdXBJbmRleDsKLQkJCXRvcEVudHJ5ID0gcGFyZW50U3RhY2tFbnRyeTsKLQkJfQotCi0JCXJldHVybiBuZXh0UGFnZUdyb3VwID09IG51bGwgPyBudWxsIDogbmV3IFN0YWNrRW50cnkobmV4dFBhZ2VHcm91cCwgcHJldlBhcmVudEluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFN0YWNrRW50cnkgewotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnk7Ci0JCXB1YmxpYyBTdGFjayBwYWdlc1JldHVybmVkOyAvLyBFbGVtZW50ID0gSW50ZXJnZXIgb2YgcGFnZSBpbmRleGVzLgotCQlwdWJsaWMgYm9vbGVhbiBwYWdlc0NvbXBsZXRlOwotCQlwdWJsaWMgaW50IHBhcmVudEdyb3VwSW5kZXg7Ci0JCXB1YmxpYyBib29sZWFuIHJhbk9wZXJhdGlvbnM7Ci0KLQkJcHVibGljIFN0YWNrRW50cnkoUGFnZUdyb3VwRW50cnkgbmV3UGFnZUdyb3VwRW50cnksIGludCBwYXJlbnRJbmRleCkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBuZXdQYWdlR3JvdXBFbnRyeTsKLQkJCXBhZ2VzUmV0dXJuZWQgPSBuZXcgU3RhY2soKTsKLQkJCXBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBwYXJlbnRJbmRleDsKLQkJCXJhbk9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBTdGFja0VudHJ5KFN0YWNrRW50cnkgc3RhY2tFbnRyeSkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBzdGFja0VudHJ5LnBhZ2VHcm91cEVudHJ5OwotCQkJcGFnZXNSZXR1cm5lZCA9IG5ldyBTdGFjaygpOwotCQkJcGFnZXNDb21wbGV0ZSA9IHN0YWNrRW50cnkucGFnZXNDb21wbGV0ZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBzdGFja0VudHJ5LnBhcmVudEdyb3VwSW5kZXg7Ci0JCQlyYW5PcGVyYXRpb25zID0gc3RhY2tFbnRyeS5yYW5PcGVyYXRpb25zOwotCQkJcGFnZXNSZXR1cm5lZC5hZGRBbGwoc3RhY2tFbnRyeS5wYWdlc1JldHVybmVkKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gcGFnZUdyb3VwRW50cnkucGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGZpbmROZXh0UGFnZUluZGV4KCkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCQlpZiAoIXBhZ2VzQ29tcGxldGUpIHsKLQkJCQlMaXN0IHBhZ2VzID0gcGFnZUdyb3VwRW50cnkuZ2V0UGFnZXMoKTsKLQotCQkJCWludCBwYWdlSW5kZXggPSBnZXRUb3BQYWdlSW5kZXgoKTsKLQkJCQlTdHJpbmcgcGFnZUlkID0gcGFnZUluZGV4ID09IC0xID8gbnVsbCA6ICgoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChwYWdlSW5kZXgpKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGV4cGVjdGVkSWQgPSBwYWdlSW5kZXggKyAxID49IHBhZ2VzLnNpemUoKSA/IG51bGwgOiAoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4ICsgMSkpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmV3UGFnZUlkID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCW5ld1BhZ2VJZCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VIYW5kbGVyKCkuZ2V0TmV4dFBhZ2UocGFnZUlkLCBleHBlY3RlZElkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGMpOwotCQkJCX0KLQotCQkJCWlmIChuZXdQYWdlSWQgIT0gbnVsbCAmJiBuZXdQYWdlSWQuZXF1YWxzKElETVBhZ2VIYW5kbGVyLlNLSVBfUEFHRSkgJiYgcGFnZUluZGV4ID49IDAgJiYgcGFnZUluZGV4IDwgcGFnZXMuc2l6ZSgpIC0gMikgewotCQkJCQlyZXN1bHQgPSBwYWdlSW5kZXggKyAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHBhZ2VHcm91cEVudHJ5LmNoZWNrRm9yU3BlY2lhbElkcyhuZXdQYWdlSWQpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeSBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBhZnRlcklkKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSByZXN1bHQgPSBudWxsOwotCQkJU3RyaW5nIG5leHRHcm91cElEID0gbnVsbDsKLQkJCVN0cmluZ1tdIGdyb3VwSURMaXN0ID0gZ2V0R3JvdXBJRExpc3QoKTsKLQotCQkJdHJ5IHsKLQkJCQluZXh0R3JvdXBJRCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VHcm91cEhhbmRsZXIoKS5nZXROZXh0UGFnZUdyb3VwKGFmdGVySWQsIGdyb3VwSURMaXN0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjKTsKLQkJCX0KLQotCQkJaWYgKG5leHRHcm91cElEICE9IG51bGwpIHsKLQkJCQkvLyBGaW5kIHRoaXMgc3RyaW5nIGluIHRoZSBsaXN0LgotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBncm91cElETGlzdC5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJaWYgKGdyb3VwSURMaXN0W2luZGV4XS5lcXVhbHMobmV4dEdyb3VwSUQpKSB7Ci0JCQkJCQlyZXN1bHQgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZWxlbWVudEF0KGluZGV4KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBnZXRHcm91cElETGlzdCgpIHsKLQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5zaXplKCldOwotCi0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQlQYWdlR3JvdXBFbnRyeSBlbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5lbGVtZW50QXQoaW5kZXgpOwotCi0JCQkJcmVzdWx0W2luZGV4XSA9IGVudHJ5LnBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0VG9wUGFnZUluZGV4KCkgewotCQkJcmV0dXJuIHBhZ2VzUmV0dXJuZWQuZW1wdHkoKSA/IC0xIDogKChJbnRlZ2VyKSBwYWdlc1JldHVybmVkLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUGFnZUdyb3VwRW50cnkgewotCQlwdWJsaWMgSURNUGFnZUdyb3VwIHBhZ2VHcm91cDsKLQkJcHVibGljIFZlY3RvciBncm91cHNUaGF0Rm9sbG93OwotCQlwcml2YXRlIElETVBhZ2VIYW5kbGVyIHBhZ2VIYW5kbGVyOwotCQlwcml2YXRlIElETVBhZ2VHcm91cEhhbmRsZXIgcGFnZUdyb3VwSGFuZGxlcjsKLQkJcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeShJRE1QYWdlR3JvdXAgbmV3UGFnZUdyb3VwKSB7Ci0JCQlwYWdlR3JvdXAgPSBuZXdQYWdlR3JvdXA7Ci0JCQlncm91cHNUaGF0Rm9sbG93ID0gbmV3IFZlY3RvcigpOwotCQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcigpIHsKLQkJCWlmICghaW5pdGlhbGl6ZWQpCi0JCQkJaW5pdCgpOwotCi0JCQlyZXR1cm4gcGFnZUhhbmRsZXI7Ci0JCX0KLQotCQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBnZXRQYWdlR3JvdXBIYW5kbGVyKCkgewotCQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCQlpbml0KCk7Ci0KLQkJCXJldHVybiBwYWdlR3JvdXBIYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0UGFnZXMoKSB7Ci0JCQlpZiAoIWluaXRpYWxpemVkKQotCQkJCWluaXQoKTsKLQotCQkJcmV0dXJuIHBhZ2VHcm91cC5nZXRQYWdlcyhkYXRhTW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5KFBhZ2VHcm91cEVudHJ5IG9yaWdpbmFsRW50cnkpIHsKLQkJCXBhZ2VHcm91cCA9IG9yaWdpbmFsRW50cnkucGFnZUdyb3VwOwotCQkJZ3JvdXBzVGhhdEZvbGxvdyA9IG9yaWdpbmFsRW50cnkuZ3JvdXBzVGhhdEZvbGxvdzsKLQkJCXBhZ2VIYW5kbGVyID0gb3JpZ2luYWxFbnRyeS5wYWdlSGFuZGxlcjsKLQkJCXBhZ2VHcm91cEhhbmRsZXIgPSBvcmlnaW5hbEVudHJ5LnBhZ2VHcm91cEhhbmRsZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZUhhbmRsZXIgPSBwYWdlR3JvdXAuZ2V0UGFnZUhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCQlwYWdlR3JvdXBIYW5kbGVyID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjKTsKLQkJCX0KLQotCQkJaWYgKHBhZ2VIYW5kbGVyID09IG51bGwpCi0JCQkJcGFnZUhhbmRsZXIgPSBuZXcgU2ltcGxlUGFnZUhhbmRsZXIoKTsKLQotCQkJaWYgKHBhZ2VHcm91cEhhbmRsZXIgPT0gbnVsbCkKLQkJCQlwYWdlR3JvdXBIYW5kbGVyID0gbmV3IFNpbXBsZVBhZ2VHcm91cEhhbmRsZXIoKTsKLQotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgY2hlY2tGb3JTcGVjaWFsSWRzKFN0cmluZyBwYWdlSWQpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJTGlzdCBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0KLQkJCWlmIChwYWdlcy5pc0VtcHR5KCkgfHwgcGFnZUlkID09IG51bGwpCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAocGFnZUlkLnN0YXJ0c1dpdGgoSURNUGFnZUhhbmRsZXIuUEFHRV9BRlRFUikpIHsKLQkJCQlTdHJpbmcgYWZ0ZXJJRCA9IHBhZ2VJZC5zdWJzdHJpbmcoSURNUGFnZUhhbmRsZXIuUEFHRV9BRlRFUi5sZW5ndGgoKSwgcGFnZUlkLmxlbmd0aCgpKTsKLQkJCQlyZXN1bHQgPSBnZXRJbmRleE9mKGFmdGVySUQpOwotCQkJCXJlc3VsdCA9IHJlc3VsdCA+PSAwICYmIHJlc3VsdCA8IHBhZ2VzLnNpemUoKSAtIDEgPyByZXN1bHQgKyAxIDogLTE7Ci0JCQl9IGVsc2UgaWYgKHBhZ2VJZC5zdGFydHNXaXRoKElETVBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFKSkgewotCQkJCVN0cmluZyBiZWZvcmVJRCA9IHBhZ2VJZC5zdWJzdHJpbmcoSURNUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUubGVuZ3RoKCksIHBhZ2VJZC5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihiZWZvcmVJRCk7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0ID49IDEgJiYgcmVzdWx0IDwgcGFnZXMuc2l6ZSgpID8gcmVzdWx0IC0gMSA6IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRJbmRleE9mKHBhZ2VJZCk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRJbmRleE9mKFN0cmluZyBwYWdlSWQpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJTGlzdCBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJaWYgKCgoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChpbmRleCkpLmdldE5hbWUoKS5lcXVhbHMocGFnZUlkKSkgewotCQkJCQlyZXN1bHQgPSBpbmRleDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJCXJldHVybiBpbml0aWFsaXplZDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKERhdGFNb2RlbFdpemFyZCB3aXphcmQpIHsKLQkJSXRlcmF0b3IgcGFnZUdyb3VwcyA9IGdyb3VwVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHBhZ2VHcm91cHMuaGFzTmV4dCgpKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSBwYWdlR3JvdXAgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cHMubmV4dCgpOwotCQkJaWYgKHBhZ2VHcm91cC5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlJdGVyYXRvciBwYWdlcyA9IHBhZ2VHcm91cC5nZXRQYWdlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBhZ2VzLmhhc05leHQoKSkgewotCQkJCQlJV2l6YXJkUGFnZSBwYWdlID0gKElXaXphcmRQYWdlKSBwYWdlcy5uZXh0KCk7Ci0JCQkJCXdpemFyZC5zdG9yZURlZmF1bHRTZXR0aW5ncyhwYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlT3BlcmF0aW9uV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyNjAwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlT3BlcmF0aW9uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBJVW5kb2FibGVPcGVyYXRpb24gdW5kb2FibGVPcGVyYXRpb247Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCXB1YmxpYyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIoSVVuZG9hYmxlT3BlcmF0aW9uIHVuZG9hYmxlT3BlcmF0aW9uKSB7Ci0JCXRoaXMudW5kb2FibGVPcGVyYXRpb24gPSB1bmRvYWJsZU9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJc3RhdHVzID0gdW5kb2FibGVPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGYzOTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBvdXIgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgdG8gdGhlIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gVGhpcyBjbGFzcwotICogbmVlZHMgdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBmcm9tIGEgSVJ1bm5hYmxlQ29udGV4dC4KLSAqIAotICogQHNlZSBJUnVubmFibGVDb250ZXh0Ci0gKiBAc2VlIEphdmFVSVBsdWdpbiNnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyODo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGhlYWRsZXNzUnVubmFibGU7Ci0KLQkvKioKLQkgKiBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXNldEhlYWRsZXNzUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjk6NTIgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0SGVhZGxlc3NSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIGhlYWRsZXNzUnVubmFibGU7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGlzIG9wZXJhdGlvbi4gUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLiBUaGlzIG1ldGhvZAotCSAqIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QsIHdoaWNoCi0JICogc3VwcGxpZXMgdGhlIHByb2dyZXNzIG1vbml0b3IuIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQKLQkgKiBhY2tub3dsZWRnZWQgYnkgdGhyb3dpbmcgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZSByZXF1ZXN0cyBmb3IKLQkgKiAgICAgICAgICAgIGNhbmNlbGF0aW9uCi0JICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlCi0JICogICAgICAgICAgICAgICAgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUKLQkgKiAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlCi0JICogICAgICAgICAgICAgICAgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCB1c2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlnZXRIZWFkbGVzc1J1bm5hYmxlKCkucnVuKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjk6NTIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0hlYWRsZXNzUnVubmFibGUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEhlYWRsZXNzUnVubmFibGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmV3SGVhZGxlc3NSdW5uYWJsZSkgewotCQloZWFkbGVzc1J1bm5hYmxlID0gbmV3SGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2F2ZUhhbmRsZXJVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE2MjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2F2ZUhhbmRsZXJVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklTYXZlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJVSSBpbXBsZW1lbnRzIElTYXZlSGFuZGxlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9GQUlMRUQgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjE2Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTk5JTkdfTUVTU0FHRSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMTciKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBib29sZWFuIGlzWWVzVG9BbGwgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgaW50IHJlZmVyZW5jZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFNhdmVIYW5kbGVyVUkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUhhbmRsZXJVSSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2Nlc3MgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKCkgewotCQlyZWZlcmVuY2VDb3VudCsrOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpIHsKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlEaXNwbGF5IHJlc3VsdCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBEaXNwbGF5LmdldERlZmF1bHQoKSA6IHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVmZXJlbmNlQ291bnQgPiAxKQotCQkJLy9MZXQgdGhlIG91dGVybW9zdCByZWZlcmVuY2UgaGFuZGxlIGl0Ci0JCQl0aHJvdyBleDsKLQkJU3RyaW5nIGV4TXNnID0gZXguZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCkgPT0gbnVsbCA/IGV4LmdldE1lc3NhZ2UoKSA6IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBCRUdJTk5JTkdfTUVTU0FHRSArICI6XG4iICsgZXhNc2c7Ly8kTk9OLU5MUy0xJAotCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFBhcmVudFNoZWxsRm9yRGlhbG9nKCksIFNBVkVfRkFJTEVELCBtZXNzYWdlKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQllbHNlCi0JCQl0aHJvdyBleDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRVc2VyVG9TYXZlUmVhZE9ubHkoSUZpbGUgYUZpbGUpIHsKLQotCQlTdHJpbmdbXSBidXR0b25TdHJpbmdzID0ge1dUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiWWVzX1VJXyIpLCBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlllc19Ub19BbGxfVUlfIiksIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiTm9fVUlfIil9OyAvLyROT04tTkxTLTMkID0gIk5vIiAvLyROT04tTkxTLTIkID0gIlllcyBUbyBBbGwiIC8vJE5PTi1OTFMtMSQgPSAiWWVzIgotCQlTdHJpbmcgdGl0bGUgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlNhdmluZ19SZWFkLU9ubHlfRmlsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTYXZpbmcgUmVhZC1Pbmx5IEZpbGUiCi0JCVN0cmluZyBtZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIyY29uY2F0X0lORk9fIiwgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRGdWxsUGF0aCgpfSkpOyAvLyROT04tTkxTLTEkID0gIlRoZSBmaWxlIHswfSBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzYXZlZC4gIFdvdWxkIHlvdSBsaWtlIHRvIG1ha2UgaXQgZWRpdGFibGUgYW5kIHNhdmUgYW55d2F5PyIKLQotCQlmaW5hbCBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFBhcmVudFNoZWxsRm9yRGlhbG9nKCksIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uU3RyaW5ncywgMCk7IC8vIFllcyBpcyB0aGUgZGVmYXVsdAotCi0JCWZpbmFsIGludFtdIHJldCA9IG5ldyBpbnRbMV07Ci0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCXJldFswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN3aXRjaCAocmV0WzBdKSB7Ci0JCQljYXNlIDAgOiB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQljYXNlIDEgOiB7Ci0JCQkJaXNZZXNUb0FsbCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQljYXNlIDIgOiB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiByZWxlYXNlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChyZWZlcmVuY2VDb3VudCA9PSAwKQotCQkJaXNZZXNUb0FsbCA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSkgewotCQlib29sZWFuIHllcyA9IGlzWWVzVG9BbGwgfHwgcHJvbXB0VXNlclRvU2F2ZVJlYWRPbmx5KGFGaWxlKTsKLQkJaWYgKHllcykKLQkJCWFGaWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHllczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VHcm91cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ZWU1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VHcm91cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUdyb3VwSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VHcm91cEhhbmRsZXIgewotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cChTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMpIHsKLQkJaWYgKHBhZ2VHcm91cElEcyA9PSBudWxsIHx8IHBhZ2VHcm91cElEcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkKLQkJCXJldHVybiBwYWdlR3JvdXBJRHNbMF07Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VHcm91cElEcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmIChwYWdlR3JvdXBJRHNbaW5kZXhdLmVxdWFscyhjdXJyZW50UGFnZUdyb3VwSUQpKSB7Ci0JCQkJLy8gV2UgZm91bmQgdGhlIGN1cnJlbnRQYWdlR3JvdXBJRCwgc28gd2Ugd2FudCB0byByZXR1cm4gdGhlIG5leHQgb25lIGluIHRoZQotCQkJCS8vIGFycmF5IGlmIHRoZXJlIGlzIG9uZS4KLQkJCQlpZiAoaW5kZXggKyAxIDwgcGFnZUdyb3VwSURzLmxlbmd0aCkgewotCQkJCQlyZXN1bHQgPSBwYWdlR3JvdXBJRHNbaW5kZXggKyAxXTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGIzOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlcgotewotICBwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgCi0gIHsKLSAgICByZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSAKLSAgewotCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWJiNTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3M7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkgZXh0ZW5kcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MgaW1wbGVtZW50cyBJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXRJbXBsKGZpbmFsIElGaWxlW10gZmlsZXNUb1ZhbGlkYXRlKSB7Ci0JCWZpbmFsIElTdGF0dXMgW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdGF0dXNbMF0gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzVG9WYWxpZGF0ZSwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzYzdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMzAvMjAwMSA0OjAwOjI4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lZEtleUxpc3RlbmVyIGV4dGVuZHMgVGltZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgV2lkZ2V0IG1vbml0b3JpbmdUYXJnZXQ7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRV9MSU1JVCA9IDIwMDsKLQotCS8qKgotCSAqIEoyRUVUaW1lZEtleUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkS2V5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCQlzZXRSZXBlYXRzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzMwLzIwMDEgNDo0MzozMyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgVGltZWRLZXlMaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKFRJTUVfTElNSVQsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcHJlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhIGtleSBpcyByZWxlYXNlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcmVsZWFzZQotCSAqLwotCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCQkvLyBSZXBsYWNlZCB3aXRoIFNXVC5Nb2RpZnkgLS0gc2VlIG1vZGlmeVRleHQoKSBpbiB0aGlzIGNsYXNzCi0JCS8vICAgICAgICBtb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJLy8gICAgICAgIHJlc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvd24oTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VVcChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUVudGVyKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlRXhpdChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlSG92ZXIoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLnV0aWwuVGltZXIjZ2V0U291cmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1vbml0b3JpbmdUYXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCXJlc3RhcnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwNDVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgSjJFRVRpbWVkS2V5TGlzdGVuZXIgYnV0IHVzaW5nIHRoZSBNb2RpZnkgU1dUIGV2ZW50Ci0gKiBpbnN0ZWFkIG9mIHRoZSBLZXlVcC4gQ3JlYXRpb24gZGF0ZTogKDkvMTAvMjAwMSAxMTo0Njo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotcHVibGljIGNsYXNzIFRpbWVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBUaW1lZEtleUxpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkTW9kaWZ5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZE1vZGlmeUxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIFJlL1N0YXJ0IHRoZSB0aW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMTFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLQotcHVibGljIGNsYXNzIFRpbWVyIHsKLQkvKioKLQkgKiBEb1Bvc3RFdmVudCBpcyBhIHJ1bm5hYmxlIGNsYXNzIHRoYXQgZmlyZXMgYWN0aW9uRXZlbnRzIHRvIHRoZSBsaXN0ZW5lcnMgb24gdGhlCi0JICogRXZlbnREaXNwYXRjaFRocmVhZCwgdmlhIGludm9rZUxhdGVyLgotCSAqIAotCSAqIEBzZWUgI3Bvc3QKLQkgKi8KLQljbGFzcyBEb1Bvc3RFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGV2ZW50UXVldWVkKSB7Ci0JCQkJZmlyZUFjdGlvblBlcmZvcm1lZChuZXcgQWN0aW9uRXZlbnQoZ2V0U291cmNlKCksIDAsIG51bGwpKTsKLQkJCQljYW5jZWxFdmVudCgpOwotCQkJfQotCQl9Ci0KLQkJVGltZXIgZ2V0VGltZXIoKSB7Ci0JCQlyZXR1cm4gVGltZXIudGhpczsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCWJvb2xlYW4gZXZlbnRRdWV1ZWQgPSBmYWxzZTsKLQlpbnQgaW5pdGlhbERlbGF5LCBkZWxheTsKLQlib29sZWFuIHJlcGVhdHMgPSB0cnVlLCBjb2FsZXNjZSA9IHRydWU7Ci0JcHJpdmF0ZSBSdW5uYWJsZSBkb1Bvc3RFdmVudDsKLQkvLyBUaGVzZSBmaWVsZHMgYXJlIG1haW50YWluZWQgYnkgVGltZXJRdWV1ZS4KLQkvLyBldmVudFF1ZXVlZCBjYW4gYWxzbyBiZSByZXNldCBieSB0aGUgVGltZXJRdWV1ZSwgYnV0IHdpbGwgb25seSBldmVyCi0JLy8gaGFwcGVuIGluIGFwcGxldCBjYXNlIHdoZW4gVGltZXJRdWV1ZXMgdGhyZWFkIGlzIGRlc3Ryb3llZC4KLQlsb25nIGV4cGlyYXRpb25UaW1lOwotCVRpbWVyIG5leHRUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgVGltZXIgdGhhdCB3aWxsIG5vdGlmeSBpdHMgbGlzdGVuZXJzIGV2ZXJ5IDxpPmRlbGF5IDwvaT4gbWlsbGlzZWNvbmRzLgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBsaXN0ZW5lciBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEFuIGluaXRpYWwgbGlzdGVuZXIKLQkgKiBAc2VlICNzZXRJbml0aWFsRGVsYXkKLQkgKiBAc2VlICNzZXRSZXBlYXRzCi0JICovCi0JcHVibGljIFRpbWVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCQl0aGlzLmluaXRpYWxEZWxheSA9IGRlbGF5OwotCi0JCWRvUG9zdEV2ZW50ID0gbmV3IERvUG9zdEV2ZW50KCk7Ci0KLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gYWN0aW9uTGlzdGVuZXIgdG8gdGhlIFRpbWVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgY2FuY2VsRXZlbnQoKSB7Ci0JCWV2ZW50UXVldWVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgaW50ZXJlc3QgZm9yIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGV2ZW50IHR5cGUuIFRoZQotCSAqIGV2ZW50IGluc3RhbmNlIGlzIGxhemlseSBjcmVhdGVkIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbnRvIHRoZSBmaXJlIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIEV2ZW50TGlzdGVuZXJMaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCS8vIEd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJQWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0KLQkJLy8gUHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJbGlzdGVuZXJzW2ldLmFjdGlvblBlcmZvcm1lZChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRpbWVyJ3MgZGVsYXkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlbGF5KCkgewotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVGltZXIncyBpbml0aWFsIGRlbGF5LgotCSAqIAotCSAqIEBzZWUgI3NldERlbGF5Ci0JICovCi0JcHVibGljIGludCBnZXRJbml0aWFsRGVsYXkoKSB7Ci0JCXJldHVybiBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Yj50cnVlIDwvYj4gaWYgdGhlIFRpbWVyIGNvYWxlc2NlcyBtdWx0aXBsZSBwZW5kaW5nIDxiPnBlcmZvcm1Db21tYW5kKCkgPC9iPgotCSAqIG1lc3NhZ2VzLgotCSAqIAotCSAqIEBzZWUgI3NldENvYWxlc2NlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2FsZXNjZSgpIHsKLQkJcmV0dXJuIGNvYWxlc2NlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciB3aWxsIHNlbmQgYSA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2UgdG8gaXRzCi0JICogbGlzdGVuZXJzIG11bHRpcGxlIHRpbWVzLgotCSAqIAotCSAqIEBzZWUgI3NldFJlcGVhdHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdHMoKSB7Ci0JCXJldHVybiByZXBlYXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciBpcyBydW5uaW5nLgotCSAqIAotCSAqIEBzZWUgI3N0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlyZXR1cm4gdGltZXJRdWV1ZSgpLmNvbnRhaW5zVGltZXIodGhpcyk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgcG9zdCgpIHsKLQkJaWYgKCFldmVudFF1ZXVlZCkgewotCQkJZXZlbnRRdWV1ZWQgPSB0cnVlOwotCQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKGRvUG9zdEV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gQWN0aW9uTGlzdGVuZXIgZnJvbSB0aGUgVGltZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVzdGFydHMgYSBUaW1lciwgY2FuY2VsaW5nIGFueSBwZW5kaW5nIGZpcmluZ3MsIGFuZCBjYXVzaW5nIGl0IHRvIGZpcmUgd2l0aCBpdHMgaW5pdGlhbAotCSAqIGRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydCgpIHsKLQkJc3RvcCgpOwotCQlzdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgVGltZXIgY29hbGVzY2VzIG11bHRpcGxlIHBlbmRpbmcgQWN0aW9uRXZlbnQgZmlyaW5ncy4gQSBidXN5IGFwcGxpY2F0aW9uIG1heQotCSAqIG5vdCBiZSBhYmxlIHRvIGtlZXAgdXAgd2l0aCBhIFRpbWVyJ3MgbWVzc2FnZSBnZW5lcmF0aW9uLCBjYXVzaW5nIG11bHRpcGxlCi0JICogPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlIHNlbmRzIHRvIGJlIHF1ZXVlZC4gV2hlbiBwcm9jZXNzZWQsIHRoZSBhcHBsaWNhdGlvbiBzZW5kcwotCSAqIHRoZXNlIG1lc3NhZ2VzIG9uZSBhZnRlciB0aGUgb3RoZXIsIGNhdXNpbmcgdGhlIFRpbWVyJ3MgbGlzdGVuZXJzIHRvIHJlY2VpdmUgYSBzZXF1ZW5jZSBvZgotCSAqIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgd2l0aCBubyBkZWxheSBiZXR3ZWVuIHRoZW0uIENvYWxlc2NpbmcgYXZvaWRzIHRoaXMKLQkgKiBzaXR1YXRpb24gYnkgcmVkdWNpbmcgbXVsdGlwbGUgcGVuZGluZyBtZXNzYWdlcyB0byBhIHNpbmdsZSBtZXNzYWdlIHNlbmQuIFRpbWVycyBjb2FsZXNjZQotCSAqIHRoZWlyIG1lc3NhZ2Ugc2VuZHMgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2FsZXNjZShib29sZWFuIGZsYWcpIHsKLQkJY29hbGVzY2UgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgZGVsYXksIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSA8Yj5hY3Rpb25QZXJmb21lZCgpCi0JICogPC9iPiBtZXNzYWdlcyB0byBpdHMgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSAjc2V0SW5pdGlhbERlbGF5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsYXkoaW50IGRlbGF5KSB7Ci0JCWlmIChkZWxheSA8IDApIHsKLQkJCVN0cmluZyBtc2cgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuVGltZXJfVUlfMCwgbmV3IE9iamVjdFtde0ludGVnZXIudG9TdHJpbmcoZGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgaW5pdGlhbCBkZWxheS4gVGhpcyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBmaXJzdCAicmluZ2luZyIgb2YgdGhlIFRpbWVyIG9ubHkuCi0JICogU3Vic2VxdWVudCByaW5naW5ncyB3aWxsIGJlIHNwYWNlZCB1c2luZyB0aGUgZGVsYXkgcHJvcGVydHkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGVsYXkoaW50IGluaXRpYWxEZWxheSkgewotCQlpZiAoaW5pdGlhbERlbGF5IDwgMCkgewotCQkJU3RyaW5nIG1zZyA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5UaW1lcl9VSV8xLCBuZXcgT2JqZWN0W117SW50ZWdlci50b1N0cmluZyhpbml0aWFsRGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsRGVsYXkgPSBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogSWYgPGI+ZmxhZyA8L2I+IGlzIDxiPmZhbHNlIDwvYj4sIGluc3RydWN0cyB0aGUgVGltZXIgdG8gc2VuZCA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IHRvCi0JICogaXRzIGxpc3RlbmVycyBvbmx5IG9uY2UsIGFuZCB0aGVuIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwZWF0cyhib29sZWFuIGZsYWcpIHsKLQkJcmVwZWF0cyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSBUaW1lciwgY2F1c2luZyBpdCB0byBzZW5kIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgdG8gaXRzIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAc2VlICNzdG9wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRpbWVyUXVldWUoKS5hZGRUaW1lcih0aGlzLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGdldEluaXRpYWxEZWxheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBhIFRpbWVyLCBjYXVzaW5nIGl0IHRvIHN0b3Agc2VuZGluZyA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2VzIHRvIGl0cyBUYXJnZXQuCi0JICogCi0JICogQHNlZSAjc3RhcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aW1lclF1ZXVlKCkucmVtb3ZlVGltZXIodGhpcyk7Ci0JCWNhbmNlbEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZXIgcXVldWUuCi0JICovCi0JVGltZXJRdWV1ZSB0aW1lclF1ZXVlKCkgewotCQlyZXR1cm4gVGltZXJRdWV1ZS5zaW5nbGV0b24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmb3IgdGhlIEFjdGlvbkV2ZW50IHRoYXQgaXMgZmlyZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyUXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ0MmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi0KLWNsYXNzIFRpbWVyUXVldWUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b247Ci0JVGltZXIgZmlyc3RUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IGNsYXNzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUaW1lclF1ZXVlLgotCSAqLwotCXB1YmxpYyBUaW1lclF1ZXVlKCkgewotCQlzdXBlcigpOwotCi0JCS8vIE5vdyBzdGFydCB0aGUgVGltZXJRdWV1ZSB0aHJlYWQuCi0JCXN0YXJ0KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkVGltZXIoVGltZXIgdGltZXIsIGxvbmcgZXhwaXJhdGlvblRpbWUpIHsKLQkJVGltZXIgcHJldmlvdXNUaW1lcjsKLQkJVGltZXIgbmV4dFRpbWVyOwotCi0JCS8vIElmIHRoZSBUaW1lciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgdGhlbiBpZ25vcmUgdGhlIGFkZC4KLQkJaWYgKHRpbWVyLnJ1bm5pbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZXZpb3VzVGltZXIgPSBudWxsOwotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCi0JCS8vIEluc2VydCB0aGUgVGltZXIgaW50byB0aGUgbGlua2VkIGxpc3QgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbAotCQkvLyBleHBpcmUuIElmIHR3byB0aW1lcnMgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUsIHB1dCB0aGUgbmV3ZXIgZW50cnkKLQkJLy8gbGF0ZXIgc28gdGhleSBleHBpcmUgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbi4KLQotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWlmIChuZXh0VGltZXIuZXhwaXJhdGlvblRpbWUgPiBleHBpcmF0aW9uVGltZSkKLQkJCQlicmVhazsKLQotCQkJcHJldmlvdXNUaW1lciA9IG5leHRUaW1lcjsKLQkJCW5leHRUaW1lciA9IG5leHRUaW1lci5uZXh0VGltZXI7Ci0JCX0KLQotCQlpZiAocHJldmlvdXNUaW1lciA9PSBudWxsKSB7Ci0JCQlmaXJzdFRpbWVyID0gdGltZXI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2aW91c1RpbWVyLm5leHRUaW1lciA9IHRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLQkJdGltZXIubmV4dFRpbWVyID0gbmV4dFRpbWVyOwotCQl0aW1lci5ydW5uaW5nID0gdHJ1ZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNUaW1lcihUaW1lciB0aW1lcikgewotCQlyZXR1cm4gdGltZXIucnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYSB0b24gb2YgdGltZXJzLCB0aGlzIG1ldGhvZCBtYXkgbmV2ZXIgcmV0dXJuLiBJdCBsb29wcyBjaGVja2luZyB0byBzZWUgaWYgdGhlCi0JICogaGVhZCBvZiB0aGUgVGltZXIgbGlzdCBoYXMgZXhwaXJlZC4gSWYgaXQgaGFzLCBpdCBwb3N0cyB0aGUgVGltZXIgYW5kIHJlc2NoZWR1bGVzIGl0IGlmCi0JICogbmVjZXNzYXJ5LgotCSAqLwotCXN5bmNocm9uaXplZCBsb25nIHBvc3RFeHBpcmVkVGltZXJzKCkgewotCQlUaW1lciB0aW1lcjsKLQkJbG9uZyBjdXJyZW50VGltZTsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCS8vIFRoZSB0aW1lVG9XYWl0IHdlIHJldHVybiBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUgYW5kIG9ubHkgYmUgemVybwotCQkvLyB3aGVuIHdlIGhhdmUgbm8gVGltZXJzIHRvIHdhaXQgZm9yLgotCi0JCWRvIHsKLQkJCXRpbWVyID0gZmlyc3RUaW1lcjsKLQkJCWlmICh0aW1lciA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCi0JCQljdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJdGltZVRvV2FpdCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lIC0gY3VycmVudFRpbWU7Ci0KLQkJCWlmICh0aW1lVG9XYWl0IDw9IDApIHsKLQkJCQl0cnkgewotCQkJCQl0aW1lci5wb3N0KCk7IC8vIGhhdmUgdGltZXIgcG9zdCBhbiBldmVudAotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHF1ZXVlCi0JCQkJcmVtb3ZlVGltZXIodGltZXIpOwotCi0JCQkJLy8gVGhpcyB0cmllcyB0byBrZWVwIHRoZSBpbnRlcnZhbCB1bmlmb3JtIGF0Ci0JCQkJLy8gdGhlIGNvc3Qgb2YgZHJpZnQuCi0JCQkJaWYgKHRpbWVyLmlzUmVwZWF0cygpKSB7Ci0JCQkJCWFkZFRpbWVyKHRpbWVyLCBjdXJyZW50VGltZSArIHRpbWVyLmdldERlbGF5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQWxsb3cgb3RoZXIgdGhyZWFkcyB0byBjYWxsIGFkZFRpbWVyKCkgYW5kIHJlbW92ZVRpbWVyKCkKLQkJCS8vIGV2ZW4gd2hlbiB3ZSBhcmUgcG9zdGluZyBUaW1lcnMgbGlrZSBtYWQuIFNpbmNlIHRoZSB3YWl0KCkKLQkJCS8vIHJlbGVhc2VzIHRoZSBsb2NrLCBiZSBzdXJlIG5vdCB0byBtYWludGFpbiBhbnkgc3RhdGUKLQkJCS8vIGJldHdlZW4gaXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KLQotCQkJdHJ5IHsKLQkJCQl3YWl0KDEpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IHdoaWxlICh0aW1lVG9XYWl0IDw9IDApOwotCi0JCXJldHVybiB0aW1lVG9XYWl0OwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRpbWVyKFRpbWVyIHRpbWVyKSB7Ci0JCVRpbWVyIHByZXZpb3VzVGltZXI7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQkJYm9vbGVhbiBmb3VuZDsKLQotCQlpZiAoIXRpbWVyLnJ1bm5pbmcpCi0JCQlyZXR1cm47Ci0KLQkJcHJldmlvdXNUaW1lciA9IG51bGw7Ci0JCW5leHRUaW1lciA9IGZpcnN0VGltZXI7Ci0JCWZvdW5kID0gZmFsc2U7Ci0KLQkJd2hpbGUgKG5leHRUaW1lciAhPSBudWxsKSB7Ci0JCQlpZiAobmV4dFRpbWVyID09IHRpbWVyKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwcmV2aW91c1RpbWVyID0gbmV4dFRpbWVyOwotCQkJbmV4dFRpbWVyID0gbmV4dFRpbWVyLm5leHRUaW1lcjsKLQkJfQotCi0JCWlmICghZm91bmQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHByZXZpb3VzVGltZXIgPT0gbnVsbCkgewotCQkJZmlyc3RUaW1lciA9IHRpbWVyLm5leHRUaW1lcjsKLQkJfSBlbHNlIHsKLQkJCXByZXZpb3VzVGltZXIubmV4dFRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSAwOwotCQl0aW1lci5uZXh0VGltZXIgPSBudWxsOwotCQl0aW1lci5ydW5uaW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCXRyeSB7Ci0JCQl3aGlsZSAocnVubmluZykgewotCQkJCXRpbWVUb1dhaXQgPSBwb3N0RXhwaXJlZFRpbWVycygpOwotCQkJCXRyeSB7Ci0JCQkJCXdhaXQodGltZVRvV2FpdCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyZWFkRGVhdGggdGQpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJCS8vIE1hcmsgYWxsIHRoZSB0aW1lcnMgd2UgY29udGFpbiBhcyBub3QgYmVpbmcgcXVldWVkLgotCQkJVGltZXIgdGltZXIgPSBmaXJzdFRpbWVyOwotCQkJd2hpbGUgKHRpbWVyICE9IG51bGwpIHsKLQkJCQl0aW1lci5ldmVudFF1ZXVlZCA9IGZhbHNlOwotCQkJCXRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQkJfQotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKCF0aGlzLnJ1bm5pbmcpCi0JCQkJCXN0YXJ0KCk7Ci0JCQl9Ci0JCQl0aHJvdyB0ZDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXN5bmNocm9uaXplZCAoY2xhc3NMb2NrKSB7Ci0JCQkJc2luZ2xldG9uID0gbmV3IFRpbWVyUXVldWUoKTsKLQkJCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHJ1bm5pbmcpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLlRpbWVyUXVldWVfRVJST1JfMCk7Ci0JCX0KLQkJVGhyZWFkIHRpbWVyVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiVGltZXJRdWV1ZSIpOy8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXRpbWVyVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRpbWVyVGhyZWFkLnN0YXJ0KCk7Ci0JCXJ1bm5pbmcgPSB0cnVlOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXJ1bm5pbmcgPSBmYWxzZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWY7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQotCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlRpbWVyUXVldWUgKCIpOy8vJE5PTi1OTFMtMSQKLQotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWJ1Zi5hcHBlbmQobmV4dFRpbWVyLnRvU3RyaW5nKCkpOwotCi0JCQluZXh0VGltZXIgPSBuZXh0VGltZXIubmV4dFRpbWVyOwotCQkJaWYgKG5leHRUaW1lciAhPSBudWxsKQotCQkJCWJ1Zi5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2U1NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRNYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1jbGFzcyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyIGV4dGVuZHMgRW5hYmxlbWVudElkZW50aWZpZXIgaW1wbGVtZW50cyBJSWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByaXZhdGUgSUlkZW50aWZpZXIgYWN0aXZpdHlJZGVudGlmaWVyOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgVUlFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoaWQsIHByb2plY3QpOwotCQlJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJYWN0aXZpdHlJZGVudGlmaWVyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihpZCk7Ci0JCQlhY3Rpdml0eUlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoSWRlbnRpZmllckV2ZW50IGlkZW50aWZpZXJFdmVudCkgewotCQlib29sZWFuIGVuYWJsZWRDaGFuZ2VkID0gcmVzZXRFbmFibGVkKCk7Ci0JCUVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0ID0gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQodGhpcywgZmFsc2UsIGVuYWJsZWRDaGFuZ2VkKTsKLQkJZmlyZUlkZW50aWZpZXJDaGFuZ2VkKGV2dCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKChVSUVuYWJsZW1lbnRNYW5hZ2VyKSBJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlzcGUud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXIjZ2V0TmV3RW5hYmxlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TmV3RW5hYmxlZCgpIHsKLQkJSUlkZW50aWZpZXIgaWRlbnRpZmllciA9IGdldEFjdGl2aXR5SWRlbnRpZmllcigpOwotCQlpZiAoaWRlbnRpZmllciAhPSBudWxsKQotCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCkgJiYgc3VwZXIuZ2V0TmV3RW5hYmxlZCgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIElJZGVudGlmaWVyIGdldEFjdGl2aXR5SWRlbnRpZmllcigpIHsKLQkJaWYgKGFjdGl2aXR5SWRlbnRpZmllciA9PSBudWxsKXsKLQkJCUlBY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IGdldEFjdGl2aXR5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWFjdGl2aXR5SWRlbnRpZmllciA9IGdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoZ2V0SWQoKSk7Ci0JCQkJYWN0aXZpdHlJZGVudGlmaWVyLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlJZGVudGlmaWVyOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Mjc0MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVUlFbmFibGVtZW50TWFuYWdlciBleHRlbmRzIEVuYWJsZW1lbnRNYW5hZ2VyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBhY3Rpdml0eVN1cHBvcnQgPSBudWxsOwotCi0JcHVibGljIFVJRW5hYmxlbWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlpZiAoZ2V0QWN0aXZpdHlTdXBwb3J0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3Rpdml0eVN1cHBvcnQuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgZ2V0QWN0aXZpdHlTdXBwb3J0KCkgewotCQlpZiAoYWN0aXZpdHlTdXBwb3J0ID09IG51bGwpCi0JCQlhY3Rpdml0eVN1cHBvcnQgPSBpbml0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCXJldHVybiBhY3Rpdml0eVN1cHBvcnQ7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGluaXRBY3Rpdml0eVN1cHBvcnQoKSB7Ci0JCUlXb3JrYmVuY2ggd29yayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3b3JrID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL05vdCBpbml0aWFsaXplZCB5ZXQKLQkJfQotCQlyZXR1cm4gKHdvcmsgIT0gbnVsbCkgPyB3b3JrLmdldEFjdGl2aXR5U3VwcG9ydCgpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyI2NyZWF0ZUlkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllciBjcmVhdGVJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlPcGVyYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2NkNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVUlPcGVyYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSU9wZXJhdGlvbkhhbmRsZXIgewotCXByb3RlY3RlZCBTaGVsbCBwYXJlbnRTaGVsbDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lORk9STUFUSU9OID0gIkluZm9ybWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRVJST1IgPSAiRXJyb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSVJNID0gIkNvbmZpcm0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBpbmZvcm1hdGlvblRpdGxlID0gREVGQVVMVF9JTkZPUk1BVElPTjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpcm1UaXRsZSA9IERFRkFVTFRfQ09ORklSTTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yVGl0bGUgPSBERUZBVUxUX0VSUk9SOwotCi0JLyoqCi0JICogVUlPcGVyYXRpb25IYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJT3BlcmF0aW9uSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVSU9wZXJhdGlvbkhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVUlPcGVyYXRpb25IYW5kbGVyKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcigpOwotCQlwYXJlbnRTaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJcmV0dXJuIExpc3RNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiBUaGUgYm9vbGVhbiBhcnJheQotCSAqIHdpbGwgcmV0dXJuIHR3byBib29sZWFucy4gVGhlIGZpcnN0IGluZGljYXRlcyB0aGVpciByZXNwb25zZSB0byB0aGUgb3JpZ2luYWwgcXVlc3Rpb24gYW5kIHRoZQotCSAqIHNlY29uZCBpbmRpY2F0ZXMgaWYgdGhleSBzZWxlY3RlZCB0aGUgYXBwbHkgdG8gYWxsIGNoZWNrIGJveC4KLQkgKiAKLQkgKiBSZXR1cm4gdGhlIHJldHVybiBjb2RlIGZvciB0aGUgZGlhbG9nLiAwID0gWWVzLCAxID0gWWVzIHRvIGFsbCwgMiA9IE5vCi0JICovCi0JcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVjayhTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFBhcmVudFNoZWxsKCksIGdldENvbmZpcm1UaXRsZSgpLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LCAxKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyI2NhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDEpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0UGFyZW50U2hlbGwoKSwgZ2V0RXJyb3JUaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGNvbmZpcm1hdGlvbnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25maXJtVGl0bGUoKSB7Ci0JCXJldHVybiBjb25maXJtVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclRpdGxlKCkgewotCQlyZXR1cm4gZXJyb3JUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5mb3JtYXRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIGluZm9ybWF0aW9uVGl0bGU7Ci0JfQotCi0JcHVibGljIFNoZWxsIGdldFBhcmVudFNoZWxsKCkgewotCQlpZiAocGFyZW50U2hlbGwgPT0gbnVsbCkKLQkJCXBhcmVudFNoZWxsID0gV1RQVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQotCQlyZXR1cm4gcGFyZW50U2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIG5lZWRzIHRvIGJlIHByZXNlbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRJbmZvcm1hdGlvblRpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDb25maXJtVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maXJtVGl0bGUoamF2YS5sYW5nLlN0cmluZyBuZXdDb25maXJtVGl0bGUpIHsKLQkJY29uZmlybVRpdGxlID0gbmV3Q29uZmlybVRpdGxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFcnJvclRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JUaXRsZShqYXZhLmxhbmcuU3RyaW5nIG5ld0Vycm9yVGl0bGUpIHsKLQkJZXJyb3JUaXRsZSA9IG5ld0Vycm9yVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC85LzIwMDEgMTE6NTE6MzYgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0luZm9ybWF0aW9uVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvblRpdGxlKGphdmEubGFuZy5TdHJpbmcgbmV3SW5mb3JtYXRpb25UaXRsZSkgewotCQlpbmZvcm1hdGlvblRpdGxlID0gbmV3SW5mb3JtYXRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlciNnZXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRTaGVsbCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YmE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVRlc3RlckltcGwgaW1wbGVtZW50cyBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFVJVGVzdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5VSVRlc3RlciNpc0N1cnJlbnRDb250ZXh0VUkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudENvbnRleHRVSSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHx8IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZSwgd29ya2JlbmNoIG11c3Qgbm90IGJlIHJ1bm5pbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4ZjZiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBlbmNvbXBhcyBhIHNldCBvZiBWYWxpZGF0aW9uIHN0YXR1cyBDcmVhdGlvbiBkYXRlOiAoOS8xMC8yMDAxIDU6MzU6MTIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgewotCi0JLy8gVE9ETyBtYWtlIGFsbCB0aGVzZSB2YXJzIHByaXZhdGUgYW5kIGNoYW5nZSBlcnJNc2dzICYgZXJyU3RhdHVzIHRvIG1hcHMgc28gdGhlIHNhbWUgbWV0aG9kcwotCS8vIGNhbiBiZSB1c2VkIGFzIHdpdGggd2FybmluZ3MgJiBpbmZvCi0JSGFzaHRhYmxlIGVyck1zZ3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaHRhYmxlIGVyclN0YXR1cyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNodGFibGUgdENvbnRyb2xzID0gbmV3IEhhc2h0YWJsZSgpOwotCU1hcCB3YXJuTXNnczsKLQlNYXAgd2FyblN0YXR1czsKLQlNYXAgaW5mb01zZ3M7Ci0JTWFwIGluZm9TdGF0dXM7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uU3RhdHVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgZXJyb3IuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiBlcnJvcnMgYWNjb3JkaW5nIHRvIHRoZWlyIGtleS4gaS5lLiwKLQkgKiBsb3dlciBrZXkgZXJyb3JzIHdpbGwgYmUgcmV0dXJuZWQgZmlyc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXN0RXJyTXNnKCkgewotCQkvL1RPRE8gb25jZSBpdmFycyBhcmUgY2hhbmdlZCB0byBtYXBzLCBwYXNzIHRoaXMgdG8gZ2V0TGFzdE1zZygpCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCQlTdHJpbmdbXSBlcnJzID0gbmV3IFN0cmluZ1tlcnJTdGF0dXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJzLmxlbmd0aDsgaSsrKQotCQkJZXJyc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJZXJyc1trZXkuaW50VmFsdWUoKSAlIGVycnMubGVuZ3RoXSA9IChTdHJpbmcpIGVyck1zZ3MuZ2V0KGtleSk7Ci0JCQkJZm91bmRPbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZE9uZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXJycy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZXJyc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZXJyc1tpXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ01zZ3MoKSB7Ci0JCWlmICh3YXJuTXNncyA9PSBudWxsKQotCQkJd2Fybk1zZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2Fybk1zZ3M7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ1N0YXR1c01hcCgpIHsKLQkJaWYgKHdhcm5TdGF0dXMgPT0gbnVsbCkKLQkJCXdhcm5TdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2FyblN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvTXNncygpIHsKLQkJaWYgKGluZm9Nc2dzID09IG51bGwpCi0JCQlpbmZvTXNncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvTXNnczsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvU3RhdHVzTWFwKCkgewotCQlpZiAoaW5mb1N0YXR1cyA9PSBudWxsKQotCQkJaW5mb1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvU3RhdHVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFdhcm5pbmdNc2coKSB7Ci0JCXJldHVybiBnZXRMYXN0TXNnKHdhcm5TdGF0dXMsIHdhcm5Nc2dzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RJbmZvTXNnKCkgewotCQlyZXR1cm4gZ2V0TGFzdE1zZyhpbmZvU3RhdHVzLCBpbmZvTXNncyk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgc3RhdHVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gc3RhdHVzIGFjY29yZGluZyB0byB0aGVpciBrZXkuIGkuZS4sCi0JICogbG93ZXIga2V5IHN0YXR1cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhc3RNc2coTWFwIHN0YXR1c01hcCwgTWFwIG1zZ01hcCkgewotCQlpZiAoc3RhdHVzTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHN0YXR1c01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBpbmZvcyA9IG5ldyBTdHJpbmdbc3RhdHVzTWFwLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspCi0JCQlpbmZvc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIGtleSA9IChJbnRlZ2VyKSBlLm5leHQoKTsKLQkJCWlmICghKChCb29sZWFuKSBzdGF0dXNNYXAuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaW5mb3Nba2V5LmludFZhbHVlKCkgJSBpbmZvcy5sZW5ndGhdID0gKFN0cmluZykgbXNnTWFwLmdldChrZXkpOwotCQkJCWZvdW5kT25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRPbmUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKQotCQkJCWlmIChpbmZvc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW5mb3NbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVyck1zZ0FuZEZvY3VzKCkgewotCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCi0JCUludGVnZXIgdGhlT25lID0gbnVsbDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKHRoZU9uZSA9PSBudWxsIHx8IGtleS5pbnRWYWx1ZSgpIDwgdGhlT25lLmludFZhbHVlKCkpIHsKLQkJCQkJdGhlT25lID0ga2V5OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodGhlT25lICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSB0Q29udHJvbHMuZ2V0KHRoZU9uZSk7Ci0JCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJY29udHJvbC5zZXRGb2N1cygpOwotCQkJfQotCQkJcmV0dXJuICgoU3RyaW5nKSBlcnJNc2dzLmdldCh0aGVPbmUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcihJbnRlZ2VyIGtleSkgewotCQlCb29sZWFuIHN0YXQgPSAoQm9vbGVhbikgZXJyU3RhdHVzLmdldChrZXkpOwotCQlpZiAoc3RhdCAhPSBudWxsKQotCQkJcmV0dXJuIHN0YXQuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2woSW50ZWdlciBrZXksIENvbnRyb2wgY29udHJvbCkgewotCQl0Q29udHJvbHMucHV0KGtleSwgY29udHJvbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIEJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgbXNnKSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgbXNnKTsKLQkJZXJyU3RhdHVzLnB1dChrZXksIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBtc2cpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCBtc2cpOwotCQllcnJTdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgbXNnKSB7Ci0JCWdldFdhcm5pbmdNc2dzKCkucHV0KGtleSwgbXNnKTsKLQkJZ2V0V2FybmluZ1N0YXR1c01hcCgpLnB1dChrZXksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIG1zZykgewotCQlnZXRJbmZvTXNncygpLnB1dChrZXksIG1zZyk7Ci0JCWdldEluZm9TdGF0dXNNYXAoKS5wdXQoa2V5LCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCWlmICh3YXJuTXNncyAhPSBudWxsKQotCQkJd2Fybk1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3YXJuU3RhdHVzICE9IG51bGwpCi0JCQl3YXJuU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJaWYgKGluZm9Nc2dzICE9IG51bGwpCi0JCQlpbmZvTXNncy5wdXQoa2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZm9TdGF0dXMgIT0gbnVsbCkKLQkJCWluZm9TdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJbnRlZ2VyIGtleSwgYm9vbGVhbiBvaywgU3RyaW5nIG1zZykgewotCQllcnJNc2dzLnB1dChrZXksIG1zZyk7Ci0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbihvaykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ0MGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLldvcmtiZW5jaEFjdGl2aXR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5hY3Rpdml0aWVzLldUUEFjdGl2aXR5QnJpZGdlSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCBpbXBsZW1lbnRzIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBudWxsOwotCXByaXZhdGUgSUFjdGl2aXR5TWFuYWdlciBhY3Rpdml0eU1hbmFnZXIgPSBudWxsOwotCi0JcHVibGljIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCgpIHsKLQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJYWN0aXZpdHlNYW5hZ2VyID0gd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZUFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlELCBib29sZWFuIGVuYWJsZWQpIHsKLQkJU2V0IGVuYWJsZWRBY3Rpdml0aWVzID0gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCQlTZXQgbmV3RW5hYmxlZEFjdGl2aXRpZXMgPSBudWxsOwotCQlpZiAoZW5hYmxlZCAmJiAhZW5hYmxlZEFjdGl2aXRpZXMuY29udGFpbnMoYWN0aXZpdHlJRCkpIHsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLmFkZEFsbChlbmFibGVkQWN0aXZpdGllcyk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGQoYWN0aXZpdHlJRCk7Ci0JCX0KLQkJaWYgKCFlbmFibGVkICYmIGVuYWJsZWRBY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5SUQpKSB7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGRBbGwoZW5hYmxlZEFjdGl2aXRpZXMpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMucmVtb3ZlKGFjdGl2aXR5SUQpOwotCQl9Ci0JCWlmIChudWxsICE9IG5ld0VuYWJsZWRBY3Rpdml0aWVzKSB7Ci0JCQl3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKG5ld0VuYWJsZWRBY3Rpdml0aWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkgewotCQlyZXR1cm4gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRBY3Rpdml0eUlkcyhTZXQgYWN0aXZpdHlJRHMpIHsKLQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LnNldEVuYWJsZWRBY3Rpdml0eUlkcyhhY3Rpdml0eUlEcyk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24oZmluYWwgU3RyaW5nIGxvY2FsSUQsIGZpbmFsIFN0cmluZyBwbHVnaW5JRCkgewotCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0gYWN0aXZpdHlNYW5hZ2VyLmdldElkZW50aWZpZXIoV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuY3JlYXRlVW5pZmllZElkKG5ldyBJUGx1Z2luQ29udHJpYnV0aW9uKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQkJCXJldHVybiBsb2NhbElEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQkJCXJldHVybiBwbHVnaW5JRDsKLQkJCX0KLQkJfSkpOwotCQlyZXR1cm4gaWRlbnRpZmllci5nZXRBY3Rpdml0eUlkcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTAyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5SGVscGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgVUkgaXMgc2V0IHVwIHRvIGZpbHRlciBjb250cmlidXRpb25zIChoYXMgZGVmaW5lZCBhY3Rpdml0eSBjYXRlZ29yaWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNGaWx0ZXJpbmcoKSB7Ci0JCXJldHVybiAhUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbG93VXNlT2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWlzRmlsdGVyaW5nKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5Db250cmlidXRpb24pIHsKLQkJCUlQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uID0gKElQbHVnaW5Db250cmlidXRpb24pIG9iamVjdDsKLQkJCWlmIChjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpOwotCQkJCUlJZGVudGlmaWVyIGlkZW50aWZpZXIgPSB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihjcmVhdGVVbmlmaWVkSWQoY29udHJpYnV0aW9uKSk7Ci0JCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjcmVhdGVVbmlmaWVkSWQoSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pIHsKLQkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICE9IG51bGwpCi0JCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldFBsdWdpbklkKCkgKyAnLycgKyBjb250cmlidXRpb24uZ2V0TG9jYWxJZCgpOwotCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldExvY2FsSWQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDU3MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInd0cGNvbW1vbnVpIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0X2xvY2F0aW9uXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcGVyYXRpb25BY3Rpb25fVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXN0ZXJEZXNjcmlwdG9yX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcGVyYXRpb25BY3Rpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1VTFRJUExFX01PRFVMRV9QUkVGX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUFjdGlvbldUUE9wZXJhdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hc3RlckRlc2NyaXB0b3JfRVJST1JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBXaXphcmRfVUlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcm93c2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVuZGFibGVXaXphcmRfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBBY3Rpb25EaWFsb2dfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lclF1ZXVlX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVfVUlfMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFhNDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdUUEdlbmVyaWNBY3Rpb25JZHMgewotCi0JU3RyaW5nIENVVCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuQ3V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT1BZID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5Db3B5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVNURSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUGFzdGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUmVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjdjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV1RQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJleHRlbmRlZFZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdUUFVJUGx1Z2luIHBsdWdpbjsKLQkvLyBSZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1RQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdUUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihQTFVHSU5fSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya2JlbmNoCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGoyZWUgcGx1Z2luIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0UGx1Z2luV29ya2JlbmNoKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoZmluYWwgSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlcihvcGVyYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgVGhyb3dhYmxlIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICsgIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgSVN0YXR1cyBzdGF0dXMgKQotICAgIHsKLSAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGM4NDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gd2hpY2ggZGVsZWdhdGVzIGl0cyB3b3JrIHRvIGEgcnVubmFibGUgdGhhdCBtb2RpZmllcyB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZEFsbChuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcigpOwotCQlnZXRSdW5uYWJsZXMoKS5hZGRBbGwobmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgdGhlIHJ1bm5hYmxlIHRvIGRlbGVnYXRlIHRvIHdoZW4gdGhpcyBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkUnVubmFibGUoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXJldHVybiBnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnl7Ci0JCQlMaXN0IHJ1bm5hYmxlcyA9IGdldFJ1bm5hYmxlcygpOwotCQkJaWYocnVubmFibGVzLnNpemUoKSA9PSAwKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcnVubmFibGVzLnNpemUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBydW5uYWJsZXMuZ2V0KGkpOwotCQkJCW9wLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSdW5uYWJsZXMoKSB7Ci0JCWlmIChmUnVubmFibGVzID09IG51bGwpCi0JCQlmUnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJcmV0dXJuIGZSdW5uYWJsZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOGZlMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLQkJCVRoZSBXVFAgV2l6YXJkIEFQSSBhbGxvd3MgY2xpZW50cyB0byBidWlsZCB3aXphcmRzIGluIGNvbmp1bmN0aW9uIHdpdGgKLQkJCXRoZSBXVFAgT3BlcmF0aW9uIEZyYW1ld29yayBxdWlja2x5IGFuZCB3aXRoIG1pbmltYWwgZWZmb3J0LgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBJbWFnZSBkZXNjcmlwdGlvbjwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE3YTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTxtZXRhCi0JCQluYW1lPSJyb290IgotCQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCQk8dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotCTwvaGVhZD4KLQotCTxib2R5PgotCQk8YWJzdHJhY3Q+Ci0JCQlUaGUgV1RQIFdpemFyZCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnVpbGQgd2l6YXJkcyBpbiBjb25qdW5jdGlvbiB3aXRoCi0JCQl0aGUgV1RQIE9wZXJhdGlvbiBGcmFtZXdvcmsgcXVpY2tseSBhbmQgd2l0aCBtaW5pbWFsIGVmZm9ydC4KLQkJPC9hYnN0cmFjdD4KLQkJPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLQkJPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyIgY2FwdGlvbj0iSW1hZ2UgZGVzY3JpcHRpb24iIC8+Ci0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTkxNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1ub25fd29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Mjg1ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotY29tbW9uX2NvcmUuamFyCi1jb21tb24uamFyCi1jb21tb25fY29yZXNyYy56aXAKLWNvbW1vbnNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWFiOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2VmaWxlPWZhbHNlCi1vcmcuZWNsaXBzZS53dHAuY29tbW9uL2RlYnVnL2xvZ2xldmVsPVdBUk5JTkcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY0NThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MGI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jU2F0IE1hciAyNCAwMjowNzoxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGY2MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDExMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMtbm9uX3dvcmtiZW5jaC8sXAotICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNTI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+Ci0gIDxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Ci0gICAgPHR5cGUgbmFtZT0iQ2hvaWNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJFbnZpcm9ubWVudEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iRW52aXJvbm1lbnRTZXJ2aWNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJRW52aXJvbm1lbnQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSUxvZyIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJU3RhdHVzSGFuZGxlciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJOdWxsU3RhdHVzSGFuZGxlciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iU3RhdHVzRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgPC9wYWNrYWdlPgotIAotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJRmFjdG9yeSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJRmlsdGVyIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklTY2hlbWUiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSVZpc2l0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iU2ltcGxlVVJJRmFjdG9yeSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iVVJJRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgPC9wYWNrYWdlPgotCi0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwiPjwvcGFja2FnZT4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ZDIwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXI9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9Q29tbW9uIEZyYW1ld29ya3MKLU9wZXJhdGlvbkV4dGVuc2lvbj1PcGVyYXRpb25FeHRlbnNpb24KLUZ1bmN0aW9uX0V4dGVuc2lvbl9Hcm91cD1GdW5jdGlvbiBFeHRlbnNpb24gR3JvdXAKLVdUUEFjdGl2aXR5QnJpZGdlSGVscGVyPVdUUEFjdGl2aXR5QnJpZGdlSGVscGVyCi1EYXRhTW9kZWxQcm92aWRlcj1EYXRhTW9kZWxQcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzIwNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJPcGVyYXRpb25FeHRlbnNpb24iIG5hbWU9IiVPcGVyYXRpb25FeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJmdW5jdGlvbkdyb3VwIiBuYW1lPSIlRnVuY3Rpb25fRXh0ZW5zaW9uX0dyb3VwIiBzY2hlbWE9InNjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIiBuYW1lPSIlV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIHNjaGVtYT0ic2NoZW1hL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIiBuYW1lPSIlRGF0YU1vZGVsUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLnNhdmVIYW5kbGVyIgotICAgICAgICAgbmFtZT0iU2F2ZSBIYW5kbGVyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ic2F2ZUhhbmRsZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRW5hYmxlbWVudERldGVybWluYXRpb24iCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXIiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzIgotICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGM3ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9zcmMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9zcmMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTk4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJEYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiIgbmFtZT0iRGF0YSBNb2RlbCBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCBhbiBleGlzdGluZyBkYXRhIG1vZGVsIHByb3ZpZGVyIHdpdGggYSBjdXN0b20gZGF0YSBtb2RlbCBwcm92aWRlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iRGF0YU1vZGVsUHJvdmlkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IlByb3ZpZGVyRGVmaW5lc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IlByb3ZpZGVySW1wbGVtZW50c1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIG1vZGVsIHByb3ZpZGVyIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgdG8gZXh0ZW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlByb3ZpZGVyRGVmaW5lc1R5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlclR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgZGVmaW5lcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWRlbnRpZmllciBmb3IgdGhlIGRlZmluZWQgdHlwZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJQcm92aWRlckltcGxlbWVudHNUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXJUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCB0eXBlIHRoZSBkYXRhIG1vZGVsIHByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlcklEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGlkZW50aWZpZXIgZm9yIHRoZSBpbXBsZW1lbnRlZCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmMWVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvT3BlcmF0aW9uRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9Ik9wZXJhdGlvbkV4dGVuc2lvbiIgbmFtZT0iT3BlcmF0aW9uIEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGlzIHRoZSBtZXRob2RvbG9neSBmb3IgZXh0ZW5kaW5nIGFuIGV4aXN0aW5nIG9wZXJhdGlvbiBieSBhZGRpbmcgZWl0aGVyIGEgcHJlIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBwcmlvciwgb3IgYSBwb3N0IG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3BlcmF0aW9uRXh0ZW5zaW9uIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVyYXRpb25FeHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZU9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwcmUtb3BlcmF0aW9uIGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvc3RPcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9zdC1vcGVyYXRpb24gY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWQgb2YgdGhlIG9wZXJhdGlvbiB0byBleHRlbmQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkNTBlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIG5hbWU9IldUUCBBY3Rpdml0eSBCcmlkZ2UgSGVscGVyIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFjdGl2aXR5IGJyaWRnZSBoZWxwZXIgd2hpY2ggaXMgdXNlZnVsIHdoZW4gZW5hYmxpbmcgY2FwYWJpbGl0aWVzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyIGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvZnVuY3Rpb25Hcm91cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA5NTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9ImZ1bmN0aW9uR3JvdXAiIG5hbWU9IkZ1bmN0aW9uIEV4dGVuc2lvbiBHcm91cCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBBIGZ1bmN0aW9uR3JvdXAgcHJvdmlkZXMgYSBncm91cGluZyBvZiByZWxhdGVkIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNvbnRyaWJ1dGVkIHRvIHRoZSB0b29scy4gIEZvciBleGFtcGxlLCBhIHRoaXJkIHBhcnR5IGNvbXBvbmVudCBtYXkgd2FudCB0byBjb250cmlidXRlIGFjdGlvbnMsIGVkaXRvciBwYWdlcywgZWRpdCBtb2RlbCByZXNvdXJjZXMsIGFuZCBtYW55IG90aGVyIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBhIGdpdmVuIHByb2R1Y3QuICBCeSBhc3NvY2lhdGluZyBhbGwgdGhlc2UgZnVuY3Rpb25zIHdpdGggYSBncm91cCBpZCwgYSBtZWNoYW5pc20gaXMgZXhwb3NlZCBmb3IgdXNlcnMgdG8gc2VsZWN0aXZlbHkgZW5hYmxlIGFuZCBkaXNhYmxlIGJhc2tldHMgb2YgZnVuY3Rpb24uICBFeHRlbnNpb24gcG9pbnRzIHRoYXQgYWxsb3cgZm9yIGEgJnF1b3Q7Z3JvdXBJRCZxdW90OyBhdHRyaWJ1dGUgZ2VuZXJhbGx5IHdpbGwgaGlkZSB0aG9zZSBmdW5jdGlvbnMgd2hlbiB0aGUgZ3JvdXAgaWQgaXMgZGlzYWJsZWQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnVuY3Rpb25Hcm91cCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZnVuY3Rpb25Hcm91cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGRlZmluaXRpb24gZm9yIGEgZ3JvdXAuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWQgZm9yIHRoZSBncm91cC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGh1bWFuIHJlYWRhYmxlIG5hbWUuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHBhdGggdG8gYW4gaWNvbiBpbWFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHVybCBmb3IgdGhlIGZ1bmN0aW9uIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBPcmRlcmluZyBtYWduaXR1ZGUgb2YgcGx1Z2lucw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsaXplckNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBDbGFzcyB1c2VkIHRvIGRldGVybWluZSBwbHVnaW4gZW5hYmxlbWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgYWxsb3dzIG9uZSB0byBiaW5kIGZ1bmN0aW9uIGdyb3VwcyB0byBwYXR0ZXJucy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZ1bmN0aW9uIGdyb3VwIHRvIGJpbmQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdHRlcm4iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBhdHRlcm4gdG8gYmUgYm91bmQuIFBhdHRlcm5zIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG1hdGNoIHVuaXF1ZSBpZGVudGlmaWVycy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5mdW5jdGlvbkdyb3VwJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtmdW5jdGlvbkdyb3VwDQotICAgICAgICAgICAgbmFtZT0mcXVvdDtBY21lIENvLiBGdW5jdGlvbiBFeHRlbnNpb24mcXVvdDsNCi0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9JnF1b3Q7Y29tLmFjbWUuYWNtZXBybyZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1RoZSBBY21lUHJvIEV4dGVuc2lvbnMgYWRkIGludGVncmF0aW9uIHRvIHRoZSBBY21lIFdlYiBTZXJ2ZXIuJnF1b3Q7DQotICAgICAgICAgICAgZW5hYmxlZEJ5RGVmYXVsdD0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgaWNvbj0mcXVvdDsuLi4mcXVvdDsNCi0gICAgICAgICAgICB1cmw9JnF1b3Q7aHR0cDovL3d3dy5hY21lLmNvbS8mcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL0lXRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmJhZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBBcmNoaXZlUnVudGltZSBhbmQgQXJjaGl2ZVdyYXBwZWQgZXhjZXB0aW9ucywgd2hpY2ggY2FuIGNvbnRhaW4gbmVzdGVkCi0gKiBleGNlcHRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdGVFdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8KLQkgKiBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcyBvbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCk7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uIGdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci0KLQlwdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcyk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTljOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi0vL2ltcG9ydCBjb20uaWJtLmV0b29scy53ZnQubmxzLldGVFV0aWxzUmVzb3VyY2VIYW5kbGVyOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMDMvMDEgMTE6MTI6NTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdGVFdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODg1MDQ0Mjc3Mzc3Nzg0NDI5TDsKLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgV0ZUV3JhcHBlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBXRlRXcmFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFdGVFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCwgU3RyaW5nIHMpIHsKLQkJc3VwZXIodGFyZ2V0LCBzKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCS8vVE9ETyBhZGQgdGhpcyBiYWNrIGluCi0JCQkvLyBzLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChnZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQkvL1RPRE8gYWRkIHRoaXMgYmFjayBpbgotCQkJLy8gcy5wcmludGxuKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVJST1JfIikpOwotCQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJCWdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2FjNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvV29ya2JlbmNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTsKLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaFV0aWwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIFdvcmtiZW5jaFJ1bm5pbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgV29ya2JlbmNoVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB3b3JrYmVuY2hJc1J1bm5pbmcoKSAtIHRlc3Qgd2hldGhlciBvciBub3Qgd2UgYXJlIHJ1bm5pbmcgaW4gdGhlIHdvcmtiZW5jaCBlbnZpcm9ubWVudC4KLQkgKiAKLQkgKiBAc2VlIEphdmFQbHVnaW4uc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdvcmtiZW5jaElzUnVubmluZygpIHsKLQkJcmV0dXJuIFdvcmtiZW5jaFJ1bm5pbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgaWYgeW91IGFyZSBydW5uaW5nIGluIGEgV29ya2JlbmNoIGVudmlyb25tZW50LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya2JlbmNoSXNSdW5uaW5nKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJV29ya2JlbmNoUnVubmluZyA9IGFCb29sZWFuOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDViMjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIGZvciBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSURhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBJU3RhdHVzLk9LLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgSUVudmlyb25tZW50IGVudmlyb25tZW50OwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIElEYXRhTW9kZWwgdXNlZCBieSB0aGlzIElEYXRhTW9kZWxPcGVyYXRpb24KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmlkID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RydWN0b3IgdGFraW5nIGFuIElEYXRhTW9kZWwKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgSURhdGFNb2RlbCB1c2VkIHRvIGRyaXZlIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkIC8vIFRPRE8gYWRkIGEgbGFiZWwgcHJvcGVydHkgdG8gSURhdGFNb2RlbD8/PwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuaWQgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldElEKCkuCi0JICogPHA+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI3NldElEKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0SUQoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldElEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzZXREYXRhTW9kZWwoKQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0RGF0YU1vZGVsKCkKLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRTY2hlZHVsaW5nUnVsZSgpIHJldHVybnMKLQkgKiA8Y29kZT5SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldFNjaGVkdWxpbmdSdWxlKCkKLQkgKi8KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkgcmV0dXJucwotCSAqIDxjb2RlPklXb3Jrc3BhY2UuQVZPSURfVVBEQVRFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkgewotCQlyZXR1cm4gSVdvcmtzcGFjZS5BVk9JRF9VUERBVEU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGZyYW1ld29yayB3aWxsIHNldCB0aGUgZW52aXJvbm1lbnQgb24gdGhpcyBvcGVyYXRpb24gYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLiBUaGUgb3BlcmF0aW9uCi0JICogY2FuIHRoZW4gdXNlIHRoZSBlbnZpcm9ubWVudCB0byByZXBvcnQgc3RhdHVzLCBsb2cgaW5mb3JtYXRpb24sIGFuZCBhY2Nlc3MgcmVzb3VyY2VzIGluIGFuCi0JICogZW52aXJvbm1lbnQgbmV1dHJhbCB3YXkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbnYKLQkgKiAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52KSB7Ci0JCWVudmlyb25tZW50ID0gZW52OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFuIG9wZXJhdGlvbiBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIGVudmlyb25tZW50IHRoYXQgaGFzIGJlZW4gc2V0IGJ5IHRoZSBvcGVyYXRpb25zCi0JICogZnJhbWV3b3JrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgYW4gZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgcmVkby4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgdW5kby4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmMzMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklEYXRhTW9kZWxQcm92aWRlcjwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIElEYXRhTW9kZWwgZm9yIHRoaXMgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiA8L3A+Ci0JICogQW4gaW1wbGVtZW5hdGlvbiBvZiBzZXREYXRhTW9kZWwoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW4gaW1wbGVtZW5hdGlvbiBvZiBnZXREYXRhTW9kZWwoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQotCS8qKgotCSAqIDwvcD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVuZWF0aW9uIG9mIHByb3BlcnR5U2V0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gc2V0Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjcHJvcGVydHlTZXQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RGVmYXVsdFByb3BlcnR5KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZihBTExPV19FWFRFTlNJT05TLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZihSRVNUUklDVF9FWFRFTlNJT05TLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGlzUHJvcGVydHlFbmFibGVkKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIHZhbGlkYXRlKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBuZXN0ZWQgSURhdGFNb2RlbCBiZWluZyB2YWxpZGF0ZWQuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldFByb3BlcnR5RGVzY3JpcHRvcigpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzCi0JICogbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RXh0ZW5kZWRDb250ZXh0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RXh0ZW5kZWRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldERlZmF1bHRPcGVyYXRpb24oKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXROYW1lKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGRpc3Bvc2UoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIHByb3BlcnR5IGZyb20gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIHByb3BlcnR5IG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIGJvb2xlYW4gcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIGJvb2xlYW4gcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlKSB7Ci0JCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhbiBpbnQgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0SW50UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNldHRpbmcgYW4gaW50IHByb3BlcnR5IG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBpbnQgcHJvcGVydHkgdmFsdWUKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IHByb3BlcnR5VmFsdWUpIHsKLQkJbW9kZWwuc2V0SW50UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYSBTdHJpbmcgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIGlmIGEgcHJvcGVydHkgaXMgc2V0IGZyb20gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5pc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyYjBiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgcHJvcGVydHkgY2hhbmdlcyBmcm9tIElEYXRhTW9kZWxzIHRvIHRoZWlyIElEYXRhTW9kZWxMaXN0ZW5lcnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXIKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsRXZlbnQgewotCi0JLyoqCi0JICogPHA+Ci0JICogQSBmbGFnIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkncyB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEcgPSAxOwotCi0JLyoqCi0JICogSW50ZXJuYWwuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UuCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NIRyA9IDI7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZsYWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSdzIGVuYWJsbWVudCBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfQ0hHID0gMzsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZmxhZyB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5J3MgdmFsaWQgdmFsdWVzIGhhdmUgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpCi0JICogQHNlZSAjZ2V0RmxhZygpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfVkFMVUVTX0NIRyA9IDQ7Ci0KLQotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgaW50IGZsYWc7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGF0YU1vZGVsRXZlbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgY29udGFpbnMgYSBmbGFnIHNwZWNpZml5aW5nIHRoZSBldmVudCB0eXBlCi0JICovCi0JcHVibGljIERhdGFNb2RlbEV2ZW50KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZykgewotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCXRoaXMuZmxhZyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgSURhdGFNb2RlbCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgSURhdGFNb2RlbCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIGV2ZW50IHR5cGUuIFZhbGlkIHR5cGVzIGFyZToKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPlBST1BFUlRZX0NIRzwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT5WQUxJRF9WQUxVRVNfQ0hHPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPkVOQUJMRV9DSEc8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIGV2ZW50IHR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRGbGFnKCkgewotCQlyZXR1cm4gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBJRGF0YU1vZGVsJ3MgcHJvcGVydHkuIFRoaXMgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8Y29kZT5nZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkYXRhTW9kZWwncyBwcm9wZXJ0eS4KLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHByb3BlcnR5J3MgZW5hYmxlbWVudCBzdGF0ZS4gVGhpcyBpcyBlcXVhdmFsZW50Ci0JICogdG86IDxjb2RlPmdldERhdGFNb2RlbCgpLmlzUHJvcGVydHlFbmFibGVkKGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCBwcm9wZXJ0eSdzIGVuYWJsZW1lbnQgc3RhdGUuCi0JICogQHNlZSBJRGF0YU1vZGVsI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwgcHJvcGVydHkncyB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4gVGhpcyBpcwotCSAqIGVxdWF2YWxlbnQgdG86IDxjb2RlPmdldERhdGFNb2RlbCgpLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhnZXRQcm9wZXJ0eU5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkYXRhTW9kZWwgcHJvcGVydHkncyB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiMDczMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5EYXRhTW9kZWxJbXBsOwotCi0vKioKLSAqIDxwPgotICogRGF0YU1vZGVsRmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBJRGF0YU1vZGVsIGluc3RhbmNlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIgcmVhZGVyOwotCi0JcHJpdmF0ZSBEYXRhTW9kZWxGYWN0b3J5KCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgYnkgdGhlIHNwZWNpZmllZCBpZCBhbmQgY29uc3RydWN0cyBhIG5ldwotCSAqIElEYXRhTW9kZWwuIElmIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIgaXMgbm90IGZvdW5kIHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIGlzIGxvZ2dlZCBhbmQgbnVsbAotCSAqIGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsUHJvdmlkZXJJRAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgbmV3IElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKFN0cmluZyBkYXRhTW9kZWxQcm92aWRlcklEKSB7Ci0JCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGxvYWRQcm92aWRlcihkYXRhTW9kZWxQcm92aWRlcklEKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSURhdGFNb2RlbFByb3ZpZGVyIGxvYWRQcm92aWRlcihTdHJpbmcgaWQpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRQcm92aWRlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIGRhdGFNb2RlbFByb3ZpZGVySURzIGJ5IHRoZSBzcGVjaWZpZWQgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxQcm92aWRlcktpbmRJRAotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyBpZCBvZiB0aGUgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWxpZCBkYXRhTW9kZWxQcm92aWRlcklEcyBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZChTdHJpbmcgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQpIHsKLQkJU3RyaW5nW10gdmFsaWRQcm92aWRlcklEcyA9IGxvYWRQcm92aWRlckZvclByb3ZpZGVyS2luZChkYXRhTW9kZWxQcm92aWRlcktpbmRJRCk7Ci0JCXJldHVybiBudWxsICE9IHZhbGlkUHJvdmlkZXJJRHMgPyB2YWxpZFByb3ZpZGVySURzIDogbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGxvYWRQcm92aWRlckZvclByb3ZpZGVyS2luZChTdHJpbmcgcHJvdmlkZXJLaW5kKSB7Ci0JCWlmIChudWxsID09IHJlYWRlcikgewotCQkJcmVhZGVyID0gbmV3IERhdGFNb2RlbEV4dGVuc2lvblJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXIuZ2V0UHJvdmlkZXJEZXNjcmlwdG9yc0ZvclByb3ZpZGVyS2luZChwcm92aWRlcktpbmQpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEJ1aWxkcyBhbiB7QGxpbmsgSURhdGFNb2RlbH0gdXNpbmcgdGhlIHNwZWNpZmllZCBDbGFzcy4gVGhpcyBDbGFzcyB3aWxsCi0JICogbm9ybWFsbHkgYmUgYSBzdWIgaW50ZXJmYWNlIG9mIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30uIElmIHRoZQotCSAqIENsYXNzIGl0IGlzIGFuIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30uY2xhc3MgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCi0JICogYXR0ZW1wdCB0byB1c2UgdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllcyNfcHJvdmlkZXJfY2xhc3N9IGZpZWxkIHRvCi0JICogbG9hZCB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gd2l0aCB3aGljaCB0byBiYWNrIHRoZQotCSAqIHtAbGluayBJRGF0YU1vZGVsfS4gSWYgdGhpcyBmYWlscywgb3IgaWYgdGhlIENsYXNzIGlzIG5vdCBhbiBpbnRlcmZhY2UsCi0JICogdGhlbiB0aGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvCi0JICogPGNvZGU+Y3JlYXRlRGF0YU1vZGVsKGFDbGFzcy5nZXROYW1lKCkpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFDbGFzcwotCSAqICAgICAgICAgICAgYW4ge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS5jbGFzcyBvciB0aGUgY2xhc3Mgd2hvc2UgbmFtZQotCSAqICAgICAgICAgICAgaXMgdGhlIGlkIG9mIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgbmV3IElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKENsYXNzIGFDbGFzcykgewotCQlpZihhQ2xhc3MuaXNJbnRlcmZhY2UoKSl7Ci0JCQkJdHJ5ewotCQkJCQlDbGFzcyBjbGF6eiA9IChDbGFzcylhQ2xhc3MuZ2V0RmllbGQoIl9wcm92aWRlcl9jbGFzcyIpLmdldChudWxsKTsKLQkJCQkJaWYoY2xhenogIT0gbnVsbCl7Ci0JCQkJCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoSURhdGFNb2RlbFByb3ZpZGVyKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCQkJCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmU7IHRoZSBpbnRlcmZhY2UgbWF5IG5vdCBoYXZlIGRlZmluZWQgdGhlIGZpZWxkIGFuZCBpcyByZWx5aW5nIG9uIGV4dGVuc2lvbnMuCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9ICAKLQkJfQotCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKGFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBuZXcgSURhdGFNb2RlbCB1c2luZyB0aGUgdGhlIHNwZWNpZmllZCBpbnN0YW5jZSBvZiBhbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWlmIChudWxsID09IHByb3ZpZGVyKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IG5ldyBEYXRhTW9kZWxJbXBsKHByb3ZpZGVyKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTRlY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBwcm92aWRlcyBhIGh1bWFuIHJlYWRpYmxlIGRlc2NyaXB0aW9uIGZvciBhbiBJRGF0YU1vZGVsCi0gKiBwcm9wZXJ0eVZhbHVlLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycy4gSWYKLQkgKiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGZvcgotCSAqIGVhY2ggPGNvZGU+dmFsdWVzW2ldPC9jb2RlPiBpbiB0aGUgYXJyYXksIGEgbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgaXMgY3JlYXRlZAotCSAqIHVzaW5nIDxjb2RlPm5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzKHZhbHVlc1tpXSk7PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcwotCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZURlc2NyaXB0b3JzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAobnVsbCA9PSB2YWx1ZXMpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycy4gSWYKLQkgKiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGZvcgotCSAqIGVhY2ggPGNvZGU+dmFsdWVzW2ldPC9jb2RlPiBhbmQgPGNvZGU+ZGVzY3JpcHRpb25zW2ldPC9jb2RlPiBpbiB0aGUgYXJyYXlzLCBhIG5ldwotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBpcyBjcmVhdGVkIHVzaW5nCi0JICogPGNvZGU+bmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZXNbaV0sIGRlc2NyaXB0aW9uc1tpXSk7PC9jb2RlPi4gQm90aCBhcnJheXMKLQkgKiBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMgY29vcmVzcG9uZGluZyB0aGUgdmFsdWVzIGFycmF5Ci0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlRGVzY3JpcHRvcnMoT2JqZWN0W10gdmFsdWVzLCBTdHJpbmdbXSBkZXNjcmlwdGlvbnMpIHsKLQkJaWYgKG51bGwgPT0gdmFsdWVzKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXTsKLQkJfQotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZXNbaV0sIGRlc2NyaXB0aW9uc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcHJvcGVydHlWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyBlcXVhdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+RGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5VmFsdWUsIG51bGwpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ5IHZhbHVlCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVZhbHVlIGFuZAotCSAqIHByb3BlcnR5RGVzY3JpcHRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKiBAcGFyYW0gcHJvcGVydHlEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGh1bWFuIHJlYWRpYmxlIHByb2VwcnR5IGRlc2NyaXB0aW9uRgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IHByb3BlcnR5VmFsdWUsIFN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JCXRoaXMucHJvcGVydHlEZXNjcmlwdGlvbiA9IHByb3BlcnR5RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGlibGUgcHJvcGVydHkgZGVzY3JpcHRpb24uIElmIGEgbm9uIG51bGwgZGVzY3JpcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLAotCSAqIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgdmFsdWUncyA8Y29kZT50b1N0cmluZygpPC9jb2RlPiB3aWxsIGJlCi0JICogcmV0dXJuZWQgaWYgaXQgaXMgbm90IG51bGwuIE90aGVyd2lzZSB0aGUgZW1wdHkgU3RyaW5nICg8Y29kZT4iIjwvY29kZT4pIHdpbGwgYmUKLQkgKiByZXR1cm5lZC4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBuZXZlciBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgaHVtYW4gcmVhZGlibGUgcHJvcGVydHkgZGVzY3JpcHRpb24sIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgewotCQlpZiAobnVsbCAhPSBwcm9wZXJ0eURlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdGlvbjsKLQkJfQotCQlTdHJpbmcgc3RyID0gKG51bGwgIT0gcHJvcGVydHlWYWx1ZSkgPyBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotCQlyZXR1cm4gKG51bGwgIT0gc3RyKSA/IHN0ciA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMxYzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxzIGFyZSB0aGUgY29yZSBwaWVjZSBvZiBhIGZyYW1ld29yayB1c2VkIHRvIHNpbXBsaWZ5IGRhdGEgY29sbGVjdGlvbiwgb3BlcmF0aW9uCi0gKiBleGVjdXRpb24sIGFuZCBXaXphcmQgZ2VuZXJhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIHByaW1hcmlseSBhbiBpbnRlbGxpZ2VudCBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIGRhdGEuIEVhY2ggSURhdGFNb2RlbCB0cmFja3MKLSAqIHNwZWNpZmljIE9iamVjdHMga25vd24gYXMgInByb3BlcnRpZXMiLiBFYWNoIHByb3BlcnR5IG1heSBiZSBzZXQgb3IgZ2V0IHVzaW5nIGl0cyBwcm9wZXJ0eSBuYW1lLgotICogQSBDb2xsZWN0aW9uIG9mIHByb3BlcnR5IG5hbWVzIGZvciBhbiBJRGF0YU1vZGVsIGluc3RhbmNlIG1heSBiZSByZXRyZWl2ZWQgdXNpbmcKLSAqIDxjb2RlPmdldEFsbFByb3BlcnRpZXMoKTwvY29kZT4uIEluIGFkZGl0aW9uIHRvIGdldHRpbmcvc2V0dGluZyBwcm9wZXJ0aWVzLCBJRGF0YU1vZGVscyBtYXkKLSAqIGFsc28gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdW5zZXQgcHJvcGVydGllcywgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRvcnMgZm9yIHByb3BlcnRpZXMsCi0gKiBlbnVtZXJhdGlvbnMgb2YgdmFsaWQgcHJvcGVydHkgdmFsdWVzLCB2YWxpZGF0aW9uIGZvciBwcm9wZXJ0aWVzLCBhbmQgZW5hYmxlbWVudCBmb3IgcHJvcGVydGllcy4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgbWF5IGFsc28gYmUgbmVzdGVkIChhbmQgdW5uZXN0ZWQpIHJlY3Vyc2l2ZWx5IHdpdGhpbiBhbm90aGVyLiBXaGVuIG9uZSBJRGF0YU1vZGVsIGlzCi0gKiBuZXN0ZWQgd2l0aGluIGFub3RoZXIsIHRoZW4gY2xpZW50IGNvZGUgbWF5IGFjY2VzcyBhbGwgcHJvcGVydGllcyBvbiB0aGUgZm9ybWVyIHRocm91Z2ggdGhlCi0gKiBsYXR0ZXIuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUgc2FtZSBJRGF0YU1vZGVsICh0cmFja2luZyB0aGUgc2FtZSBwcm9wZXJ0aWVzKSBtYXkgYmUKLSAqIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHNldmVyYWwgZGlmZmVyZW50IGJyb2FkZXIgc2NlbmFyaW9zLiBOZXN0aW5nIG1heSBhcHBseSB0byBhbnkKLSAqIElEYXRhTW9kZWwsIGFuZCBtYXkgYmUgYWJpdHJhcnlseSBkZWVwIChldmVuIGN5bGljYWwgaWYgeW91IGRhcmUpLiBOZXN0aW5nIG9mZmVycyBmbGV4aWJpbGl0eSwKLSAqIGVzcGVjaWFsbHkgZm9yIGV4dGVuc2lvbiBieSAzcmQgcGFydHkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJRGF0YU1vZGVsIG1heSBhbHNvIHN1cHBseSBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIChhIHN1YmNsYXNzIG9mCi0gKiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uKSBmb3IgZXhlY3V0aW9uLiBXaGVuIGV4ZWN1dGVkIHdpdGhpbiB0aGUKLSAqIElEYXRhTW9kZWwgZnJhbWV3b3JrIGFsbCB0aGVzZSBvcGVyYXRpb25zIGFyZSBpbmhlcmVudGx5IGFuZCBhYml0cmFyaWx5IGV4dGVuZGFibGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVhY2ggSURhdGFNb2RlbCBtYXkgYWxzbyBpbmRpcmVjdGx5IHN1cHBseSBhIERhdGFNb2RlbFdpemFyZC4gVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgdG8KLSAqIHNwaWx0IFVJIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBjb3JlIElEYXRhTW9kZWwgZnJhbWV3b3JrLiBEYXRhTW9kZWxXaXphcmRzIGFyZSBhbHNvIGluaGVyZW50bHkKLSAqIGV4dGVuZGFibGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElEYXRhTW9kZWxzIGFyZSBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LCByYXRoZXIgdGhleSBhcmUgYnVpbHQgZnJvbSBhbgotICogSURhdGFNb2RlbFByb3ZpZGVyLiBDbGllbnRzIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBJRGF0YU1vZGVsIG11c3QgZG8gc28gYnkgaW1wbGVtZW50aW5nIGFuCi0gKiBJRGF0YU1vZGVsUHJvdmlkZXIuIENsaWVudHMgd2lzaGluZyB0byB1dGlsaXplIGFuIElEYXRhTW9kZWwgbXVzdCBjcmVhdGUgaXQgdXNpbmcgdGhlCi0gKiBEYXRhTW9kZWxGYWN0b3J5IHdpdGggdGhlIGFzc29jaWF0ZWQgSURhdGFNb2RlbFByb3ZpZGVyLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB1bmlxdWUgSUQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIElEYXRhTW9kZWwgaW5zdGFuY2UuIFRoZSBzYW1lIElEIHNob3VsZCBiZSB1c2VkCi0JICogYnkgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIChpZiBhbnkpIGZvciBjbGllbnRzIHRvIGV4dGVuZCBvciBpbnN0YW50aWF0ZSBkaXJlY3RseSwgdGhlCi0JICogRGF0YU1vZGVsV2l6YXJkIChpZiBhbnkpIGZvciBjbGllbnRzIHRvIGV4dGVuZCBvciBpbnN0YW50aWF0ZSBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZSwgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYSBoYXNoY29kZS4gTXVsdGlwbGUgSURhdGFNb2RlbCBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lCi0JICogSURhdGFNb2RlbFByb3ZpZGVyIHR5cGUgd2lsbCBhbGwgaGF2ZSB0aGUgc2FtZSBJRC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRJRCgpCi0JICogCi0JICogQHJldHVybiB0aGUgdW5pcXVlIElEIGZvciB0aGlzIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiB0byBleGVjdXRlIGFnYWluc3QgdGhpcyBJRGF0YU1vZGVsLiBUaGUgcmV0dXJuZWQgb3BlcmF0aW9uIGlzCi0JICogZGVyaXZlZCBmcm9tIHRoZSBvcGVyYXRpb24gc3VwcGxpZWQgYnkgdGhlIGJhY2tpbmcgSURhdGFNb2RlbFByb3ZpZGVyLiBUaGUgcmV0dXJuZWQgdHlwZSBpcwotCSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIHdoaWNoIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSByZXR1cm5lZAotCSAqIElEYXRhTW9kZWxPcGVyYXRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBvbmx5IHBlcnRhaW5zIHRvIElEYXRhTW9kZWxzIGZvciBleHRlZGVuZGVkIG9wZXJhdGlvbnMuIFRoZSByZXR1cm5lZCBleHRlbmRlZAotCSAqIGNvbnRleHQgaXMgdXNlZCBieSB0aGUgSURhdGFNb2RlbE9wZXJhdGlvbiBmcmFtZXdvcmsgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0JICogZXh0ZW5kZWQgb3BlcmF0aW9uIHNob3VsZCBleGVjdXRlLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBzaG91bGQgY29udGFpbiBPYmplY3RzIGFkYXB0YWJsZSB0bwotCSAqIElQcm9qZWN0LiBUaGlzIElEYXRhTW9kZWwncyBmdW5jdGlvbiBncm91cHMgYXJlIGxvb2tlZCB1cCB0aHJvdWdoIHRoZSBleHRlbnNpb24gbWVjaGFuaXNtLiBJZgotCSAqIGEgZnVuY3Rpb24gZ3JvdXAgaXMgZGVmaW5lZCwgaXQgaXMgZmlyc3QgY2hlY2tlZCBmb3IgZW5hYmxlbWVudC4gVGhlbiBlYWNoIGFkYXB0ZWQgSVByb2plY3QKLQkgKiBpcyBpbnNwZWN0ZWQgdG8gdmVyaWZ5IGl0IGhhbmRsZXMgdGhlIGZ1bmN0aW9uIGdyb3VwLiBJZiBhbGwgdGhlc2UgY29uZGl0aW9ucyBhcmUgbWV0LCB0aGVuCi0JICogdGhlIGV4dGVuZGVkIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRGF0YU1vZGVsIGlzIGV4ZWN1dGVkOyBvdGhlcndpc2UgaXQgaXMgc2tpcHBlZC4KLQkgKiBJZiBubyBmdW5jdGlvbiBncm91cCBpcyBkZWZpbmVkLCBvciBubyBleHRlbmRlZCBjb250ZXh0IGlzIGRlZmluZWQgKGkuZS4gdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIGFuIGVtcHR5IGxpc3QsIG9yIHRoZSBvYmplY3RzIGluIHRoZSByZXR1cm5lZCBsaXN0IGFyZSBub3QgYWRhcHRhYmxlIHRvIElQcm9qZWN0KSB0aGVuIHRoZQotCSAqIGV4dGVuZGVkIG9wZXJhdGlvbiB3aWxsIGV4ZWN1dGUgKGl0IHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIExpc3Qgb2YgT2JqZWN0cyBhZGFwdGFibGUgdG8gSVByb2plY3QKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRFeHRlbmRlZENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBub3QgYSBwcm9wZXJ0eSB0aGVuIGEgUnVudGltZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyByZXR1cm5lZCwgZmlyc3QgdGhlIG93bmluZyBJRGF0YU1vZGVsIG11c3QgYmUgbG9jYXRlZC4gSWYgdGhlCi0JICogc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBhIGJhc2UgcHJvcGVydHkge0BsaW5rICNpc0Jhc2VQcm9wZXJ0eShTdHJpbmcpfSwgdGhlbiB0aGlzCi0JICogSURhdGFNb2RlbCBpcyB0aGUgb3duZXIuIE90aGVyd2lzZSwgYSByZWN1cnNpdmUgc2VhcmNoIHRocm91Z2ggdGhlIG5lc3RlZCBJRGF0YU1vZGVscyBpcwotCSAqIGNvbmR1Y3RlZCB0byBsb2NhdGUgdGhlIG93bmluZyBJRGF0YU1vZGVsLiBJZiBtb3JlIHRoYW4gb25lIG5lc3RlZCBJRGF0YU1vZGVsIGRlZmluZXMgdGhlCi0JICogcHJvcGVydHksIHRoZW4gdGhlIGZpcnN0IG9uZSBsb2NhdGVkIGlzIGNvbnNpZGVyZWQgdGhlIG93bmluZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPbmNlIHRoZSBvd25pbmcgSURhdGFNb2RlbCBpcyBmb3VuZCB0aGUgcHJvcGVydHkgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgc2V0Ci0JICoge0BsaW5rICNpc1Byb3BlcnR5U2V0KFN0cmluZyl9LiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc2V0IHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGUKLQkgKiBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBpdHMgZGVmYXVsdCBpcyByZXR1cm5lZCB7QGxpbmsgI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlcmUgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGdldHRpbmcgcHJpbWl0aXZlIDxjb2RlPmludDwvY29kZT4gYW5kCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHlwZXMgYXMgd2VsbCBhcyBTdHJpbmdzLgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpfTwvbGk+Ci0JICogPGxpPntAbGluayAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpfTwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqIEBzZWUgI2dldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2dldFN0cmluZ1Byb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGludHMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50Ci0JICogdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPigoSW50ZWdlcilnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKS5pbnRWYWx1ZSgpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkIGlmIGEgY2FsbCB0byBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGJvb2xlYW5zLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRoZW4gdGhpcyBtZXRob2QgaXMKLQkgKiBlcXVhdmFsZW50IHRvOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4oKEJvb2xlYW4pZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSkuYm9vbGVhblZhbHVlKCk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYSBjYWxsIHRvIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBTdHJpbmdzLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRoZW4gdGhpcyBtZXRob2QgaXMKLQkgKiBlcXVhdmFsZW50IHRvOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4oU3RyaW5nKWdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPiIiPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhIGNhbGwgdG8gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5VmFsdWUuIFN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB7QGxpbmsgI2dldFByb3BlcnR5KFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHByb3BlcnR5VmFsdWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFdoZW4gYSBwcm9wZXJ0eVZhbHVlIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gaXMgc2V0LCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkCi0JICogInNldCIgKHNlZSB7QGxpbmsgI2lzUHJvcGVydHlTZXQoU3RyaW5nKX0pLCBjb252ZXJzbHksIGEgcHJvcGVydHlWYWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIGNvbnNpZGVyZWQgInVuc2V0Ii4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgbm90IGEgcHJvcGVydHkgKHNlZSB7QGxpbmsgI2lzUHJvcGVydHkoU3RyaW5nKX0pIHRoZW4gYQotCSAqIFJ1bnRpbWVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZXJlIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBzZXR0aW5nIHByaW1pdGl2ZSA8Y29kZT5pbnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHR5cGVzIGFzIHdlbGwgYXMgU3RyaW5ncy4KLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayAjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpfTwvbGk+Ci0JICogPGxpPntAbGluayAjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbil9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNzZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcsIFN0cmluZyl9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIG1heSBkZWZpbmUgYWRkaXRpb25hbCBwb3N0IHNldCBsb2dpYyBpbgotCSAqIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXIjcHJvcGVydHlTZXQoU3RyaW5nLCBPYmplY3QpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNpc1Byb3BlcnR5U2V0KFN0cmluZykKLQkgKiBAc2VlICNpc1Byb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBpbnRzLiBUaGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxwPgotCSAqIDxjb2RlPnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3IEludGVnZXIocHJvcGVydHlWYWx1ZSkpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqIEBzZWUgI2dldEludFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgcHJvcGVydHlWYWx1ZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBib29sZWFucy4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8cD4KLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICh2YWx1ZSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIFN0cmluZ3MuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG86Ci0JICogPHA+Ci0JICogPGNvZGU+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbmVzdCB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWwgd2l0aGluIHRoaXMgSURhdGFNb2RlbC4gVGhlCi0JICogPGNvZGU+bmVzdGVkTW9kZWxOYW1lPC9jb2RlPiBhcmd1bWVudCBzaG91bGQgYmUgYSB1bmlxdWUgU3RyaW5nIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhcgotCSAqIG5lc3RlZCBJRGF0YU1vZGVsLiBUaGUgc2FtZSBTdHJpbmcgaXMgcmVxdWlyZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHVzaW5nCi0JICogZWl0aGVyIHtAbGluayAjZ2V0TmVzdGVkTW9kZWwoU3RyaW5nKX0gb3Ige0BsaW5rICNyZW1vdmVOZXN0ZWRNb2RlbChTdHJpbmcpfS4gSWYgdGhlCi0JICogc3BlY2lmaWVkIG5lc3RlZCBJRGF0YU1vZGVsIGhhcyBhbHJlYWR5IGJlZW4gbmVzdGVkIHVuZGVyIHRoaXMgSURhdGFNb2RlbCBvciBpdCBpcyB0aGUgc2FtZQotCSAqIGluc3RhbmNlIGFzIHRoaXMgSURhdGFNb2RlbCwgdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXN0ZWRNb2RlbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBJRGF0YU1vZGVsIHRvIGJlIG5lc3RlZAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHRvIGJlIG5lc3RlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5lc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjZ2V0TmVzdGVkTW9kZWwoU3RyaW5nKQotCSAqIEBzZWUgI3JlbW92ZU5lc3RlZE1vZGVsKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGROZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lLCBJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBuZXN0ZWRNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHRvIHJlbW92ZS4KLQkgKiBAcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHJlbW92ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBuZXN0ZWQgbW9kZWwgZG9lcyBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIHJlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyBuZXN0ZWRNb2RlbE5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5lc3RlZCBtb2RlbCBleGlzdHMgKGF0IHRoZSB0b3AgbGV2ZWwgb25seSkgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZSBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5lc3RlZCBtb2RlbCBleGlzdHMgKGF0IHRoZSB0b3AgbGV2ZWwgb25seSkgd2l0aCB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBuYW1lIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCBpZGVudGlmaWVkIHRoZSBieSB0aGUgc3BlY2lmaWVkIG5hbWUuIEEgUnVudGltZUV4Y2VwdGlvbiBpcwotCSAqIHRocm93biBpZiB0aGVyZSBpcyBubyBzdWNoIG5lc3RlZCBJRGF0YU1vZGVsIChpLmUuIGlzTmVzdGVkTW9kZWwoKSB3b3VsZCByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4pLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gZ2V0LgotCSAqIEByZXR1cm4gdGhlIG5lc3RlZCBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0TmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbHMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMgbmFtZXMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscyBuYW1lcywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0aW5nICh0aGUgaW52ZXJzZSBvZiBuZXN0ZWQpIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RpbmcgKHRoZSBpbnZlcnNlIG9mIG5lc3RlZCkgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGluZ01vZGVscygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIGJhc2UgcHJvcGVydGllcyAobm90IGluY2x1ZGluZyBuZXN0ZWQgcHJvcGVydGllcyksIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgYmFzZSBwcm9wZXJ0aWVzIChub3QgaW5jbHVkaW5nIG5lc3RlZCBwcm9wZXJ0aWVzKSwgb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCYXNlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgb2YgcmVjdXJzaXZlbHkgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgb2YgcmVjdXJzaXZlbHkgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzICh0aGUgdW5pb24gb2YgZ2V0QmFzZVByb3BlcnRpZXMoKSBhbmQKLQkgKiBnZXROZXN0ZWRQcm9wZXJ0aWVzKCkpLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzICh0aGUgdW5pb24gb2YgZ2V0QmFzZVByb3BlcnRpZXMoKSBhbmQKLQkgKiAgICAgICAgIGdldE5lc3RlZFByb3BlcnRpZXMoKSksIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciB0aGlzCi0JICogcm9vdCBJRGF0YU1vZGVsIG9ubHkuIE5lc3RlZCBJRGF0YU1vZGVscyBhcmUgbm90IGNoZWNrZWQsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBuZXN0ZWQKLQkgKiBJRGF0YU1vZGVsIHRvIGNvbnRhaW4gdGhlIHNhbWUgcHJvcGVydHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb3BlcnR5IGlzIGEgYmFzZSBwcm9wZXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjaXNQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjaXNOZXN0ZWRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYXNlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciB0aGlzCi0JICogRGF0YU1vZGVsIG9yIGFueSBvZiBpdHMgKHJlY3Vyc2l2ZWx5KSBuZXN0ZWQgSURhdGFNb2RlbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcHJvcGVydHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjaXNCYXNlUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciBhbnkgb2YKLQkgKiBpdHMgKHJlY3Vyc2l2ZWx5KSBuZXN0ZWQgSURhdGFNb2RlbHMuIFRoZSByb290IElEYXRhTW9kZWwgaXMgbm90IGNoZWNrZWQsIHRob3VnaCBpdCBpcwotCSAqIHBvc3NpYmxlIGZvciB0aGUgcm9vdCBJRGF0YU1vZGVsIHRvIGNvbnRhaW4gdGhlIHNhbWUgcHJvcGVydHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgbmVzdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEBzZWUgI2lzQmFzZVByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBiZWVuIHNldCBvbiB0aGUgSURhdGFNb2RlbC4gSWYgaXQKLQkgKiBoYXMgbm90IGJlZW4gc2V0LCB0aGVuIGEgY2FsbCB0byBnZXQgdGhlIHNhbWUgcHJvcGVydHkgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgc2V0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgZW5hYmxlZCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZykgaXMgRVJST1IKLQkgKiBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZykgaXMgRVJST1IKLQkgKiAgICAgICAgIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVZhbGlkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBJU3RhdHVzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBSZXR1bnMgYW4gSVN0YXR1cy5PSyBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMKLQkgKiB2YWxpZCB3aXRoIHJlc3BlY3QgaXRzZWxmLCBvdGhlciBwcm9wZXJpdGVzLCBhbmQgYnJvYWRlciBjb250ZXh0IG9mIHRoZSBJRGF0YU1vZGVsLgotCSAqIElTdGF0dXMuRVJST1IgaXMgcmV0dXJuZWQgaWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIGludmFsaWQuIElTdGF0dXMuV0FSTklORyBtYXkgYWxzbyBiZQotCSAqIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb3B0aW1hbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlKHRydWUpIGlzIEVSUk9SIGFuZAotCSAqIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIElTdGF0dXMgcmV0dXJuZWQgYnkgdmFsaWRhdGUodHJ1ZSkgaXMgRVJST1IgYW5kCi0JICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogRXF1YXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlKHRydWUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBJU3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEl0ZXJhdGVzIG92ZXIgYWxsIGJhc2UgcHJvcGVydGllcyBhbmQgbmVzdGVkIG1vZGVscyBJRHMgYW5kIGNhbGxzIHZhbGlkYXRlKFN0cmluZykuIFRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyB3aGVuIGFueSBjYWxsIHRvIHZhbGlkYXRlKFN0cmluZykgcmV0dXJucyBhbiBJU3RhdHVzIGVycm9yIGFuZAotCSAqIHN0b3BBdEZpcnN0RmFpbHVyZSBpcyBzZXQgdG8gdHJ1ZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcEF0Rmlyc3RGYWlsdXJlCi0JICogICAgICAgICAgICB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShib29sZWFuIHN0b3BBdEZpcnN0RmFpbHVyZSk7Ci0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhlCi0JICogPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZSgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIHJldHVybmVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB3aWxsIGJlCi0JICogdGhlIHNhbWUgdmFsdWUgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9sbG93aW5nIHRoZSBleGFtcGxlIGludHJvZHVjZWQgaW4ge0BsaW5rICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKX0sIHN1cHBvc2UKLQkgKiB0aGUgPGNvZGU+U0hJUlRfU0laRTwvY29kZT4gcHJvcGVydHkgaXMgY3VycmVudGx5IHNldCB0byAxLiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgd291bGQKLQkgKiByZXR1cm4gYSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Igd2hvc2UgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZSgpPC9jb2RlPiByZXR1cm5zCi0JICogPGNvZGU+MTwvY29kZT4gYW5kIHdob3NlIDxjb2RlPmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTwvY29kZT4gcmV0dXJucyA8Y29kZT5zbWFsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFsc28sIG5vdGUgdGhhdCBldmVuIGlmIGEgcGFydGljdWxhciBwcm9wZXJ0eSBpcyBub3QgY29uZmluZWQgdG8gYSBmaW5pdGUgc2V0IG9mIHZhbHVlcyBhcwotCSAqIGRlZmluZWQgYnkge0BsaW5rICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKX10aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYQotCSAqIHZhbGlkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiB0aGUgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSAjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYXJyYXkgY29uc2lzdGluZyBvZiBhbGwgdmFsaWQKLQkgKiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBFYWNoCi0JICoge0BsaW5rIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcn0gY29udGFpbnMgYSB2YWx1ZSBhbmQgYSBodW1hbiByZWFkaWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlCi0JICogdmFsdWUuIFRoZSBzZXQgb2YgYWxsIHZhbHVlcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIHRob3NlIHZhbHVlcyB3aGljaCBhcmUgdmFsaWQgZm9yIHRoZQotCSAqIElEYXRhTW9kZWwuIFRoaXMgdmFsdWUgc2V0IG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMgY29uZm9ybSB0byBhIHdlbGwKLQkgKiBkZWZpbmVkIGZpbml0ZSBzZXQuIElmIG5vIHN1Y2ggdmFsdWUgc2V0IGV4aXN0cyBmb3IgdGhlIHByb3BlcnR5LCB0aGVuIGEgMCBsZW5ndGggYXJyYXkgaXMKLQkgKiByZXR1cm5lZC4gPGNvZGU+bnVsbDwvY29kZT4gaXMgbmV2ZXIgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBwcm9wZXJ0eSBjYWxsZWQgPGNvZGU+U0hJUlRfU0laRTwvY29kZT4gd2hpY2ggaXMgYW4KLQkgKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB0eXBlLiBBbHNvIHN1cHBzZSB0aGF0IHZhbGlkIHNoaXJ0IHNpemVzIGFyZSBvbmx5IHNtYWxsLCBtZWRpdW0sIG9yCi0JICogbGFyZ2UuIEhvd2V2ZXIsIHRoZSBhY3R1YWwgdmFsdWVzIHJlcHJlc2VudGluZyBzbWFsbCwgbWVkaXVtLCBhbmQgbGFyZ2UgYXJlIDEsIDIsIGFuZCAzCi0JICogcmVzcGVjdGl2ZWx5LiBBIGNhbGwgdG8gPGNvZGU+Z2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFNISVJUX1NJWkUpPC9jb2RlPiB3b3VsZCByZXR1cm4gYQotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSB3aGVyZSB0aGUgdmFsdWUsIGRlc2NyaXB0aW9uIHBhaXJzIHdvdWxkIGJlIHsoMSwgc21hbGwpLAotCSAqICgyLCBtZWRpdW0pLCAoMywgbGFyZ2UpfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGVuIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycwotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBJRGF0YU1vZGVsTGlzdGVuZXIgdG8gbGlzdGVuIGZvciBEYXRhTW9kZWxFdmVudHMuIElmIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIG5ldyBsaXN0ZW5lciB0byBhZGQuCi0JICogCi0JICogQHNlZSAjcmVtb3ZlTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBkYXRhTW9kZWxMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBJRGF0YU1vZGVsTGlzdGVuZXIuIElmIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgaXMgbm90IGEgcmVnaXN0ZXJlZAotCSAqIGxpc3RlbnIgb24gdGhpcyBJRGF0YU1vZGVsLCB0aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIgZGF0YU1vZGVsTGlzdGVuZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjVkFMVUVfQ0hHCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ0hHID0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHOwotCS8qKgotCSAqIDxwPgotCSAqIEEgY29uc3RhbnQgdXNlZCBmb3Igbm90aWZpY2F0aW9uLiBUaGlzIGNvbnRhbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVycyBiZWNhdXNlIGl0IGRvZXMKLQkgKiBub3QgbWFwIHRvIGFuIGV2ZW50IHR5cGUgb24gRGF0YU1vZGVsRXZlbnQuIFdoZW4gbm90aWZ5aW5nIHdpdGggdGhpcyB0eXBlLCBhIGNoZWNrIGlzIGZpcnN0Ci0JICogZG9uZSB0byBzZWUgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc2V0LiBJZiB0aGUgcHJvcGVydHkgaXMgPGVtcGY+Tk9UPC9lbXBoPiBzZXQsIHRoZW4gYQotCSAqIDxjb2RlPlZBTFVFX0NIRzwvY29kZT4gaXMgZmlyZWQsIG90aGVyd2lzZSBub3RoaW5nIGhhcHBlbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hHID0gRGF0YU1vZGVsRXZlbnQuREVGQVVMVF9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjRU5BQkxFX0NIRwotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9DSEcgPSBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHOwotCS8qKgotCSAqIDxwPgotCSAqIEEgY29uc3RhbnQgdXNlZCBmb3Igbm90aWZpY2F0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIERhdGFNb2RlbEV2ZW50I1ZBTElEX1ZBTFVFU19DSEcKLQkgKiBAc2VlICNub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRF9WQUxVRVNfQ0hHID0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRzsKLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGlmeSBhbGwgbGlzdGVuZXJzIG9mIGEgcHJvcGVydHkgY2hhbmdlLiA8Y29kZT5ldmVudFR5cGU8L2NvZGU+IHNwZWNpZmllcyB0aGUgdHlwZSBvZgotCSAqIGNoYW5nZS4gQWNjZXB0aWJsZSB2YWx1ZXMgZm9yIGV2ZW50VHlwZSBhcmUgPGNvZGU+VkFMVUVfQ0hHPC9jb2RlPiwKLQkgKiA8Y29kZT5ERUZBVUxUX0NIRzwvY29kZT4sIDxjb2RlPkVOQUJMRV9DSEc8L2NvZGU+LCA8Y29kZT5WQUxJRF9WQUxVRVNfQ0hHPC9jb2RlPi4gSWYKLQkgKiB0aGUgZXZlbnRUeXBlIGlzIDxjb2RlPkRFRkFVTFRfQ0hHPC9jb2RlPiBhbmQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBzZXQsIHRoZW4gdGhpcwotCSAqIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFR5cGljYWxseSB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBpbnZva2VkIGJ5IGFuIElEYXRhTW9kZWxQcm92aWRlciBmcm9tIGl0cyBwcm9wZXJ0eVNldAotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgY2hhbmdpbmcKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBmaXJlCi0JICogCi0JICogQHNlZSAjVkFMVUVfQ0hHCi0JICogQHNlZSAjREVGQVVMVF9DSEcKLQkgKiBAc2VlICNFTkFCTEVfQ0hHCi0JICogQHNlZSAjVkFMSURfVkFMVUVTX0NIRwotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZXZlbnRUeXBlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCBkaXNwb3NlIG1ldGhvZCB1c2VkIHRvIGNsZWFuIHVwIGFueSByZXNvdXJjZXMgbm90IGhhbmRsZWQgYnkgZ2VuZXJhbCBnYXJiYWdlCi0JICogY29sbGVjdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBhYTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgaW50ZXJmYWNlIHJlcXVpcmVkIHdoZW4gbGlzdGVuaW5nIGZvciBEYXRhTW9kZWxFdmVudHMgZnJvbSBhbiBJRGF0YU1vZGVsLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNhZGRMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZW50IHdoZW4gRGF0YU1vZGVsRXZlbnRzIG9jY3VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBEYXRhTW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTMyYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxPcGVyYXRpb24gZGVmaW5lcyBhbiBJRGF0YU1vZGVsIGRyaXZlbiB1bmRvYWJsZSBvcGVyYXRpb24uIEV2ZXJ5IElEYXRhTW9kZWxPcGVyYXRpb24KLSAqIG1heSBiZSBleHRlbmRlZCBieSB0aGlyZCBwYXJ0eSBjbGllbnRzIHVzaW5nIHRoZSBleHRlbmRlZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcwotICoge0BsaW5rIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9ufS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBJVW5kb2FibGVPcGVyYXRpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZC4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZCBub3QgaW52b2tlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgb3BlcmF0aW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBJRGF0YU1vZGVsIGZvciB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgSURhdGFNb2RlbCB1c2VkIHRvIHJ1biB0aGlzIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhpcyBvcGVyYXRpb24ncyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgb3BlcmF0aW9uJ3MgSURhdGFNb2RlbC4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIElTY2hlZHVsaW5nUnVsZSB1c2VkIGZvciBleGVjdXRpbmcgdGhpcyBqb2IgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfS4KLQkgKiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlbiBJV29ya3NwYWNlLmdldFJvb3QoKSBpcyB1c2VkIGFzIHRoZSBJU2NoZWR1bGluZ1J1bGUKLQkgKiBkdXJpbmcgZXhlY3V0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU2NoZWR1bGluZ1J1bGUKLQkgKiAKLQkgKiBAc2VlICNnZXRPcGVyYXRpb25FeGVjdXRpb25GbGFncygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgT3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MgdXNlZCBmb3IgZXhlY3V0aW5nIHRoaXMgT3BlcmF0aW9uIGFzIGEgd29ya3NwYWNlIGpvYi4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgT3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MKLQkgKiAKLQkgKiBAc2VlICNnZXRTY2hlZHVsaW5nUnVsZSgpCi0JICogQHNlZW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSwgSVNjaGVkdWxpbmdSdWxlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgc2V0IHRoZSBlbnZpcm9ubWVudCBvbiB0aGlzIG9wZXJhdGlvbiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuIFRoZSBvcGVyYXRpb24KLQkgKiBjYW4gdGhlbiB1c2UgdGhlIGVudmlyb25tZW50IHRvIHJlcG9ydCBzdGF0dXMsIGxvZyBpbmZvcm1hdGlvbiwgYW5kIGFjY2VzcyByZXNvdXJjZXMgaW4gYW4KLQkgKiBlbnZpcm9ubWVudCBuZXV0cmFsIHdheS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gZW52aXJvbm1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBJRW52aXJvbm1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRXZpcm9ubWVudCBzZXQgaW4ge0BsaW5rICNzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQpfX0KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXQgSUVudmlyb25tZW50Ci0JICogCi0JICogQHNlZSAjc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50KQotCSAqLwotCXB1YmxpYyBJRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmUwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBJRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBEYXRhIE1vZGVsCi0gKiBQcm9wZXJ0aWVzIGludGVyZmFjZXMuIFN1YiBpbnRlcmZhY2UgY2xhc3NlcyAoZS5nLgotICogPGNvZGU+c29tZS5jb21wYW55LklGb29EYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzPC9jb2RlPikgc2hvdWxkIGJlIHVzZWQgdG8KLSAqIGNyZWF0ZSBpbnN0YW5jZXMgb2YgSURhdGFNb2RlbHMgdXNpbmcgdGhlCi0gKiB7QGxpbmsgRGF0YU1vZGVsRmFjdG9yeSNjcmVhdGVEYXRhTW9kZWwoQ2xhc3MpfSBtZXRob2QuIEluIG9yZGVyIGZvciB0aGlzCi0gKiBtZWNoYW5pc20gdG8gd29yaywgdGhlIGJhY2tpbmcge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gY2xhc3MgbXVzdCBiZQotICogcmVnaXN0ZXJkIHRvIHN1cHBvcnQgdGhlIHN1YiBJRGF0YU1vZGVsUHJvcGVydGllcyBpbnRlcmZhY2UgaW4gb25lIG9mIHR3bwotICogd2F5cy4gVGhpcyByZWdpc3RyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBieSB0aGUgbW9kZWwgZGV2ZWxvcGVyLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgZmlyc3Qgd2F5IHRvIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzIGlzIGZvcgotICogdGhlIGludGVyZmFjZSB0byBkZWZpbmUgYSBwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyBmaWVsZAotICogd2hpY2ggaXMgc2V0IHRvIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcywgZS5nLgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5wdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IHNvbWUuY29tcGFueS5Gb29EYXRhTW9kZWxQcm92aWRlci5jbGFzczwvY29kZT4KLSAqIDwvcD4KLSAqIFRoZSBhYm92ZSBtZWNoYW5pc20gaXMgcmVjb21tZW5kZWQgd2hlbmV2ZXIgdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30gYW5kCi0gKiB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzc2VzIGFyZSBib3RoIGRlZmluZWQgaW4gdGhlIHNhbWUgcGx1Z2luIHNjb3BlLgotICogQSBzZWNvbmQgbWVjaGFuaXNtIHVzaW5nIHRoZSBEYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQgaXMKLSAqIGF2YWlsYWJsZSB3aGVuIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcyBpcyBkZWZpbmVuZCBvdXRzaWRlIHRoZQotICoge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfSBwbHVnaW4gc2NvcGUuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBBIGJvb2xlYW4gcHJvcGVydHkgZGVmYXVsdHMgdG8gQm9vbGVhbi5UUlVFLiBJZiB0aGlzIGlzIHNldCB0byBCb29sZWFuLkZBTFNFIG5vIGV4dGVuZGVkCi0JICogb3BlcmF0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XX0VYVEVOU0lPTlMgPSAiSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIExpc3QgY29udGFpbmluZyBTdHJpbmcgb2JqZWN0cywgZGVmYXV0bHMgdG8gYW4gZW1wdHkgTGlzdC4gSWYgdGhpcyBsaXN0IGNvbnRhaW5zIGVsZW1lbnRzCi0JICogYW5kIEFMTE9XX0VYVEVOU0lPTlMgaXMgc2V0IHRvIEJvb2xlYW4uVFJVRSwgdGhlbiBvbmx5IGV4dGVuZGVkIG9wZXJhdGlvbnMgbm90IGlkZW50aWZpZWQgaW4KLQkgKiB0aGlzIGxpc3Qgd2lsbCBiZSBleGVjdXRlZC4gVGhlc2Ugc3RyaW5ncyBzaG91bGQgZWl0aGVyIGJlIHRoZSBvcGVyYXRpb24gaWQgb3IgdGhlIGZ1bGx5Ci0JICogcXVhbGlmaWVkIG9wZXJhdGlvbiBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNUX0VYVEVOU0lPTlMgPSAiSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWJmZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIElEYXRhTW9kZWxQcm92aWRlcnMgYXJlIHVzZWQgYnkgdGhlIERhdGFNZG9lbEZhY3RvcnkgdG8gY29uc3RydWN0IElEYXRhTW9kZWxzLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcwotICoge0BsaW5rIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXJ9LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbCIsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBiYWNraW5nIElEYXRhTW9kZWwgZm9yIHRoaXMgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhY2tpbmcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgZm9yIHdoaWNoIHRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUuIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIG9ubHkgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHZhbGlkIHByb3BlcnR5IG5hbWVzLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUHJvdmlkZXJzIHNob3VsZCBwZXJmb3JtIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyB3aGVyZSB0aGUgcHJvdmlkZXIgc2hvdWxkIGRlZmluZSBob3cgZGVmYXVsdCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb21wdXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyB3aGVyZSB0aGUgcHJvdmlkZXIgc2hvdWxkIGRlZmluZSBob3cgcHJvcGVydHkgZW5hYmxlbWVudHMgYXJlIGNvbXB1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIElEYXRhTW9kZWxQcm92aWRlcnMgc2hvdWxkIHBlcmZvcm0gcHJvcGVydHkgdmFsaWRhdGlvbiBoZXJlLiBBbGwgY2FsbHMgdG8KLQkgKiBJRGF0YU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBhcmUgcm91dGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBJRGF0TW9kZWxQcm92aWRlci4gV2hlbgotCSAqIElEYXRhTW9kZWwudmFsaWRhdGUoKSBvciBJRGF0YU1vZGVsLnZhbGlkYXRlKGJvb2xlYW4pIGFyZSBjYWxsZWQgdG8gdmFsaWRhdGUgdGhlIGVudGlyZQotCSAqIElEYXRhTW9kZWwsIGFueSBuZXN0ZWQgbW9kZWwgbmFtZXMgYXJlIGFsc28gcGFzc2VkIHRocm91Z2ggdG8gdGhlIElEYXRhTW9kZWxQcm92aWRlciBmb3IgYQotCSAqIGNoYW5jZSB0byB2YWxpZGF0ZSB0aGUgbmVzdGVkIElEYXRhTW9kZWwgaW4gYW4gYXBwcm9wcmlhdGUgbWFubmVyLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBhbiBJU3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHNwZWNpYWwgY2FsbGJhY2sgaG9vayBmb3IgdGhlIElEYXRhTW9kZWwgcHJvdmlkZXIgdG8gYmUgbm90aWZpZWQgb2YgYSBzZXRQcm9wZXJ0eSgpCi0JICogY2FsbCBpbnZva2VkIG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0dWFsIHZhbHVlIGhhcyBiZWVuCi0JICogc3RvcmVkIGJ5IHRoZSBJRGF0YU1vZGVsIGJ1dCBiZWZvcmUgYW55IGdlbmVyYWwgbm90aWZpY2F0aW9ucyBhcmUgZmlyZWQgdG8gaXRzIGxpc3RlbmVycy4KLQkgKiBUaHVzIHRoaXMgSURhdGFNb2RlbFByb3ZpZGVyIG1heSByZWFjdCB0byB1cGRhdGVzIGFwcm9wcmlhdGVseSBieSBzZXR0aW5nIG90aGVyIHByb3BlcnRpZXMsCi0JICogbm90aWZ5aW5nIGRlZmF1bHQgY2hhbmdlcywgbm90aWZ5aW5nIHZhbGlkIHZhbHVlIGNoYW5nZXMsIGV0Yy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBmaXJlIGEgVkFMVUVfQ0hHIERhdGFNb2RlbEV2ZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKTsKLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpOwotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlN2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkNvbXBvbmVudCBjcmVhdGlvbiBhbmQgUmVmZXJlbmNlZCBDb21wb25lbnQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyBBUEkgIGZvciBEYXRhIE1vZGVsIFByb3ZpZGVyIGZyYW1ld29yayBmb3IgYnVpbGluZyBleGVjdXRhYmxlCi0gICAgICAgIGFuZCB1bmRvYWJsZSBvcGVyYXRpb25zIHVzaW5nIGRhdGEgbW9kZWxzLCB0aGVpciBwcm92aWRlcnMgYW5kIHByb3ZpZGVyIGludGVyZmFjZXMgdGhhdAotICAgICAgICBjb250YWluIHRoZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIHByb3ZpZGVycyB0byBzZXQgYW5kIHJldHJpZXZlIHRoZXNlIHByb3BlcnRpZXNlLiAKLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFmNzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSB0aGF0IGRlZmluZXMgdGhlIHByb3BldGllcyB0aGF0IGNhbiBiZSBzZXQgb24gYSBmbGV4aWJsZQotICAgICAgICBwcm9qZWN0IGRhdGFtb2RlbCB0byBkcml2ZSB0aGUgdGhlIHdpemFyZCBhbmQgb3BlcmF0aW9ucy4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwNjljNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0Fic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBDb21tb24gc3VwZXJjbGFzcyBmb3IgZW5hYmxlbWVudC1hd2FyZSAoZS5nLiwgdXNpbmcgZnVuY3Rpb24gZ3JvdXBzIG9yIGFjdGl2aWl0aWVzKSBleHRlbnNpb24KLSAqIHBvaW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHByaW9yaXR5OwotCi0JcHVibGljIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhbkVsZW1lbnQpIHsKLQkJc3VwZXIoYW5FbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldEVuYWJsZW1lbnRJZGVudGlmaWVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIElFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGdldElEKCksIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SUQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCWlmIChwcmlvcml0eSA9PSBudWxsKQotCQkJcHJpb3JpdHkgPSBuZXcgSW50ZWdlcihGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRGdW5jdGlvblByaW9yaXR5KGdldElEKCkpKTsKLQkJcmV0dXJuIHByaW9yaXR5LmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHApIHsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkID0gZ2V0RW5hYmxlbWVudElkZW50aWZpZXIocCk7Ci0JCXJldHVybiBpZC5pc0VuYWJsZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0FkYXB0YWJpbGl0eVV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZThhMTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0YWJpbGl0eVV0aWxpdHkgewotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXR1cm4gKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQllbHNlCi0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIGFkYXB0ZXIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0NvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM1NzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIGlkIG9mIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCXBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpOwotCQkJCS8vIFRPRE8ganNob2xsIGlzIHRoaXMgY29ycmVjdD8/PwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0RvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDczMzIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLS8qKgotICogT3RoZXIgdGhpbmdzIHRvIGRlbGV0ZToKLSAqIAotICogVGhlIHd0cHVpQWN0aW9uIGV4dGVuc2lvbiBwb2ludCBhbmQgc2NoZW1hIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aQotICovCi0KLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UvbWV0aG9kL2ZpZWxkCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGJlaW5nIHVzZWQgdG8gdHJhY2sgY29kZSBzbGF0ZWQgZm9yIHJlbW92YWwuIEFueSBjbGFzcyBvciBpbnRlcmZhY2UKLSAqIGltcGxlbWVudGluZyBvciBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UgcmVzcGVjdGl2ZWx5IHNob3VsZCBub3QgYmUgdXNlZC4gQWxsIHN1Y2ggY2xhc3NlcyBhbmQKLSAqIGludGVyZmFjZXMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMS41LgotICogCi0gKiBBbnkgbWV0aG9kIG9yIGZpZWxkIHdpdGggamF2YWRvYyByZWZlcmVuY2luZyB0aGlzIGludGVyZmFjZSBzaG91bGQgbm90IGJlIHVzZWQgYW5kIHdpbGwgYmUKLSAqIGRlbGV0ZWQgcG9zdCBXVFAgMS41Ci0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0V4Y2VwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTdkNjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBmYWN0b3IgY29tbW9uIGNvZGUgZm9yIGltcGxlbWVudGVycyBvZiBJQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhlbHBlciB7Ci0JLyoqCi0JICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByaXZhdGUgRXhjZXB0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JCW1lc3NhZ2VzLmFkZChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4Y2VwdGlvbi5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQobmVzdGVkLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pCi0JCQkJbmVzdGVkID0gKChJV3JhcHBlZEV4Y2VwdGlvbikgbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCWVsc2UKLQkJCQluZXN0ZWQgPSBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXNzYWdlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMKLQkgKiAgICAgICAgICAgICAgICBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZChtZXNzYWdlc1tpXSk7Ci0JCQlpZiAoaSA8IG1lc3NhZ2VzLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGEyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9IYXNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIEhhc2hVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFNFRUQgPSAxMTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgTVVMVEkgPSAzMTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBpbnQgaSl7Ci0JCXJldHVybiBzZWVkICogTVVMVEkgKyBpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBPYmplY3Qgb2JqKXsKLQkJcmV0dXJuIGhhc2goc2VlZCwgbnVsbCAhPSBvYmogPyBvYmouaGFzaENvZGUoKSA6IFNFRUQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBib29sZWFuIGIpewotCQlyZXR1cm4gaGFzaChzZWVkLCBiID8gMSA6IFNFRUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTYXZlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjdjZTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIERlZmluZXMgdGhlIEFQSSBmb3IgY29waW5nIHdpdGggYXR0ZW1wdHMgdG8gb3ZlcndyaXRlIHJlYWQtb25seSBmaWxlcyBvciBzYXZlIGZhaWx1cmVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNhdmVIYW5kbGVyIHsKLQlwdWJsaWMgdm9pZCBhY2Nlc3MoKTsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjIxZDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19LRVkgPSAiSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KElGaWxlIFtdIGZpbGVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNmM2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEFyY2hpdmVSdW50aW1lIGFuZCBBcmNoaXZlV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3NTZhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXNzYWdlcyB7Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlcygpIHsKLQkJaW5pdGlhbGl6ZUJ1bmRsZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsID8gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlTdHJpbmcgcGF0dGVybiA9IGRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NjM1MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB0aGF0IGNvdWxkIGdldCB0aHJvd24gZHVyaW5nIHNhdmUgb2YgYW4gZWRpdCBtb2RlbDsgY2xpZW50cyBzaG91bGQgdXNlCi0gKiB7QGxpbmsgI2dldENvbmNhdGVuYXRlZE1lc3NhZ2VzfXRvIGdldCBhbGwgdGhlIG1lc3NhZ2VzIG9mIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucyB0bwotICogcmVwb3J0IHRoZSBmYWlsdXJlLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQwMDE4OTAxOTEwNzMxMjQwTDsKLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlckhlYWRsZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMDdjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8xOS8yMDAxIDExOjQwOjU5IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlSGFuZGxlckhlYWRsZXNzIGltcGxlbWVudHMgSVNhdmVIYW5kbGVyIHsKLQkvKioKLQkgKiBIZWFkbGVzc1NhdmVIYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVIYW5kbGVySGVhZGxlc3MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWNjZXNzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBoYW5kbGVTYXZlRmFpbGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aHJvdyBleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKElXRlRXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQkJaWYgKG5lc3RlZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUobmVzdGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlpZiAoZXggaW5zdGFuY2VvZiBJV0ZUV3JhcHBlZEV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKElXRlRXcmFwcGVkRXhjZXB0aW9uKSBleCk7Ci0JCWVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKENvcmVFeGNlcHRpb24pIGV4KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoQ29yZUV4Y2VwdGlvbiBleCkgewotCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBzdGF0dXMgPSBleC5nZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUaHJvd2FibGUgbmVzdGVkID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKENvcmVFeGNlcHRpb24pIG5lc3RlZCk7Ci0JCXJldHVybiBzdGF0dXMuZ2V0Q29kZSgpID09IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1cy5GQUlMRURfV1JJVEVfTE9DQUw7Ci0JfQotCi0JLyoqCi0JICogcmVsZWFzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotCS8qKgotCSAqIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBlcnJvciA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVuYWJsZV90b19zYXZlX3JlYWQtb25seV9mX0VSUk9SXyIsIG5ldyBPYmplY3RbXXthRmlsZS5nZXRGdWxsUGF0aCgpfSk7IC8vJE5PTi1OTFMtMSQgPSAiVW5hYmxlIHRvIHNhdmUgcmVhZC1vbmx5IGZpbGU6ICIKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGVycm9yKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVyUmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGVlMjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotCi0vKioKLSAqIEEgcmVnaXN0cnkgZm9yIHRoZSBkZWZhdWx0IElTYXZlSGFuZGxlciB0byB1c2Ugd2hlbiBzYXZpbmcgZWRpdCBtb2RlbHMKLSAqLwotcHVibGljIGNsYXNzIFNhdmVIYW5kbGVyUmVnaXN0ZXIgewotCXByaXZhdGUgc3RhdGljIElTYXZlSGFuZGxlciBzYXZlSGFuZGxlcjsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIGFuZCBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByb3RlY3RlZCBTYXZlSGFuZGxlclJlZ2lzdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNhdmVIYW5kbGVyIGdldFNhdmVIYW5kbGVyKCkgewotCQlpZiAoc2F2ZUhhbmRsZXIgPT0gbnVsbCkKLQkJCXNhdmVIYW5kbGVyID0gKElTYXZlSGFuZGxlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgic2F2ZUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2F2ZUhhbmRsZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODQ0NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0ZUVkaXQgewotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVzIG11c3QgY29udGFpbiBvbmx5IHtAbGluayBJRmlsZX1zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoTGlzdCBmaWxlcyl7Ci0JCWlmKGZpbGVzID09IG51bGwgfHwgZmlsZXMuc2l6ZSgpID09IDApewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlRWRpdCggKElGaWxlIFtdKWZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRWRpdChJRmlsZVtdIGZpbGVzKSB7Ci0JCWlmKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQgdmFsaWRhdG9yID0gKElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0KSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LkNMQVNTX0tFWSk7Ci0JCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGVFZGl0KGZpbGVzKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc3RhdHVzLmlzT0soKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmZTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcyBpbXBsZW1lbnRzIElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJRmlsZVtdIGZpbGVzKSB7Ci0JCWZpbmFsIExpc3QgZmlsZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDtpPGZpbGVzLmxlbmd0aDsgaSsrKXsKLQkJCWlmKGZpbGVzW2ldLmV4aXN0cygpICYmIGZpbGVzW2ldLmlzUmVhZE9ubHkoKSl7Ci0JCQkJZmlsZXNMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYoZmlsZXNMaXN0LnNpemUoKSA+IDApewotCQkJSUZpbGUgW10gZmlsZXNUb1ZhbGlkYXRlID0gKElGaWxlIFtdKWZpbGVzTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlc0xpc3Quc2l6ZSgpXSk7Ci0JCQlyZXR1cm4gdmFsaWRhdGVFZGl0SW1wbChmaWxlc1RvVmFsaWRhdGUpOwotCQl9Ci0JCXJldHVybiBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdEltcGwoSUZpbGVbXSBmaWxlc1RvVmFsaWRhdGUpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXNUb1ZhbGlkYXRlLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzNmZGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxMCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkRlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5JTXNnTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldvcmtiZW5jaFV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXVFBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJTXNnTG9nZ2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgV1RQUGx1Z2luIGluc3RhbmNlID0gbnVsbDsgCi0JcHVibGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgV1RQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRQbHVnaW5JRCgpKTsKLQkJCXNldFJlbmRlcmVyKGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGdldE1zZ0xvZ2dlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5PU19NQUNPU1guZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpID8gZmFsc2UgOiBuZXcKLQkJCQlqYXZhLmlvLkZpbGUoImEiKS5jb21wYXJlVG8obmV3IGphdmEuaW8uRmlsZSgiQSIpKSAhPSAwOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJV29ya2JlbmNoVXRpbC5zZXRXb3JrYmVuY2hJc1J1bm5pbmcodHJ1ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NGVkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBQcm9qZWN0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEFkZHMgYSBvbGQgbmF1dHVyZSB0byBhIHByb2plY3QsIEZJUlNULCB0aGlzIGlzIHVzZWQgdG8gbWFrZSBwcm9qZWN0IGJhY2t3YXJkIGNvbXBhdGlibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT2xkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCi0JCS8vY2hlY2sgaWYgdGhlIG9sZCBuYXR1cmUgZG9lcyBub3QgZXhpc3QKLQkJYm9vbGVhbiBhZGROYXR1cmUgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXZOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmF0dXJlID0gcHJldk5hdHVyZXNbaV07Ci0JCQlpZiAobmF0dXJlLmVxdWFscyhuYXR1cmVJZCkpIHsKLQkJCQlhZGROYXR1cmUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoYWRkTmF0dXJlKSB7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCQluZXdOYXR1cmVzWzBdID0gbmF0dXJlSWQ7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF0dXJlIGluIHRoZSBwcm9qZWN0IGluIHRoZSBpbmRleCBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT2xkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCwgaW50IGluZGV4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0KLQkJLy9jaGVjayBpZiB0aGUgb2xkIG5hdHVyZSBkb2VzIG5vdCBleGlzdAotCQlib29sZWFuIGFkZE5hdHVyZSA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYXR1cmUgPSBwcmV2TmF0dXJlc1tpXTsKLQkJCWlmIChuYXR1cmUuZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCWFkZE5hdHVyZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhZGROYXR1cmUpIHsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgaW5kZXgpOwotCi0JCQluZXdOYXR1cmVzW2luZGV4XSA9IG5hdHVyZUlkOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgaW5kZXgsIG5ld05hdHVyZXMsIGluZGV4ICsgMSwgcHJldk5hdHVyZXMubGVuZ3RoIC0gaW5kZXgpOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVJlc291cmNlLkFWT0lEX05BVFVSRV9DT05GSUcsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5hdXR1cmUgdG8gYSBwcm9qZWN0LCBGSVJTVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAxLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzWzBdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5hdHVyZSB0byBhIHByb2plY3QsIExBU1QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0TGFzdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBhIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpbnQgc2l6ZSA9IHByZXZOYXR1cmVzLmxlbmd0aDsKLQkJaW50IG5ld3NpemUgPSAwOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJYm9vbGVhbiBtYXRjaGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocHJldk5hdHVyZXNbaV0uZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCW1hdGNoZm91bmQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbmV3TmF0dXJlc1tuZXdzaXplKytdID0gcHJldk5hdHVyZXNbaV07Ci0JCX0KLQkJaWYgKCFtYXRjaGZvdW5kKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCAiVGhlIG5hdHVyZSBpZCAiICsgbmF0dXJlSWQgKyAiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nW10gdGVtcCA9IG5ld05hdHVyZXM7Ci0JCW5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW25ld3NpemVdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIG5ld05hdHVyZXMsIDAsIG5ld3NpemUpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0TmF0dXJlRGVzY3JpcHRvcihuYXR1cmVJZCkgPT0gbnVsbCkgewotCQkJLy8gVGhlIG5hdHVyZSBkb2VzIG5vdCBleGlzdCwgc28gZG8gbm90IGF0dGVtcHQgdG8gZGUtY29uZmlndXJlIGl0IHdoaWxlIHJlbW92aW5nIGl0LgotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVJlc291cmNlLkFWT0lEX05BVFVSRV9DT05GSUcgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpIG9iamVjdDsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzdWx0ID0gKChJUmVzb3VyY2UpIG9iamVjdCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODJkNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogIAotICovCi1wdWJsaWMgY2xhc3MgV1RQUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid3RwX2NvbW1vbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmFiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIFdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjIxOTI1NTgxNjAzNjQ4NTM4TDsKLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgV3JhcHBlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCwgU3RyaW5nIHMpIHsKLQkJc3VwZXIodGFyZ2V0LCBzKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChnZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlzLnByaW50bG4oIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWRlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+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+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGUwMjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ2OGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDM6MTI6NDIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzRlM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNNb24gQXByIDE3IDAzOjEyOjM2IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNiZmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMi5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvU25pcHBldHNDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjBjNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvU25pcHBldHNDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImxpYnYxMDAwIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB2aWV3IHRvIGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIG1hcmt1cCwgYWxvbmcgd2l0aCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4gZXhpc3RpbmcgZmlsZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImxpYnYxMTAwIj4KLTxkZXNjcmlwdGlvbj5TdXBwbHkgdmFsdWVzIGluIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgU25pcHBldHMgdmlldyBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBBc3NpZ24gYSB2YWx1ZSB0byB0aGUgdmFyaWFibGVzIGJlaW5nIGluc2VydGVkLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iSW5zZXJ0aW5nIGFuZCBlZGl0aW5nIGl0ZW1zIGluIHRoZSBhY3RpdmUgZWRpdG9yIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTIwMCI+Ci08ZGVzY3JpcHRpb24+SW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgYXMgeW91IHdhbnQgaXQgYmUgZGlzcGxheWVkIGluIHRoZSBTbmlwcGV0cyB2aWV3LiAgT3B0aW9uYWxseSwgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgPGI+RGVzY3JpcHRpb248L2I+IGZpZWxkLgotCi1TZWxlY3QgdGhlIDxiPkhpZGU8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoaXMgc25pcHBldCBvYmplY3Qgbm90IHZpc2libGUgaW4gdGhlIHZpZXcuCi0KLVRvIGFkZCBhIG5ldyB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPk5ldzwvYj4gcHVzaCBidXR0b24sIGFuZCB0eXBlIHZhbHVlcyBpbiB0aGUgY2VsbHMgb2YgdGhlIDxiPlZhcmlhYmxlczwvYj4gdGFibGUuIFRoZSA8Yj5OYW1lPC9iPiBmaWVsZCByZXByZXNlbnRzIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCB3aGVuIHlvdSBhZGQgaXQgdG8gYSBkb2N1bWVudC4gPGI+RGVmYXVsdCB2YWx1ZTwvYj4gaXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIG5hbWVkIHZhcmlhYmxlLiBPcHRpb25hbGx5LCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaWFibGUuCi0KLUluc2VydCB0aGUgdmFyaWFibGVzIHRoYXQgeW91IGRlZmluZSBpbnRvIHRoZSA8Yj5UZW1wbGF0ZSBQYXR0ZXJuPC9iPiBmaWVsZCB1c2luZyB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlIFBsYWNlaG9sZGVyPC9iPiBwdXNoIGJ1dHRvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImxpYnYxMzAwIj4KLTxkZXNjcmlwdGlvbj5UeXBlIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2F0ZWdvcnkgaW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkIGFuZCBvcHRpb25hbGx5IGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXRlZ29yeSBpbiB0aGUgPGI+RGVzY3JpcHRpb248L2I+IGZpZWxkLgotCi1TZWxlY3QgPGI+T3BlbiBkcmF3ZXIgYXQgc3RhcnQtdXA8L2I+IHRvIGhhdmUgdGhlIGNhdGVnb3J5IGRyYXdlciBvcGVuZWQgaW4gdGhlIFNuaXBwZXRzIHZpZXcgd2hlbiB0aGUgd29ya2JlbmNoIHN0YXJ0cyB1cC4KLQotWW91IGNhbiBzcGVjaWZ5IGhvdyB5b3Ugd2FudCB0aGUgY2F0ZWdvcnkgZHJhd2VyIGRpc3BsYXllZCBpbiB0aGUgU25pcHBldHMgdmlldyBieSBzZWxlY3RpbmcgYSByYWRpbyBidXR0b24gZm9yIHRoZSA8Yj5TaG93L0hpZGUgRHJhd2VyPC9iPiBmaWVsZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+SW1wb3J0PC9iPiBkaWFsb2csIHdoaWNoIGxldHMgeW91IGltcG9ydCBzbmlwcGV0IGNhdGVnb3JpZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwMjAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5FeHBvcnQ8L2I+IGRpYWxvZywgd2hpY2ggbGV0cyB5b3UgZXhwb3J0IHNuaXBwZXQgY2F0ZWdvcmllcyB0byB0aGUgZmlsZSBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwMzAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgY29udGVudCB0eXBlcyB0aGF0IHNob3VsZCBiZSB2aXNpYmxlIGluIHRoaXMgZHJhd2VyIGZvciBpbiB0aGUgU25pcHBldHMgdmlldy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDQwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBhZGRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBTbmlwcGV0cyB2aWV3IGFzIGEgbmV3IGl0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNTAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGN1dHMgdGhlIHNlbGVjdGVkIFNuaXBwZXQgaXRlbSB0byB0aGUgY2xpcGJvYXJkLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDA2MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBtZW51IGl0ZW0gY29waWVzIHRoZSBzZWxlY3RlZCBTbmlwcGV0IGl0ZW0gdG8gdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNzAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGNyZWF0ZXMgYSBuZXcgU25pcHBldHMgdmlldyBpdGVtIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ic25pcDAwODAiPgotPGRlc2NyaXB0aW9uPlR5cGUgYSBuYW1lIGZvciB0aGUgY2F0ZWdvcnkuIFRoZSBjYXRlZ29yeSBhcHBlYXJzIGluIHRoZSBDdXN0b21pemUgUGFsZXR0ZSBkaWFsb2cgYm94LiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBjYXRlZ29yeSwgeW91IGNhbiBhZGQgaXRlbXMgdG8gdGhlIGNhdGVnb3J5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQzZGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBTbmlwcGV0c0NvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjAyNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AKLUJ1bmRsZS1OYW1lLjAgPSBDb21tb24gV1NUIGluZm9wb3BzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUxNzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iU25pcHBldHNDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODM4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjc5YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdWkuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU1N2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzAzODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSNNb24gSmFuIDMwIDIzOjQxOjU4IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhNmE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6MTE6NDkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc2M2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm92aXNpb25hbC5lZGl0b3JzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzkzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1VSSBVdGlsaXR5IGNsYXNzZXMgZm9yIGFjdGlvbnMsIGRyYWcnbidkcm9wIGFuZCB3aXphcmRzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmE4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q5Y2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JCi08IS0tCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jb21tb24vb3ZlcnZpZXcuaHRtbCIgLz4gLS0+Ci0KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RTaW5nbGVGaWxlVmlldyIgLz4gIC0tPiAgPCEtLSA/LCBkb2VzIGVjbGlwc2UgcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydD8gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJSZXNvdXJjZUZpbHRlciIgLz4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RNdWx0aUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdFNpbmdsZUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlRhYmxlTmF2aWdhdG9yIiAvPiAtLT4gICAgICAgPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9Ik5hdmlnYWJsZVRhYmxlVmlld2VyIiAvPiAtLT4gPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyLmFjdGlvbiI+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iQ3V0QWN0aW9uIiAvPiAgLS0+ICAgIDwhLS0gTm8gdG8gdGhlc2UgZm91ciwgIHNob3VsZCBiZSByZW1vdmVkPyAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlBhc3RlQWN0aW9uIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkNvcHlBY3Rpb24iIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkVkaXRBY3Rpb24iIC8+IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSI+IC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IlVJUGx1Z2luIiAvPiAgLS0+ICAgIDwhLS0gTm8sIGRlbGV0ZSB0aGlzIC0tPgotPCEtLSAJPHR5cGUgbmFtZT0iT3ZlcmxheUljb25NYW5hZ2VyIiAvPiAgLS0+IDwhLS0gIE5vIC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IldpbmRvd1V0aWxpdHkiIC8+ICAtLT4gICA8IS0tIFJlbW92ZSBjbGFzcywgY2xlYW4gdXAgeHNkLnVpIC0tPgotPCEtLSAgICA8dHlwZSBuYW1lPSJJbWFnZUZhY3RvcnkiIC8+ICAtLT4gICA8IS0tIE5vIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLndpemFyZHMiPiAgLS0+Ci08IS0tICAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24iIC8+ICAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIC0tPgotPCEtLSAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIiAvPiAtLT4gPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgYW5kIE9wZXJhdGlvbiAtLT4KLTwhLS0gIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgLz4gIC0tPiA8IS0tIHJlZmVyZW5jZWQgYnkgWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgd2hpY2ggaXMgZGVwcmVjYXRlZCBhbmQgZ29pbmcgdG8gYmUgcmVtb3ZlZCBpbiBNNCAgLS0+Ci08IS0tCTwvcGFja2FnZT4gLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJWaWV3ZXJEcm9wQWRhcHRlciIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRHJhZ0FuZERyb3BDb21tYW5kIiAvPiAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJEcmFnQW5kRHJvcE1hbmFnZXIiIC8+IC0tPiAgPCEtLSAgIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iT2JqZWN0VHJhbnNmZXIiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlZpZXdlckRyYWdBZGFwdGVyIiAvPiAtLT4KLTwhLS0JPC9wYWNrYWdlPiAgLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucmVzb3VyY2UiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlJlc291cmNlRGVsZXRlTGlzdGVuZXIiIC8+ICAtLT4gIDwhLS0gbm8gcmVmZXJlbmNlcyAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kaWFsb2dzIj4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iU2VsZWN0U2luZ2xlRmlsZURpYWxvZyIgLz4gIC0tPiAgICA8IS0tIE5vLCBzaG91bGQgbG9vayBpbnRvIGJhc2UgZm9yIHN1cHBvcnQ/IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyIj4KLQkJPHR5cGUgbmFtZT0iQWN0aW9uSGFuZGxlckxpc3RlbmVyIiAvPgotCTwvcGFja2FnZT4KLS0tPgotPCEtLSBwcm92aXNpb25hbCBBUElzIC0tPgotPCEtLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiPgotCQk8dHlwZSBuYW1lPSJVUklSZXNvbHZlclBsdWdpbiIgIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyRXh0ZW5zaW9uIiBpbXBsZW1lbnQ9InRydWUiLz4KLQk8L3BhY2thZ2U+Ci0tLT4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvY29sbGFwc2VBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRmZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvZXhwYW5kQWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5NDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIzZDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9zYXZlYXNfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhMjFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvdHNlYXJjaF9kcGRuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTJmMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSEgUGx1Z2luIHByb3BlcnRpZXMKLXBsdWdpbk5hbWUgICAgICAgICAgICAgICA9IEVjbGlwc2UgQmFzZSBVSSBleHRlbnNpb25zCi1wbHVnaW5Qcm92aWRlciAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotCi0hIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3Jrc3BhY2UgRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi1fVUlfUE9QVVBfRVhQQU5EX0FMTAkgPSBFeHBhbmQgQWxsCi1fVUlfUE9QVVBfQ09MTEFQU0VfQUxMCSA9IENvbGxhcHNlIEFsbAotCQotX1VJX0lNUE9SVF9CVVRUT04gICAgICAgICAgPSBJbXBvcnQgRmlsZXMuLi4KLV9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQID0gSW1wb3J0IGZpbGVzIGZyb20gZmlsZSBzeXN0ZW0KLQotCi0hIFNlbGVjdE11bHRpRmlsZVBhZ2UKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzIHJlZmVycyB0byBfVUlfTEFCRUxfU0VMRUNURURfRklMRVMgbGFiZWwgYWJvdmUKLV9VSV9BRERfQlVUVE9OX1RPT0xfVElQICAgID0gQWRkIGZpbGVzIHRvIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCA9IFJlbW92ZSBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVAgPSAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgb2YgZm9sbG93aW5nIHRocmVlIGxpbmVzCi1fVUlfQUREX0JVVFRPTiAgICAgICAgICAgICA9ID4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgID0gPAotX1VJX1JFTU9WRV9BTExfQlVUVE9OICAgICAgPSA8PAotCi0hIFNlbGVjdEphdmFQcm9qZWN0VmlldwotX1VJX0xBQkVMX0NIT09TRV9GT0xERVIgPSBTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlcjoKLQotISBTZWxlY3RKYXZhUHJvamVjdERpYWxvZwotX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT04gPSBDb250YWluZXIgU2VsZWN0aW9uCi0KLSEgVGV4dFZpZXdlck9wZXJhdGlvbkFjdGlvbgotX1VJX01FTlVfQ09QWSAgICAgICAgID0gJkNvcHkKLV9VSV9NRU5VX0NVVCAgICAgICAgICA9IEN1JnQKLV9VSV9NRU5VX0RFTEVURSAgICAgICA9IERlbGV0ZQotX1VJX01FTlVfUEFTVEUgICAgICAgID0gJlBhc3RlCi1fVUlfTUVOVV9QUkVGSVggICAgICAgPSBQcmVmaXgKLV9VSV9NRU5VX1JFRE8gICAgICAgICA9IFJlZG8KLV9VSV9NRU5VX1NFTEVDVF9BTEwgICA9IFNlbGVjdCBBbGwKLV9VSV9NRU5VX1NISUZUX0xFRlQgICA9IFNoaWZ0IExlZnQKLV9VSV9NRU5VX1NISUZUX1JJR0hUICA9IFNoaWZ0IFJpZ2h0Ci1fVUlfTUVOVV9TVFJJUF9QUkVGSVggPSBTdHJpcCBQcmVmaXgKLV9VSV9NRU5VX1VORE8gICAgICAgICA9IFVuZG8KLQotISBTb3VyY2VWaWV3ZXJHb3RvTGluZUFjdGlvbgotX1VJX01FTlVfR09UT19MSU5FICAgICAgICAgICA9IEdvIFRvIExpbmUuLi4KLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFICAgPSBHbyBUbyBMaW5lCi1fVUlfR09UT19MSU5FX0RJQUxPR19URVhUICAgID0gRW50ZXIgTGluZSBOdW1iZXIKLQotX1VJX0ZJTEVfQ0hBTkdFRF9USVRMRSA9IEZpbGUgQ2hhbmdlZAotX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVMgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEID0gVGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gVGhpcyBlZGl0b3Igd2lsbCBiZSBjbG9zZWQuCi1fVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBsb2FkIHRoZSBjaGFuZ2VzPwotX1VJX1NBVkVfQlVUVE9OID0gU2F2ZQotX1VJX0NMT1NFX0JVVFRPTiA9IENsb3NlCi0KLQotISBYU0wgUHJlZmVyZXJlbmNlCi1fVUlfWFNMVF9TRUxFQ1QgICAgID0gU2VsZWN0IHdoaWNoIGVsZW1lbnQgdG8gdXNlIGZvciB5b3VyIHN0eWxlc2hlZXQKLV9VSV9YU0xUX1NUWUxFU0hFRVQgPSAmVXNlIDx4c2w6c3R5bGVzaGVldD4KLV9VSV9YU0xUX1RSQU5TRk9STSAgPSBVJnNlIDx4c2w6dHJhbnNmb3JtPgotCi0hIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLV9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSID0gU2V0IHRoZSBkZWZhdWx0IFhTTCBsYXVuY2hlciBmb3IgdGhlIFhTTCBEZWJ1Z2dpbmcgYW5kIFRyYW5zZm9ybWF0aW9uIHRvb2wKLV9VSV9YU0xfREVCVUdfTE9DQUwgICAgICAgICAgID0gJlhTTCBhcHBsaWNhdGlvbgotX1VJX1hTTF9ERUJVR19SRU1PVEUgICAgICAgICAgPSBYUyZMIHJlbW90ZSBhcHBsaWNhdGlvbgotX1VJX1hTTF9USUxFX0VESVRPUiAgICAgICAgICAgPSAmU2hvdyBhbGwgZGVidWdnaW5nIGZpbGVzIGluIGEgdGlsZSBlZGl0b3IKLV9VSV9YU0xfREVCVUdfQU5EX1RSQU5TRk9STSAgID0gJlJ1biB0cmFuc2Zvcm1hdGlvbiBhbmQgb3BlbiBhIGRlYnVnZ2luZyBzZXNzaW9uCi1fVUlfWFNMX0NPTlRFWFRfVVJJICAgICAgICAgICA9IENvbnRleHQgUGF0aCAKLV9VSV9YU0xfQ09OVEVYVCAgICAgICAgICAgICAgID0gU3BlY2lmeSBhICZjb250ZXh0IHBhdGggZm9yIHJlc29sdmluZyBVUklzIGluIHhzbDppbXBvcnQsIHhzbDppbmNsdWRlIG9yIGRvY3VtZW50KCkKLQotCi1fVUlfT1ZFUlJJREVfRklMRSAgICA9IE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcwotX1VJX0pBVkFfRVhJU1RfRklMRTEgPSBUaGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyBhbHJlYWR5IGV4aXN0LgotX1VJX0pBVkFfRVhJU1RfRklMRTIgPSBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci0gICAgICAKLSEgc29tZSBvcHRpb25zIHN0cmluZ3MgY29tbW9uIHRvIHNldmVyYWwgcGx1Z2lucwotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEUgPSBFcnJvciBDcmVhdGluZyBGaWxlCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDID0gRXJyb3IgY3JlYXRpbmcgZmlsZSAiezB9IgotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfTE9OR19ERVNDID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSAiezB9Ii4KLV9VSV9QQVJFTlRfRk9MREVSX0lTX1JFQURfT05MWSA9IFRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHJlYWQgb25seS4KLV9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVCA9IFVua25vd24gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHdyaXRlYWJsZS4KLV9VSV9VTktOT1dOX0VSUk9SID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotCi0hIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSA9IFNlbGVjdCBmaWxlIGxvY2F0aW9uCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICA9IFdvcmtzcGFjZSBwcm9qZWN0cwotX1VJX1JBRElPX1VSTCAgICAgICAgICAgICAgPSBIVFRQCi0KLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCSAgID0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCSAgID0gUXVhbGlmaWVyOgotCi0hLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLV9VSV9MQUJFTF9XT1JLSU5HX1NFVFMgICAgICAgICAgICAgICAgID0gV29ya2luZyBTZXRzCi0KLV9VSV9MQUJFTF9OZXc9TmV3Li4uCi1fVUlfTEFCRUxfREVDTEFSQVRJT05fTE9DQVRJT049RGVjbGFyYXRpb24gTG9jYXRpb246Ci1fVUlfTEFCRUxfQ0hPT1NFPUNob29zZS4uLgotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgSGVyZSBpcyB0aGUgbGlzdCBvZiBFcnJvciBzdHJpbmcgdGhhdCBoYXZlIG1lc3NhZ2UgSURzIC0gbWFrZSBzdXJlIHRoZXkgYXJlIHVuaXF1ZQotISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRSA9IFRoZSBzcGVjaWZpZWQgY29udGFpbmVyIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgaXRzIHBhdGggbXVzdCBzdGFydCBhdCB0aGUgd29ya3NwYWNlIHJvb3QuCi0KLV9FUlJPUl9MT0NBTF9MT0NBVElPTiAgICAgPSBUaGUgbG9jYWwgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkLgotX0VSUk9SX05PVF9KQVZBX1BST0pFQ1QgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBub3QgYSBKYXZhIHByb2plY3QuCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgZXJyb3IgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi1fRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJV0FYMTIwMUUgSW52YWxpZCBwYWNrYWdlIG5hbWUgZXJyb3I6Ci0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aAotX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgICAgICAgICAgICA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLV9FUlJPUl9DT05UQUlORVJfTk9UX0pBVkFfQlVJTERQQVRIID0gVGhlIGNvbnRhaW5lciBpcyBub3QgYSBKYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoaXMgcHJvamVjdAotX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUiA9IFRoZSBwcm9qZWN0IGlzIG5vdCBvbiB0aGUgYnVpbGQgcGF0aC4gIFNlbGVjdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHByb2plY3QuCi0KLV9VSV9FUlJPUiAgICAgICAgICAgICA9IEVycm9yCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgd2FybmluZyBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9XQVJOX0lOVkFMSURfSkFWQV9QQUNLQUdFID0gSW52YWxpZCBwYWNrYWdlIG5hbWUgd2FybmluZzoKLQotX0VSUk9SX1JPT1RfRUxFTUVOVCA9IFRoZSBYTUwgc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gYW55IGdsb2JhbCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcm9vdCBlbGVtZW50LgotX0VSUk9SX1NBVklOR19GSUxFID0gRXJyb3Igc2F2aW5nIGZpbGUgInswfSIKLQotISBGaWxlIFZhbGlkYXRvcgotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfVElUTEUgPSBGYWlsZWQgdG8gY2hlY2sgb3V0IG5lY2Vzc2FyeSBmaWxlcwotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfTUVTU0FHRSA9IEdlbmVyYXRpb24gZmFpbGVkLiBOZWNlc3NhcnkgZmlsZXMgY291bGQgbm90IGJlIGNoZWNrZWQgb3V0LiAKLQotISBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotX1VJX0VSUk9SX1ZBTElEQVRFX0VESVRfRkFJTF9PTkVfRklMRSA9IEVycm9yCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci5tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkudGl0bGU9T3ZlcndyaXRlCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5Lm1lc3NhZ2U9RG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHswfT8KLQotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M9Q3JlYXRpbmcgZXhhbXBsZSBwcm9qZWN0cy4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5vcF9kZXNjX3Byb2o9Q29uZmlndXJpbmcgcHJvamVjdC4uLgotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwYjYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/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+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTk3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvQWJzdHJhY3RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklRdWVyeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuTWVzc2FnZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCQotCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47Ci0JcHJvdGVjdGVkIFNlYXJjaFNjb3BlIGZTY29wZTsKLQlwcm90ZWN0ZWQgU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2NvcGVEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBBYnN0cmFjdFNlYXJjaFF1ZXJ5KFN0cmluZyBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoKTsKLQkJZlBhdHRlcm49IHBhdHRlcm47Ci0JCWZTY29wZT0gc2NvcGU7Ci0JCWZTY29wZURlc2NyaXB0aW9uPSBzY29wZURlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfbGFiZWw7IAotCX0KLQotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJaWYgKGZSZXN1bHQgPT0gbnVsbCkgewotCQkJZlJlc3VsdD0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJCW5ldyBTZWFyY2hSZXN1bHRVcGRhdGVyKGZSZXN1bHQpOwotCQl9Ci0JCXJldHVybiBmUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdExhYmVsKGludCBuTWF0Y2hlcykgewotCQlpZiAobk1hdGNoZXMgPT0gMSkgewotCQkJaWYgKGZQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJCU9iamVjdFtdIGFyZ3M9IHsgZlBhdHRlcm4sIGZTY29wZURlc2NyaXB0aW9uIH07Ci0JCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbCwgYXJncyk7IAotCQkJfQotCQkJT2JqZWN0W10gYXJncz0geyAiIiwgZlNjb3BlRGVzY3JpcHRpb24gfTsKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2gsIGFyZ3MpOyAKLQkJfQotCQlpZiAoZlBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBhcmdzPSB7IGZQYXR0ZXJuLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm4sIGFyZ3MpOyAKLQkJfQotCQlPYmplY3RbXSBhcmdzPSB7ICIiLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaCwgYXJncyk7IAotCQotCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlmaW5hbCBTZWFyY2hSZXN1bHQgdGV4dFJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgZ2V0U2VhcmNoUmVzdWx0KCk7Ci0JCXRleHRSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCVNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yIGNvbGxlY3Rvcj0gbmV3IFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yKHRleHRSZXN1bHQpOwotCQlTdHJpbmcgc2VhcmNoU3RyaW5nPSBmUGF0dGVybjsKLQkJaWYgKHNlYXJjaFN0cmluZy50cmltKCkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKCcqJykpKSB7Ci0JCQlzZWFyY2hTdHJpbmc9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgbWVzc2FnZT0gU2VhcmNoTWVzc2FnZXMuVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOyAKLQkJTXVsdGlTdGF0dXMgc3RhdHVzPSBuZXcgTXVsdGlTdGF0dXMoTmV3U2VhcmNoVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLQkJCi0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0JCi0JCVF1YWxpZmllZE5hbWUgdHlwZU5hbWUgPSBRdWFsaWZpZWROYW1lLnZhbHVlT2Yoc2VhcmNoU3RyaW5nKTsKLQkJCi0JCXRyeSB7Ci0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBjcmVhdGVTZWFyY2hQYXR0ZXJuKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgY29sbGVjdG9yLCBmU2NvcGUsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkKLQkJcmV0dXJuIHN0YXR1czsKLQotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKFF1YWxpZmllZE5hbWUgdHlwZU5hbWUpOwotCQotCXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRVcGRhdGVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElRdWVyeUxpc3RlbmVyIHsKLQkJU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQkJcHVibGljIFNlYXJjaFJlc3VsdFVwZGF0ZXIoU2VhcmNoUmVzdWx0IHJlc3VsdCkgewotCQkJZlJlc3VsdD0gcmVzdWx0OwotCQkJTmV3U2VhcmNoVUkuYWRkUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YT0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSAhPSBudWxsKQotCQkJCWhhbmRsZURlbHRhKGRlbHRhKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlbHRhKElSZXNvdXJjZURlbHRhIGQpIHsKLQkJCXRyeSB7Ci0JCQkJZC5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJCQlJUmVzb3VyY2UgcmVzPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQkJCU1hdGNoW10gbWF0Y2hlcz0gZlJlc3VsdC5nZXRNYXRjaGVzKHJlcyk7Ci0JCQkJCQkJCQlmUmVzdWx0LnJlbW92ZU1hdGNoZXMobWF0Y2hlcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJCQkJLy8gaGFuZGxlIGNoYW5nZWQgcmVzb3VyY2UKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5QWRkZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBxdWVyeVJlbW92ZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQlpZiAoZlJlc3VsdC5lcXVhbHMocXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCkpKSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJTmV3U2VhcmNoVUkucmVtb3ZlUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcXVlcnlTdGFydGluZyhJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5RmluaXNoZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLSAgICB9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmMxNDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL0lTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotcHVibGljIGludGVyZmFjZSBJU2VhcmNoQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIGRlY2xhcmF0aW9uLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBERUNMQVJBVElPTlM9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKiBSZWZlcmVuY2VzIGNhbiBjb250YWluIGltcGxlbWVudGVycyBzaW5jZSB0aGV5IGFyZSBtb3JlIGdlbmVyaWMga2luZAotCSAqIG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgUkVGRVJFTkNFUz0gMTsKLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24sIG9yIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBBTExfT0NDVVJSRU5DRVM9IDI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmZGZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlYXJjaE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUGFnZV9zb3J0X2J5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5XaXRoTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm5fZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVMYWJlbFByb3ZpZGVyX2NvdW50X2Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOWY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ncm91cF9yZWZlcmVuY2VzPSBSZSZmZXJlbmNlcwotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbD0gJldvcmtzcGFjZQotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw9ICZQcm9qZWN0Ci1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbD0gV29ya2luZyAmU2V0Li4uCi1GaWxlU2VhcmNoUGFnZV9saW1pdGVkX2Zvcm1hdD17MH0gKHNob3dpbmcgezF9IG9mIHsyfSBmaWxlcykKLUZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcj1Db3VsZCBub3QgY3JlYXRlIG1hcmtlcgotRmlsZVNlYXJjaFBhZ2Vfc29ydF9ieV9sYWJlbD1Tb3J0IEJ5Ci1PcGVuV2l0aE1lbnVfbGFiZWw9IE9wZW4gV2l0JmgKLQotRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0PXswfSAoezF9IG1hdGNoZXMpCi1GaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsPTxyZW1vdmVkIHJlc291cmNlPgotCi1GaWxlU2VhcmNoUXVlcnlfbGFiZWw9RmlsZSBTZWFyY2gKLQotIyBUaGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgcGF0dGVybiwgdGhlIHNlY29uZCBieSB0aGUgY291bnQgYW5kIHRoZSB0aGlyZCBieSB0aGUgc2NvcGUKLUZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuPSAnJ3swfScnIC0gezF9IG1hdGNoZXMgaW4gezJ9Ci0KLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHBhdHRlcm4sIHRoZSBzZWNvbmQgYnkgdGhlIHNjb3BlCi1GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbD0gJyd7MH0nJyAtIDEgbWF0Y2ggaW4gezF9Ci0KLUZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsX2ZpbGVOYW1lU2VhcmNoPTEgZmlsZSBuYW1lIG1hdGNoaW5nICcnezB9JycgaW4gezF9Ci1GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaD17MX0gZmlsZSBuYW1lcyBtYXRjaGluZyAnJ3swfScnIGluIHsyfQotCi1UZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U9IFByb2JsZW1zIGVuY291bnRlcmVkIGR1cmluZyB0ZXh0IHNlYXJjaC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hRdWVyeVJlc3VsdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQyMzRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi1jbGFzcyBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHQgZlNlYXJjaFJlc3VsdDsKLQotCQotCXByb3RlY3RlZCBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvcihTZWFyY2hSZXN1bHQgcmVzdWx0KXsKLQkJc3VwZXIoKTsKLQkJZlNlYXJjaFJlc3VsdD0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hdGNoIGFNYXRjaCA9IG5ldyBNYXRjaChtYXRjaC5nZXRGaWxlKCksIG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCWZTZWFyY2hSZXN1bHQuYWRkTWF0Y2goYU1hdGNoKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTQxZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMgSUVkaXRvck1hdGNoQWRhcHRlciwgSUZpbGVNYXRjaEFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBFTVBUWV9BUlI9IG5ldyBNYXRjaFswXTsKLQkKLQlwcml2YXRlIEFic3RyYWN0U2VhcmNoUXVlcnkgZlF1ZXJ5OwotCi0JcHVibGljIFNlYXJjaFJlc3VsdChBYnN0cmFjdFNlYXJjaFF1ZXJ5IGpvYikgewotCQlmUXVlcnk9IGpvYjsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiIpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZlF1ZXJ5LmdldFJlc3VsdExhYmVsKGdldE1hdGNoQ291bnQoKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0TWF0Y2hlcyhmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIChJRmlsZSllbGVtZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlJRWRpdG9ySW5wdXQgZWk9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoZWkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWk7Ci0JCQlyZXR1cm4gbWF0Y2guZ2V0RWxlbWVudCgpLmVxdWFscyhmaS5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JJbnB1dCBlaT0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlaSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmk9IChJRmlsZUVkaXRvcklucHV0KSBlaTsKLQkJCXJldHVybiBnZXRNYXRjaGVzKGZpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gZlF1ZXJ5OwotCX0KLQkKLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyNDdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuRGVsZWdhdGluZ0RyYWdBZGFwdGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklDb250ZXh0TWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdFZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5GaWxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuU29ydEFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JJZ25vcmluZ1ZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByaXZhdGUgZmluYWwgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQkJcHVibGljIERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKG51bGwpOyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCi0JCQlmTGFiZWxQcm92aWRlcj0gbGFiZWxQcm92aWRlcjsKLQkJfQotCQkKLQkgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JICAgICAgICBTdHJpbmcgbmFtZTE9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZTEpOwotCSAgICAgICAgU3RyaW5nIG5hbWUyPSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KGUyKTsKLQkgICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotCSAgICAgICAgICAgIG5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgaWYgKG5hbWUyID09IG51bGwpCi0JICAgICAgICAgICAgbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gZ2V0Q29sbGF0b3IoKS5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JICAgIH0KLQkgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNnZXRDb2xsYXRvcigpCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgQ29sbGF0b3IgZ2V0Q29sbGF0b3IoKSB7Ci0JCQlpZiAoY29sbGF0b3IgPT0gbnVsbCkgewotCQkJCWNvbGxhdG9yPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNvbGxhdG9yOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU09SVElORz0gIm9yZy5lY2xpcHNlLnNlYXJjaC5yZXN1bHRwYWdlLnNvcnRpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGlvbkdyb3VwIGZBY3Rpb25Hcm91cDsKLQlwcml2YXRlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRTb3J0T3JkZXI7Ci0JcHJpdmF0ZSBTb3J0QWN0aW9uIGZTb3J0QnlOYW1lQWN0aW9uOwotCXByaXZhdGUgU29ydEFjdGlvbiBmU29ydEJ5UGF0aEFjdGlvbjsKLQkKLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIEVkaXRvck9wZW5lciBmRWRpdG9yT3BlbmVyPSBuZXcgRWRpdG9yT3BlbmVyKCk7Ci0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0hPV19JTl9UQVJHRVRTPSBuZXcgU3RyaW5nW10geyBJUGFnZUxheW91dC5JRF9SRVNfTkFWIH07Ci0JcHJpdmF0ZSAgc3RhdGljIGZpbmFsIElTaG93SW5UYXJnZXRMaXN0IFNIT1dfSU5fVEFSR0VUX0xJU1Q9IG5ldyBJU2hvd0luVGFyZ2V0TGlzdCgpIHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBTSE9XX0lOX1RBUkdFVFM7Ci0JCX0KLQl9OwotCi0JLy8gcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJLy8gVE9ETwotCQkvL2ZTb3J0QnlOYW1lQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X25hbWVfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfTEFCRUxfUEFUSCk7IAotCQkvL2ZTb3J0QnlQYXRoQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X3BhdGhfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfUEFUSF9MQUJFTCk7IAotICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLyoKLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoU2VhcmNoUHJlZmVyZW5jZVBhZ2UuTElNSVRfVEFCTEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpIHx8IFNlYXJjaFByZWZlcmVuY2VQYWdlLkxJTUlUX1RBQkxFX1RPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCQkJCWdldFZpZXdQYXJ0KCkudXBkYXRlTGFiZWwoKTsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkqLwotfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRHJhZ0FkYXB0ZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzPSBuZXcgVHJhbnNmZXJbXSB7IFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQlpbnQgb3BzPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJCi0JCURlbGVnYXRpbmdEcmFnQWRhcHRlciBhZGFwdGVyPSBuZXcgRGVsZWdhdGluZ0RyYWdBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JCQotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BzLCB0cmFuc2ZlcnMsIGFkYXB0ZXIpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCUZpbGVMYWJlbFByb3ZpZGVyIGlubmVyTGFiZWxQcm92aWRlcj0gbmV3IEZpbGVMYWJlbFByb3ZpZGVyKHRoaXMsIGZDdXJyZW50U29ydE9yZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKGlubmVyTGFiZWxQcm92aWRlciwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcih0aGlzKSk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKGlubmVyTGFiZWxQcm92aWRlcikpOwotCQlmQ29udGVudFByb3ZpZGVyPSAoSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJYWRkRHJhZ0FkYXB0ZXJzKHZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJRmlsZUxhYmVsUHJvdmlkZXIgaW5uZXJMYWJlbFByb3ZpZGVyPSBuZXcgRmlsZUxhYmVsUHJvdmlkZXIodGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19MQUJFTCk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihpbm5lckxhYmVsUHJvdmlkZXIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoaW5uZXJMYWJlbFByb3ZpZGVyKSk7Ci0JCWZDb250ZW50UHJvdmlkZXI9IChJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlhZGREcmFnQWRhcHRlcnModmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGU9IChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlJV29ya2JlbmNoUGFnZSB3YlBhZ2U9IFVJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yPSBJREUub3BlbkVkaXRvcih3YlBhZ2UsIChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpLCBhY3RpdmF0ZSk7Ci0JCWlmIChvZmZzZXQgIT0gMCAmJiBsZW5ndGggIT0gMCkgewotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvcj0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2Zmc2V0LCBsZW5ndGgpOwotCQkJfSBlbHNlIGlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCXNob3dXaXRoTWFya2VyKGVkaXRvciwgZmlsZSwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93V2l0aE1hcmtlcihJRWRpdG9yUGFydCBlZGl0b3IsIElGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXIgbWFya2VyPSBudWxsOwotCQl0cnkgewotCQkJbWFya2VyPSBmaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcz0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKG9mZnNldCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyLCBlKTsgCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1ncikgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWdyKTsKLQkJYWRkU29ydEFjdGlvbnMobWdyKTsKLQkJZkFjdGlvbkdyb3VwLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJZkFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShtZ3IpOwotLy8JCUZpbGVTZWFyY2hRdWVyeSBxdWVyeT0gKEZpbGVTZWFyY2hRdWVyeSkgZ2V0SW5wdXQoKS5nZXRRdWVyeSgpOwotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRTb3J0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCWlmIChnZXRMYXlvdXQoKSAhPSBGTEFHX0xBWU9VVF9GTEFUKQotCQkJcmV0dXJuOwotCQlNZW51TWFuYWdlciBzb3J0TWVudT0gbmV3IE1lbnVNYW5hZ2VyKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfYnlfbGFiZWwpOyAKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlOYW1lQWN0aW9uKTsKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlQYXRoQWN0aW9uKTsKLQkJCi0JCWZTb3J0QnlOYW1lQWN0aW9uLnNldENoZWNrZWQoZkN1cnJlbnRTb3J0T3JkZXIgPT0gZlNvcnRCeU5hbWVBY3Rpb24uZ2V0U29ydE9yZGVyKCkpOwotCQlmU29ydEJ5UGF0aEFjdGlvbi5zZXRDaGVja2VkKGZDdXJyZW50U29ydE9yZGVyID09IGZTb3J0QnlQYXRoQWN0aW9uLmdldFNvcnRPcmRlcigpKTsKLQkJCi0JCW1nci5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVAsIHNvcnRNZW51KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGFydChJU2VhcmNoUmVzdWx0Vmlld1BhcnQgcGFydCkgewotCQlzdXBlci5zZXRWaWV3UGFydChwYXJ0KTsKLQkJZkFjdGlvbkdyb3VwPSBuZXcgTmV3VGV4dFNlYXJjaEFjdGlvbkdyb3VwKHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmQWN0aW9uR3JvdXAuZGlzcG9zZSgpOwotCQkvLyBTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWZDb250ZW50UHJvdmlkZXIuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZkNvbnRlbnRQcm92aWRlci5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihpbnQgc29ydE9yZGVyKSB7Ci0JCWZDdXJyZW50U29ydE9yZGVyPSBzb3J0T3JkZXI7Ci0JCURlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGxwV3JhcHBlcj0gKERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCSgoRmlsZUxhYmVsUHJvdmlkZXIpIGxwV3JhcHBlci5nZXRMYWJlbFByb3ZpZGVyKCkpLnNldE9yZGVyKHNvcnRPcmRlcik7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJZ2V0U2V0dGluZ3MoKS5wdXQoS0VZX1NPUlRJTkcsIGZDdXJyZW50U29ydE9yZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQl0cnkgewotCQkJZkN1cnJlbnRTb3J0T3JkZXI9IGdldFNldHRpbmdzKCkuZ2V0SW50KEtFWV9TT1JUSU5HKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vZkN1cnJlbnRTb3J0T3JkZXI9IGZTb3J0QnlOYW1lQWN0aW9uLmdldFNvcnRPcmRlcigpOwotCQl9Ci0JCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCUludGVnZXIgdmFsdWU9IG1lbWVudG8uZ2V0SW50ZWdlcihLRVlfU09SVElORyk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlmQ3VycmVudFNvcnRPcmRlcj0gdmFsdWUuaW50VmFsdWUoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlU3RhdGUobWVtZW50byk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihLRVlfU09SVElORywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gU0hPV19JTl9UQVJHRVRfTElTVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nIGxhYmVsPSBzdXBlci5nZXRMYWJlbCgpOwotCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJVGFibGVWaWV3ZXIgdHY9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCi0JCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSBnZXRJbnB1dCgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW50IGl0ZW1Db3VudD0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdHYuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKGdldElucHV0KCkpLmxlbmd0aDsKLQkJCQlpbnQgZmlsZUNvdW50PSBnZXRJbnB1dCgpLmdldEVsZW1lbnRzKCkubGVuZ3RoOwotCQkJCWlmIChpdGVtQ291bnQgPCBmaWxlQ291bnQpIHsKLQkJCQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7IAotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W117bGFiZWwsIG5ldyBJbnRlZ2VyKGl0ZW1Db3VudCksIG5ldyBJbnRlZ2VyKGZpbGVDb3VudCl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQljbGFzcyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyOwkJCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0JCXByaXZhdGUgT3BlbkZpbGVBY3Rpb24gZk9wZW5BY3Rpb247Ci0JCXByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gZk9wZW5Qcm9wZXJ0aWVzRGlhbG9nOwotCi0JCXB1YmxpYyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAoSVZpZXdQYXJ0IHBhcnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwocGFydCk7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZT0gcGFydC5nZXRTaXRlKCk7Ci0JCQlmU2VsZWN0aW9uUHJvdmlkZXI9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWZQYWdlPSBzaXRlLmdldFBhZ2UoKTsKLQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZz0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKHNpdGUsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCQlmT3BlbkFjdGlvbj0gbmV3IE9wZW5GaWxlQWN0aW9uKGZQYWdlKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJCWVsc2UKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gdmlldyBtdXN0IGV4aXN0IGlmIHdlIGNyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgaXQuCi0JCQkKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlhZGRPcGVuV2l0aE1lbnUobWVudSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmIChmT3BlblByb3BlcnRpZXNEaWFsb2cgIT0gbnVsbCAmJiBmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNFbmFibGVkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiZmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNBcHBsaWNhYmxlRm9yU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSkKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwotCQkJfQotCQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBtZW51LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuOwotCQkKLQkJCU9iamVjdCBvPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpKQotCQkJCXJldHVybjsgCi0JCQotCQkJZk9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBmT3BlbkFjdGlvbik7Ci0JCQotCQkJLy8gQ3JlYXRlIG1lbnUKLQkJCUlNZW51TWFuYWdlciBzdWJtZW51PSBuZXcgTWVudU1hbmFnZXIoU2VhcmNoTWVzc2FnZXMuT3BlbldpdGhNZW51X2xhYmVsKTsgCi0JCQlzdWJtZW51LmFkZChuZXcgT3BlbldpdGhNZW51KGZQYWdlLCAoSUFkYXB0YWJsZSlvKSk7Ci0JCQotCQkJLy8gQWRkIHRoZSBzdWJtZW51LgotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBzdWJtZW51KTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXIpIHsKLQkJCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcik7Ci0JCQlzZXRHbG9iYWxBY3Rpb25IYW5kbGVycyhhY3Rpb25CYXIpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwkJCi0JCX0KLQl9CQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTdkMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlI9IG5ldyBPYmplY3RbMF07Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHRQYWdlIGZQYWdlOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoU2VhcmNoUmVzdWx0UGFnZSBwYWdlKSB7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSAoKFNlYXJjaFJlc3VsdClpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0gICAJICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCQkvLyBFdmVuIG1vcmUgaW1wb3J0YW50bHkgd2UgbmVlZCB0byBkaXNjdXNzIHdpdGggdGhlIGJhc2UgZ3V5cyB0byBnZXQgQVBJIGxpbmVkIHVwIGZvciB0aGlzIChzZWUgYnVnIDE2MzE3NykuCi0JCQkvKgotCQkJaW50IHRhYmxlTGltaXQ9IFNlYXJjaFByZWZlcmVuY2VQYWdlLmdldFRhYmxlTGltaXQoKTsKLQkJCWlmIChTZWFyY2hQcmVmZXJlbmNlUGFnZS5pc1RhYmxlTGltaXRlZCgpICYmIGVsZW1lbnRzLmxlbmd0aCA+IHRhYmxlTGltaXQpIHsKLQkJCQlPYmplY3RbXSBzaG93bkVsZW1lbnRzPSBuZXcgT2JqZWN0W3RhYmxlTGltaXRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIHNob3duRWxlbWVudHMsIDAsIHRhYmxlTGltaXQpOwotCQkJCXJldHVybiBzaG93bkVsZW1lbnRzOwotCQkJfSovCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgewotCQkJZlJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlUYWJsZVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcigpOwotCSAgICAvLyBjcyA6IEkndmUgY29tbWVudCAndGFibGVMaW1pdGVkJyByZWxhdGVkIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLy9ib29sZWFuIHRhYmxlTGltaXRlZD0gU2VhcmNoUHJlZmVyZW5jZVBhZ2UuaXNUYWJsZUxpbWl0ZWQoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh2aWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdmlld2VyLnVwZGF0ZSh1cGRhdGVkRWxlbWVudHNbaV0sIG51bGwpOwotCQkJCWVsc2UgewotCQkJCQkvL2lmICghdGFibGVMaW1pdGVkIHx8IHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIDwgU2VhcmNoUHJlZmVyZW5jZVBhZ2UuZ2V0VGFibGVMaW1pdCgpKQotCQkJCQkJdmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gKFRhYmxlVmlld2VyKSBmUGFnZS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzljZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUj0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXAgZkNoaWxkcmVuTWFwOwotCQotCVNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotCQlmVHJlZVZpZXdlcj0gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSB7Ci0JCQlpbml0aWFsaXplKChTZWFyY2hSZXN1bHQpIG5ld0lucHV0KTsKLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQpIHsKLQkJZlJlc3VsdD0gcmVzdWx0OwotCQlmQ2hpbGRyZW5NYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IHJlc3VsdC5nZXRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zZXJ0KGVsZW1lbnRzW2ldLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudD0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5zZXJ0Q2hpbGQocGFyZW50LCBjaGlsZCkpIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkPSBwYXJlbnQ7Ci0JCQlwYXJlbnQ9IGdldFBhcmVudChjaGlsZCk7Ci0JCX0KLQkJaWYgKGluc2VydENoaWxkKGZSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJZlRyZWVWaWV3ZXIuYWRkKGZSZXN1bHQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgYWxyZWFkeSB3YXMgYSBjaGlsZCBvZiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnllPC9jb2RlPiBpZiB0aGUgY2hpbGQgd2FzIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQgY2hpbGRyZW49IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuPSBuZXcgSGFzaFNldCgpOwotCQkJZkNoaWxkcmVuTWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQkvLyBwcmVjb25kaXRpb24gaGVyZTogIGZSZXN1bHQuZ2V0TWF0Y2hDb3VudChjaGlsZCkgPD0gMAotCQotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQlmQ2hpbGRyZW5NYXAucmVtb3ZlKGVsZW1lbnQpOwotCQkJCU9iamVjdCBwYXJlbnQ9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBmUmVzdWx0KTsKLQkJCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5ncy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJU2V0IGNoaWxkcmVuPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9BUlI7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkKLQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKGZSZXN1bHQpOwotCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWxlbWVudDsKLQkJCXJldHVybiByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvRmlsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZTI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLkZpbGVMYWJlbFByb3ZpZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19MQUJFTD0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0xBQkVMX1BBVEg9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QQVRIX0xBQkVMPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfUEFUSD0gNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdTZXBhcmF0b3JGb3JtYXQ9ICJ7MH0gLSB7MX0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgZlBhZ2U7Ci0JCQotCXByaXZhdGUgaW50IGZPcmRlcjsKLQlwcml2YXRlIFN0cmluZ1tdIGZBcmdzPSBuZXcgU3RyaW5nWzJdOwotCi0JcHVibGljIEZpbGVMYWJlbFByb3ZpZGVyKEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIHBhZ2UsIGludCBvcmRlckZsYWcpIHsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCQlmUGFnZT0gcGFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcihpbnQgb3JkZXJGbGFnKSB7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gZk9yZGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZT0gKElSZXNvdXJjZSllbGVtZW50OwotCQlTdHJpbmcgdGV4dD0gbnVsbDsKLQotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKQotCQkJdGV4dD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfcmVtb3ZlZF9yZXNvdXJjZV9sYWJlbDsgCi0JCQotCQllbHNlIHsKLQkJCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJaWYgKHBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCkKLQkJCQlwYXRoPSBwYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJaWYgKGZPcmRlciA9PSBTSE9XX0xBQkVMIHx8IGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQl0ZXh0PSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KHJlc291cmNlKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQkJZkFyZ3NbMF09IHRleHQ7Ci0JCQkJCWZBcmdzWzFdPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl0ZXh0PSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0PSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChmT3JkZXIgPT0gU0hPV19QQVRIX0xBQkVMKSB7Ci0JCQkJCWZBcmdzWzBdPSB0ZXh0OwotCQkJCQlmQXJnc1sxXT0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChyZXNvdXJjZSk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpbnQgbWF0Y2hDb3VudD0gMDsKLQkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gZlBhZ2UuZ2V0SW5wdXQoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJbWF0Y2hDb3VudD0gcmVzdWx0LmdldE1hdGNoQ291bnQoZWxlbWVudCk7Ci0JCWlmIChtYXRjaENvdW50IDw9IDEpCi0JCQlyZXR1cm4gdGV4dDsKLQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0OyAKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgdGV4dCwgbmV3IEludGVnZXIobWF0Y2hDb3VudCkgfSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQ7Ci0JCUltYWdlIGltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShyZXNvdXJjZSk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXIuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZkxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlmTGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL0lGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWY0MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKgotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTFkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5NZXNzYWdlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBmb3JtYXQgbWVzc2FnZSBzdHJpbmdzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7IG9iamVjdH0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gb2JqZWN0cykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgb2JqZWN0cyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gTm90IGZvciBpbnN0YW50aWF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MjgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotCi0vKioKLSAqIEEgZHJhZyBhZGFwdGVyIHRoYXQgdHJhbnNmZXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyA8L2NvZGU+Ci0gKiBJUmVzb3VyY2U8L2NvZGU+LiBPbmx5IHRob3NlIGVsZW1lbnRzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHBhcnQgCi0gKiBvZiB0aGUgdHJhbnNmZXIgd2hpY2ggY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuIDxjb2RlPklSZXNvdXJjZQotICogPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlciBleHRlbmRzIERyYWdTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNlbGVjdGlvbiBwcm92aWRlciB0byBhY2Nlc3MgdGhlIHZpZXdlcidzIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZQcm92aWRlcj0gcHJvdmlkZXI7Ci0JCUFzc2VydC5pc05vdE51bGwoZlByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQlyZXR1cm4gUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50LmRvaXQ9IGNvbnZlcnRTZWxlY3Rpb24oKS5zaXplKCkgPiAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCByZXNvdXJjZXM9IGNvbnZlcnRTZWxlY3Rpb24oKTsKLQkJZXZlbnQuZGF0YT0gcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFldmVudC5kb2l0KQotCQkJcmV0dXJuOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29udmVydFNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzPSBmUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHM7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbi5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50PSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5MWVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqIERlcml2ZWQgZnJvbSBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkuU29ydEFjdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hSZXN1bHRQYWdlOwotCi1wdWJsaWMgY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBpbnQgZlNvcnRPcmRlcjsKLQlwcml2YXRlIFNlYXJjaFJlc3VsdFBhZ2UgZlBhZ2U7Ci0JCi0JcHVibGljIFNvcnRBY3Rpb24oU3RyaW5nIGxhYmVsLCBTZWFyY2hSZXN1bHRQYWdlIHBhZ2UsIGludCBzb3J0T3JkZXIpIHsKLQkJc3VwZXIobGFiZWwpOwotCQlmUGFnZT0gcGFnZTsKLQkJZlNvcnRPcmRlcj0gc29ydE9yZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZlBhZ2Uuc2V0U29ydE9yZGVyKGZTb3J0T3JkZXIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U29ydE9yZGVyKCkgewotCQlyZXR1cm4gZlNvcnRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUxNThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlOwotCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQ7Ci0gICAgcHJpdmF0ZSBMaXN0IG1hc3RlckNvbXBvbmVudExpc3Q7Ci0gICAgCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYm90dG9tQ29tcG9zaXRlOyAKLSAgICBwcml2YXRlIFRleHQgdGV4dEZpbHRlcjsKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29tcG9uZW50VGFibGVWaWV3ZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTG9jYXRpb25MYWJlbCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLSAgICBwcm90ZWN0ZWQgVmlld0Zvcm0gZmlsZUxvY2F0aW9uVmlldzsgICAgCi0gICAgcHJvdGVjdGVkIENMYWJlbCBsb2NhdGlvbkxhYmVsOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgaXRlbSBwcmV2aW91c2x5IHNlbGVjdGVkIGluIHRoZSB0YWJsZQotCXByaXZhdGUgVGFibGVJdGVtIHByZXZJdGVtOwotCXByaXZhdGUgU3RyaW5nIHByZXZJdGVtVGV4dDsKLQotCXByb3RlY3RlZCBPYmplY3QgY29tcG9uZW50U2VsZWN0aW9uOwotICAgIHByb3RlY3RlZCBPYmplY3QgcXVhbGlmaWVyVGV4dFNlbGVjdGlvbjsKLSAgICAKLQlwcm90ZWN0ZWQgVG9vbEJhciBmaWx0ZXJUb29sQmFyOwotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBIYXNoTWFwIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sID0gbmV3IEhhc2hNYXAoKTsgIAotICAgIHByaXZhdGUgQnV0dG9uIG5ld0J1dHRvbjsKLSAKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgICAgICB0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uaW5pdCh0aGlzKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRUZXh0RmlsdGVyRm9jdXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGV4dEZpbHRlckZvY3VzKCkgewotICAgICAgICB0ZXh0RmlsdGVyLnNldEZvY3VzKCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KGRpYWxvZ1RpdGxlKTsKLQotICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSAoR3JpZERhdGEpIG1haW5Db21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgICAgICBnRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0gICAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KG1haW5Db21wb3NpdGUpOyAgICAgICAgCi0gICAgICAgIC8vIFN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIENvbXBvc2l0ZSB0byBhZGQgZGVzaXJlZCB3aWRnZXRzCi0gICAgICAgIC8vdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBpbnRyb2R1Y2UgYSBtZXRob2QgaGVyZSB0byBjb250YWluIHRoaXMKLSAgICAgICAgLy8gc28gd2UgY2FuIGFkZCBkaWZmZXJlbnQgcGFyZW50IG90aGVyIHRoYW4gJ3RvcENvbXBvc2l0ZScKLSAgICAgICAgQ29tcG9zaXRlIGZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dEZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZmlsdGVyTGFiZWxBbmRUZXh0LnNldExheW91dChsYXlvdXRGaWx0ZXJMYWJlbEFuZFRleHQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBUZXh0IHRleHRGaWx0ZXIKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbHRlckxhYmVsID0gbmV3IExhYmVsKGZpbHRlckxhYmVsQW5kVGV4dCwgU1dULk5PTkUpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0RmlsdGVyTGFiZWxUZXh0KCkpOy8vICsgIig/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOiIpOwotICAgICAgICBHcmlkRGF0YSBmaWx0ZXJMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZmlsdGVyTGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZmlsdGVyTGFiZWwuc2V0TGF5b3V0RGF0YShmaWx0ZXJMYWJlbERhdGEpOwotCi0gICAgICAgIHRleHRGaWx0ZXIgPSBuZXcgVGV4dChmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGV4dEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgICAgICAgIAotICAgICAgICB0ZXh0RmlsdGVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUZXh0RmlsdGVyTW9kaWZ5QWRhcHRlcigpKTsKLSAgICAgICAgR3JpZERhdGEgdGV4dEZpbHRlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgdGV4dEZpbHRlckRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHRleHRGaWx0ZXJEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICB0ZXh0RmlsdGVyLnNldExheW91dERhdGEodGV4dEZpbHRlckRhdGEpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSU5ld0NvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05ldyk7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgQ29tcG9uZW50IFRhYmxlVmlld2VyCi0gICAgICAgIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uY3JlYXRlV2lkZ2V0QWJvdmVRdWFsaWZpZXJCb3gobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgUXVhbGlmaWVyIExpc3Qgd2lkZ2V0Ci0gICAgICAgIExhYmVsIHF1YWxpZmllckxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUVVBTElGSUVSKTsKLQkJcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChmaWxlTG9jYXRpb25MYWJlbCk7Ci0KLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldyA9IG5ldyBWaWV3Rm9ybShtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSAyMjsKLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAKLSAgICAJbG9jYXRpb25MYWJlbCA9IG5ldyBDTGFiZWwoZmlsZUxvY2F0aW9uVmlldywgU1dULkZMQVQpOwotICAgICAgICBmaWxlTG9jYXRpb25WaWV3LnNldENvbnRlbnQobG9jYXRpb25MYWJlbCk7Ci0gICAgCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmaWxlTG9jYXRpb25WaWV3LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUYWJsZVZpZXdlciB2aWEgdGhlIHByb3ZpZGVyCi0gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBzZXQvZ2V0IHRoZSBDb250ZW50UHJvdmlkZXI/Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBtYWtlIHRoZSBkZWZhdWx0IHNlYXJjaCBzY29wZQotICAgICAgICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotICAgICAgICAvLyBhcmd1bWVudCBpbiB0byBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QgYnV0IHdlIHNob3VsZCBwcm92aWRlCi0gICAgICAgIC8vIGdldHRlcnMvc2V0dGVycyB0byBhbGxvdyB0aGUgZGVmYXVsdCB0byBiZSBjb250cm9sbGVkCi0gICAgICAgIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChudWxsKTsKLSAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKCIiKTsKLQotICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBDcmVhdGVzIHRoZSBDb21wb25lbnQgVGFibGVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyID0gY3JlYXRlRmlsdGVyTWVudUFuZFRhYmxlVmlld2VyKGJhc2UpOyAgICAKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAJLy8gQ2hhbmdpbmcgdGhlIHRleHQgZm9yIHRoZSBjb21wb25lbnQgc2VsZWN0ZWQgYW5kIGRpc3BsYXkgaXRzIHNvdXJjZQotICAgICAgICAJLy8gZmlsZSBpbiB0aGUgYm94IHVuZGVyIHRoZSB0YWJsZSB2aWV3ZXIKLSAgICAgICAgICAKLSAgICAgICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKTsgICAgICAgIAkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJcnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIC8vIGJ1ZyAxNDQ1NDggLSB1bm5lY2Vzc2FyeQotICAgICAgICAvLyBydW4oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJ1bigpIHsKLQkJCQkvLyByZXN0b3JlcyB0aGUgdGV4dCBvZiBwcmV2aW91cyBpdGVtCi0JCQkJaWYgKHByZXZJdGVtICE9IG51bGwgJiYgIXByZXZJdGVtLmlzRGlzcG9zZWQoKSl7Ci0JCQkJCXByZXZJdGVtLnNldFRleHQocHJldkl0ZW1UZXh0KTsKLQkJCQl9Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBjb21wb25lbnQgPSBpdGVtc1swXS5nZXREYXRhKCk7Ci0KLQkJCQlwcmV2SXRlbSA9IGl0ZW1zWzBdOwotCQkJCXByZXZJdGVtVGV4dCA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQotCQkJCS8vIGFkZCBjbGFyaWZpY2F0aW9uIGZvciB0aGUgZmlyc3Qgc2VsZWN0ZWQgaXRlbQotCQkJCWl0ZW1zWzBdLnNldFRleHQoICBkZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50KSArICIgLSAiICsgCi0gICAgCQkJCQlkZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnQpKTsKLQotCQkJCXVwZGF0ZUxvY2F0aW9uVmlldyhjb21wb25lbnQsIGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotCQkJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJb2tQcmVzc2VkKCk7Ci0JCQl9Ci0gICAgICAgIAkKLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBjcmVhdGVGaWx0ZXJNZW51QW5kVGFibGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAJQ29tcG9zaXRlIGxhYmVsQW5kRmlsdGVyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0gICAgCWxhYmVsQW5kRmlsdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsgbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLSAgICAJbGFiZWxBbmRGaWx0ZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCQotICAgICAgICBMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsQW5kRmlsdGVyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldExpc3RMYWJlbFRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBmaWx0ZXJUb29sQmFyID0gbmV3IFRvb2xCYXIobGFiZWxBbmRGaWx0ZXIsU1dULkZMQVQpOwotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVRvb2xCYXJJdGVtcyhmaWx0ZXJUb29sQmFyKTsKLQotICAgICAgICBUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuZXcgVGFibGUobGFiZWxBbmRGaWx0ZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgVGFibGVXaWRnZXQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIFRhYmxlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0YWJsZVZpZXdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uVmlldyhPYmplY3QgY29tcG9uZW50LCBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCkgewotICAgIAlJRmlsZSBmaWxlID0gbHAuZ2V0RmlsZShjb21wb25lbnQpOwotICAgIAkKLSAgICAJaWYgKCBmaWxlID09IG51bGwgKXsKLSAgICAJCWxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgCQlsb2NhdGlvbkxhYmVsLnNldEltYWdlKG51bGwpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCVN0cmluZyBmaWxlUGF0aCA9ICIiOwotICAgIAlmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAvL2xvY2F0aW9uVmlldy5yZWRyYXcoKTsKLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0VGV4dChmaWxlUGF0aCk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0SW1hZ2UobHAuZ2V0RmlsZUljb24oY29tcG9uZW50KSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2VkIGZpbHRlciB0ZXh0IGZvciB0aGUgVGV4dCBmaWVsZC4gIEluc2VydHMgYSAiLiIKLSAgICAgKiBiZWZvcmUgZWFjaCBzdXBwb3J0ZWQgbWV0YS1jaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzRmlsdGVyU3RyaW5nKHRleHRGaWx0ZXIuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHN1cHBvcnRlZCBtZXRhY2hhcmFjdGVycyBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIHN0cmluZywgd2UgbmVlZCB0bwotICAgICAqIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NGaWx0ZXJTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKSB7Ci0gICAgICAgIGlmICghKGlucHV0U3RyaW5nLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiKiIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIj8iLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5wdXRTdHJpbmcgKyAiLioiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSAiLioiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnNlcnQgYSAiLiIgYmVmb3JlIGVhY2ggbWV0YWNoYXJhY3RlciBpbiB0aGUKLSAgICAgKiBzZWFyY2gvZmlsdGVyIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIHN0cmluZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcpOwotCi0gICAgICAgIGludCBpbmRleCA9IHN0cmluZ0J1ZmZlci5pbmRleE9mKHRhcmdldCk7Ci0gICAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgc3RyaW5nQnVmZmVyID0gc3RyaW5nQnVmZmVyLmluc2VydChpbmRleCwgbmV3U3RyaW5nKTsKLSAgICAgICAgICAgIGluZGV4ID0gc3RyaW5nQnVmZmVyLmluZGV4T2YodGFyZ2V0LCBpbmRleCArIG5ld1N0cmluZy5sZW5ndGgoKSArIHRhcmdldC5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotCi0KLSAgICAvKgotICAgICAqIExpc3RlbnMgdG8gY2hhbmdlcyBtYWRlIGluIHRoZSB0ZXh0IGZpbHRlciB3aWRnZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRleHRGaWx0ZXJNb2RpZnlBZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLndpZGdldCA9PSB0ZXh0RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGF5ZWRFdmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudC5DQU5DRUwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudCA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS50aW1lckV4ZWMoNDAwLCBkZWxheWVkRXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UT0RPLi4uIGRvIHdlIHJlYWxseSBuZWVkIG9uZSBpbnN0YW5jZT8KLSAgICBwcml2YXRlIERlbGF5ZWRFdmVudCBkZWxheWVkRXZlbnQ7Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgY29tcG9uZW50IFRhYmxlVmlld2VyIHdoZW4gdGhlIHRleHQgZmlsdGVyIGlzIG1vZGlmaWVkLgotICAgICAqIFVzZSBhIERlbGF5ZWRFdmVudCBzbyB3ZSBkb24ndCB1cGRhdGUgb24gZXZlcnkga2V5c3Ryb2tlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBDQU5DRUwgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAoIUNBTkNFTCkgewotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpWzBdOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbXNbXSA9IG5ldyBUYWJsZUl0ZW1bMV07Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zWzBdID0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcXVhbGlmaWVyTGlzdAotICAgICAgICAgICAgICAgIC8vSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAuLi4gbWFuYWdlIHF1YWxpZmllcnMKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIENvbXBvbmVudExpc3QgaW1wbGVtZW50cyBJQ29tcG9uZW50TGlzdCB7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yIG9iamVjdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRDaGFuZ2VDb3VudGVyID0gMDsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGxhc3RVcGRhdGVUaW1lID0gMDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZChvKTsKLSAgICAgICAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyKys7Ci0gICAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZEFsbChjb2xsZWN0aW9uKTsKLSAgICAgICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciArPSBjb2xsZWN0aW9uLnNpemUoKTsKLSAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRvVmlld2VyVXBkYXRlKCkgewotICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2Ugc2hvdWxkIGFsc28gYWRkIGEgdGltZXIgY29uZGl0aW9uPz8KLSAgICAgICAgICAvLyAgaWYgKGN1cnJlbnRDaGFuZ2VDb3VudGVyID49IDEwKSB7Ci0gICAgICAgICAgLy8gICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciA9IDA7Ci0gICAgICAgICAgLy8gICAgICBmaXJlVXBkYXRlTGlzdCh0aGlzKTsKLSAgICAgICAgICAvLyAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIGNzOiB5ZXAgSSB0aGluayB3ZSByZWFsbHkgZG8gbmVlZCB0byB1c2UgYSB0aW1lIGJhc2VkIGFwcHJvYWNoCi0gICAgICAgICAgLy8gICAgICAgICAgCi0gICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VXBkYXRlVGltZSA+IDMwMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgbGFzdFVwZGF0ZVRpbWUgPSB0aW1lOwotICAgICAgICAgICAgIGZpcmVVcGRhdGVMaXN0KENvbXBvbmVudExpc3QudGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc3ViTGlzdChzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3IuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8vIHRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGZyb20gYSBub24tdWkgdGhyZWFkIHNvIG5lZWRzIHRvIGNhbGwKLSAgICAvLyBhc3luY0V4ZWMgdG8gZW5zdXJlIHRoZSBVSSB1cGRhdGVzIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVXBkYXRlTGlzdChmaW5hbCBDb21wb25lbnRMaXN0IGxpc3QpIHsgICAgCi0gICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBvYmplY3RzCi0gICAgICAgICAgICAgICAgaW50IGdyb3dpbmdMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGludCBjdXJyZW50U2l6ZSA9IG1hc3RlckNvbXBvbmVudExpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChncm93aW5nTGlzdFNpemUgPiBjdXJyZW50U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmFkZEFsbChsaXN0LnN1Ykxpc3QoY3VycmVudFNpemUsIGdyb3dpbmdMaXN0U2l6ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUZvckZpbHRlckNoYW5nZSgpCi0gICAgewotICAgICAgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KG51bGwpOwotICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICB9ICAKLSAgICAKLSAgICAvKgotICAgICAqIFBvcHVsYXRlIHRoZSBDb21wb25lbnQgVHJlZVZpZXdlciB3aXRoIGl0ZW1zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChmaW5hbCBTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkgewotICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QgPSBuZXcgQ29tcG9uZW50TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETyAoY3MpIGl0IGRvZXNuJ3Qgc2VlbSB0byBtYWtlIHNlbm5zZSB0byBkbyBhbnkgb2YgdGhlIHdvcmsgb24gdGhlIFVJIHRocmVhZAotICAgICAgICAvLyBJJ3ZlIGNoYW5nZSB0aGUgYmVoYXZpb3VyIGhlcmUgdG8gZG8gYWxsIG9mIHRoZSB3b3JrIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIC8vCi0gICAgICAgIC8vc2VhcmNoTGlzdFByb3ZpZGVyLl9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhjb21wb25lbnRMaXN0LCAwKTsgICAgICAgIAotICAgICAgICBKb2Igam9iID0gbmV3IEpvYigicmVhZCBjb21wb25lbnRzIikgewotICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIC8vIHRoaXMgc3R1ZmYgZ2V0cyBleGVjdXRlZCBvbiBhIG5vbi1VSSB0aHJlYWQKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgbG9uZyB0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlYXJjaExpc3RQcm92aWRlcigpLnBvcHVsYXRlQ29tcG9uZW50TGlzdChjb21wb25lbnRMaXN0LCBzZWFyY2hTY29wZSwgbnVsbCk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gRG8gYSBmaW5hbCB1cGRhdGUgb2Ygb3VyIElucHV0IGZvciB0aGUgY29tcG9uZW50IHRyZWUgdmlld2VyLgotICAgICAgICAgICAgICBmaXJlVXBkYXRlTGlzdChjb21wb25lbnRMaXN0KTsKLSAgICAgICAgICAgICAgbG9uZyB0aW1lMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWU9IiArICh0aW1lMiAtIHRpbWUxKSArICIgaXRlbXM9ICIgKyBtYXN0ZXJDb21wb25lbnRMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hUYWJsZVZpZXdlcihTdHJpbmcgZmlsdGVyVGV4dCkgewotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmNsZWFyKCk7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIFBhdHRlcm4gcmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoZmlsdGVyVGV4dCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFzdGVyQ29tcG9uZW50TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBpdGVtU3RyaW5nID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGl0ZW0pOyAgICAgICAgICAgCi0gICAgICAgICAgICBNYXRjaGVyIG0gPSByZWdleC5tYXRjaGVyKGl0ZW1TdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBpZiAoaXRlbVN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoZmlsdGVyVGV4dCkgfHwgbS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBkZWNvcmF0ZVRhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvb2tpbmcgYXQgZWFjaCBpdGVtIGluIHRoZSBUYWJsZS4gSWYgdGhlcmUgYXJlIG90aGVyIGl0ZW1zIHdpdGggc2FtZSBuYW1lCi0gICAgICogLCB0aGVuIGFkZCBleHRyYSBpbmZvIChuYW1lc3BhY2UsIGZpbGUpIGludG8gdGhlIHRoZSB0ZXh0IGxhYmVsIG9mIGFsbCB0aGVzZQotICAgICAqIGR1cGxpY2F0ZWQgaXRlbXMuCi0gICAgICogLSBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZXZlcnl0aW1lIHRoZSBUYWJsZSB2aWV3ZXIgaXMgcmVmcmVzaGVkLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVRhYmxlKCl7Ci0gICAgCVRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmNsZWFyKCk7Ci0gICAgCQotICAgIAlJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotCi0gICAgCS8vIGluaXQgdGhlIG5hbWUtZHVwbGljYXRlcyBjb3VudGVyCi0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50VGFibGVWaWV3ZXJJbnB1dC5zaXplKCk7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmdldChpKTsKLSAgICAJCVN0cmluZyBuYW1lID0gbHAuZ2V0TmFtZShjdXJyZW50SXRlbSk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChuYW1lKTsKLQkJCWlmICggY291bnQgPT0gbnVsbCl7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KG5hbWUsIG5ldyBJbnRlZ2VyKDEpKTsKLSAgICAJCX0KLSAgICAJCWVsc2V7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KAotICAgIAkJCQkJbmFtZSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLSAgICAJCX0KLSAgICAJfQotCi0gICAgCS8vIE1vZGlmeS9kZWNvcmF0ZSB0aG9zZSBpdGVtcyBpbiB0aGUgVGFibGUgdGhhdCBoYXZlIGR1cGxpY2F0ZWQgbmFtZQotICAgIAlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAJZm9yIChpbnQgaSA9MCA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChscC5nZXROYW1lKGN1cnJlbnRJdGVtKSk7Ci0gICAgCQlpZiAoIGNvdW50ICE9IG51bGwgJiYgY291bnQuaW50VmFsdWUoKSA+IDEpewkKLSAgICAJCQlpdGVtc1tpXS5zZXRUZXh0KGxwLmdldE5hbWUoY3VycmVudEl0ZW0pICsgIiAtICIgKyAKLSAgICAJCQkJCWxwLmdldFF1YWxpZmllcihjdXJyZW50SXRlbSkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotCi0gICAgCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgQ29tcG9uZW50VHJlZVZpZXdlciwgZW5hYmxlIE9LCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FuRmluaXNoKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgY29tcG9uZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoY29tcG9uZW50U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgICAgICByZXN1bHQuc2V0TmFtZShjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWFsaWZpZXIoY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5nZXRRdWFsaWZpZXIoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRGaWxlKGNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RmlsZShjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb21wb25lbnRTZWxlY3Rpb24pOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzExMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZyBmaWx0ZXJMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByaXZhdGUgU3RyaW5nIGxpc3RMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UUzsKLSAgcHJpdmF0ZSBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlcjsgCi0gIHByaXZhdGUgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlcjsKLSAgcHJpdmF0ZSBJTmV3Q29tcG9uZW50SGFuZGxlciBuZXdDb21wb25lbnRIYW5kbGVyOwotICBwcml2YXRlIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nOwotCi0gIHB1YmxpYyB2b2lkIGluaXQoQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEF0VG9wKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRBYm92ZVF1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVUb29sQmFySXRlbXMoVG9vbEJhciB0b29sQmFyKQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblByb3ZpZGVyKElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uUHJvdmlkZXIgPSBkZXNjcmlwdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgZ2V0U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBzZWFyY2hMaXN0UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWFyY2hMaXN0UHJvdmlkZXIoSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlYXJjaExpc3RQcm92aWRlciA9IHNlYXJjaExpc3RQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGdldERpYWxvZygpCi0gIHsKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHVibGljIElOZXdDb21wb25lbnRIYW5kbGVyIGdldE5ld0NvbXBvbmVudEhhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROZXdDb21wb25lbnRIYW5kbGVyKElOZXdDb21wb25lbnRIYW5kbGVyIG5ld0NvbXBvbmVudEhhbmRsZXIpCi0gIHsKLSAgICB0aGlzLm5ld0NvbXBvbmVudEhhbmRsZXIgPSBuZXdDb21wb25lbnRIYW5kbGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckxhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldExpc3RMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGxpc3RMYWJlbFRleHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJMYWJlbFRleHQoU3RyaW5nIGZpbHRlckxhYmVsVGV4dCkKLSAgewotICAgIHRoaXMuZmlsdGVyTGFiZWxUZXh0ID0gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGlzdExhYmVsVGV4dChTdHJpbmcgbGlzdExhYmVsVGV4dCkKLSAgewotICAgIHRoaXMubGlzdExhYmVsVGV4dCA9IGxpc3RMYWJlbFRleHQ7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYWJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vLyBUT0RPLi4gdXNlIFF1YWxpZmllZE5hbWUgY29uc2lzdGVudGx5IGZvciBuYW1lIGFuZCBtZXRhTmFtZQotLy8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTcGVjaWZpY2F0aW9uCi17Ci0gIFN0cmluZyBxdWFsaWZpZXI7Ci0gIFN0cmluZyBuYW1lOwotICBJRmlsZSBmaWxlOwotICBPYmplY3Qgb2JqZWN0OwotICBib29sZWFuIGlzTmV3OwotICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lOwotICAKLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24oKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpCi0gIHsKLSAgICByZXR1cm4gcXVhbGlmaWVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpCi0gIHsKLSAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOZXcoKQotICB7Ci0gICAgcmV0dXJuIGlzTmV3OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gaXNOZXcpCi0gIHsKLSAgICB0aGlzLmlzTmV3ID0gaXNOZXc7Ci0gIH0KLQotICBwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRNZXRhTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbWV0YU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRhTmFtZShRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdGhpcy5tZXRhTmFtZSA9IG1ldGFOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODlmZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLSAgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpOwotCi0gIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpOwotCi0gIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBJbWFnZSBnZXRGaWxlSWNvbihPYmplY3QgY29tcG9uZW50KTsKLQotICBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTI0OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRMaXN0IHsKLSAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgbyk7Ci0gICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTc5YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcgotewotICB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTA5M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JTmV3Q29tcG9uZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdDb21wb25lbnRIYW5kbGVyCi17Ci0gIHZvaWQgb3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9TY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmN2Q4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Qcm9qZWN0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtpbmdTZXRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtzcGFjZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZwotewotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX05BTUVfRklFTERfVElUTEUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTElTVF9USVRMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9TUEVDSUZJRURfRklMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZJRURfRklMRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QgPSBNZXNzYWdlcy5fVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1dPUktTUEFDRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfV09SS0lOR19TRVRTID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktJTkdfU0VUUzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWFyY2hTY29wZSA9IFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0U7Ci0gIHByb3RlY3RlZCBCdXR0b24gY2hvb3NlQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uWzRdOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlckxhYmVsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RUaXRsZTsKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgc2VsZWN0V29ya2luZ1NldHNHcm91cDsKLSAgcHJvdGVjdGVkIFRleHQgd29ya2luZ1NldHNUZXh0OwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdmFsdWVGb3JXb3JraW5nU2V0c1RleHQ7Ci0gIAotICAvLyB3b3JraW5nIHNldHMgY3VycmVudGx5IGNob3NlbiBieSB0aGUgdXNlcgotICBwcml2YXRlIHN0YXRpYyBJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzOwotCi0gIHB1YmxpYyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLSAgICBzdXBlcihzaGVsbCwgZGlhbG9nVGl0bGUsIGNvbmZpZ3VyYXRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJMYWJlbChTdHJpbmcgZmlsdGVyTGFiZWwpCi0gIHsKLSAgICB0aGlzLmZpbHRlckxhYmVsID0gZmlsdGVyTGFiZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExpc3RUaXRsZShTdHJpbmcgbGlzdFRpdGxlKQotICB7Ci0gICAgdGhpcy5saXN0VGl0bGUgPSBsaXN0VGl0bGU7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vc3VwZXIuc2V0RmlsdGVyTGFiZWwoZmlsdGVyTGFiZWwgIT0gbnVsbCA/IGZpbHRlckxhYmVsIDogREVGQVVMVF9OQU1FX0ZJRUxEX1RJVExFKTsKLSAgICAvL3NldExpc3RMYWJlbFRleHQobGlzdFRpdGxlICE9IG51bGwgPyBsaXN0VGl0bGUgOiBERUZBVUxUX0xJU1RfVElUTEUpOwotICAgIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAvLyBXZSB1c2UgdGhlIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgd2lkZ2V0cwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChib3R0b21Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgLy8gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgLy8gZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMjsKLSAgICBncm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0VBUkNIX1NDT1BFKTsKLSAgICBTY29wZUNoYW5nZUxpc3RlbmVyIHNjb3BlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgU2NvcGVDaGFuZ2VMaXN0ZW5lcigpOwotICAgIHJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblswXS5zZXRUZXh0KFNDT1BFX1dPUktTUEFDRSk7Ci0gICAgcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QpOwotICAgIHJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblsyXS5zZXRUZXh0KFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UpOwotICAgIHJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblszXS5zZXRUZXh0KFNDT1BFX1dPUktJTkdfU0VUUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmFkaW9CdXR0b25baV0uZ2V0VGV4dCgpLmVxdWFscyhjdXJyZW50U2VhcmNoU2NvcGUpKQotICAgICAgewotICAgICAgICByYWRpb0J1dHRvbltpXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB9Ci0gICAgICByYWRpb0J1dHRvbltpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzY29wZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBzZWxlY3RXb3JraW5nU2V0c0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotICAgIEdyaWRMYXlvdXQgd29ya2luZ1NldEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIHdvcmtpbmdTZXRHcm91cExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgd29ya2luZ1NldEdyb3VwTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cC5zZXRMYXlvdXQod29ya2luZ1NldEdyb3VwTGF5b3V0KTsKLSAgICAKLSAgICB3b3JraW5nU2V0c1RleHQgPSBuZXcgVGV4dChzZWxlY3RXb3JraW5nU2V0c0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd29ya2luZ1NldHNUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGlmICh2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCAhPSBudWxsICkKLSAgICAJd29ya2luZ1NldHNUZXh0LnNldFRleHQodmFsdWVGb3JXb3JraW5nU2V0c1RleHQpOwotICAgIAotICAgIGNob29zZUJ1dHRvbiA9IG5ldyBCdXR0b24oc2VsZWN0V29ya2luZ1NldHNHcm91cCwgU1dULk5PTkUpOwotICAgIGNob29zZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DSE9PU0UpOwotICAgIGNob29zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHRydWUpOwotCQkJaWYgKCBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyl7Ci0JCQkJd29ya2luZ1NldHMgPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgPSAiIjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgKz0gd29ya2luZ1NldHNbaV0uZ2V0TGFiZWwoKTsKLQkJCQkJLy8gaWYgbm90IHRoZSBsYXN0IGl0ZW0sIHdlIGFkZCBhIGNvbW1hCi0JCQkJCWlmICggaSAhPSB3b3JraW5nU2V0cy5sZW5ndGggLSAxKSAKLQkJCQkJCXZhbHVlRm9yV29ya2luZ1NldHNUZXh0ICs9ICIsICI7Ci0JCQkJfQotCQkJCXdvcmtpbmdTZXRzVGV4dC5zZXRUZXh0KHZhbHVlRm9yV29ya2luZ1NldHNUZXh0KTsKLQkJCX0KLQkJCS8vIFNldCB3b3JraW5nIHNldHMgcmFkaW8gYnV0dG9uIGVuYWJsZWQsIGRpc2FibGUgb3RoZXIgYnV0dG9ucwotCQkJcmFkaW9CdXR0b25bMl0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXJhZGlvQnV0dG9uWzFdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJcmFkaW9CdXR0b25bM10uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCQlzY29wZUNoYW5nZUhhbmRsZXIocmFkaW9CdXR0b25bM10pOwotCQl9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcGFyZW50OwotICB9IC8qCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgc2VhcmNoIHNjb3BlLgotICAgICAqLwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU2NvcGUoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWFyY2hTY29wZTsKLSAgfQotCi1wcml2YXRlIHZvaWQgc2NvcGVDaGFuZ2VIYW5kbGVyKEJ1dHRvbiBiKSB7CSAgCi0JICBpZiAoKGIuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMCkKLQkgIHsKLQkJICBjdXJyZW50U2VhcmNoU2NvcGUgPSBiLmdldFRleHQoKTsKLQkJICAKLQkJICAvLyBUT0RPIChjcykgbmVlZCB0byBkbyBzb21lIHdvcmsgdG8gbWFrZSB0aGUgZGVmYXVsdCBzZWFyY2ggc2NvcGUKLQkJICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotCQkgIC8vIGFyZ3VtZW50IGluIHRvIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdCBidXQgd2Ugc2hvdWxkIHByb3ZpZGUKLQkJICAvLyBnZXR0ZXJzL3NldHRlcnMgdG8gYWxsb3cgdGhlIGRlZmF1bHQgdG8gYmUgY29udHJvbGxlZCAgICAgICAgICAKLQkJICBTZWFyY2hTY29wZSBzY29wZSA9IG51bGw7Ci0JCSAgaWYgKGN1cnJlbnRTZWFyY2hTY29wZSA9PSBTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCAmJgotCQkJCSAgY3VycmVudFJlc291cmNlICE9IG51bGwpIHsgCi0JCQkgIHNjb3BlID0gbmV3IFByb2plY3RTZWFyY2hTY29wZShjdXJyZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCSAgfSAKLQkJICBlbHNlIGlmIChjdXJyZW50U2VhcmNoU2NvcGUgPT0gU0NPUEVfV09SS1NQQUNFKXsKLQkJCSAgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudFNlYXJjaFNjb3BlID09IFNDT1BFX1dPUktJTkdfU0VUUyl7Ci0JCQkgIAotCQkJICAvLyBDb25zdHJ1Y3RzIHRoZSB3b3JraW5nIHNldHMgc2NvcGUgZnJvbSB0aGUgd29ya2luZyBzZXRzIHRoZSB1c2VyCi0JCQkgIC8vIHNlbGVjdGVkCi0JCQkgIFdvcmtpbmdTZXRTZWFyY2hTY29wZSB3b3JraW5nU2V0c1Njb3BlID0gbmV3IFdvcmtpbmdTZXRTZWFyY2hTY29wZSgpOwotCQkJICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkgIHdvcmtpbmdTZXRzU2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKHdvcmtpbmdTZXRzW2ldLmdldEVsZW1lbnRzKCkpOwotCQkJICB9CQkJICAKLQkJCSAgc2NvcGUgPSB3b3JraW5nU2V0c1Njb3BlOwotCQkgIH0KLQkJICAKLQkJICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3Qoc2NvcGUpOwotCQkgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0JCSAgLy8gU2VsZWN0IHRoZSBmaXJzdCBtYXRjaGluZyBjb21wb25lbnQuIFRob3VnaCB3ZSBzaG91bGQgYmUKLQkJICAvLyBzbWFydGVyIGhlcmUKLQkJICAvLyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXJlIHdhcyBhIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHNjb3BlCi0JCSAgLy8gc3dpdGNoIChhbmQgaWYKLQkJICAvLyB0aGUgY29tcG9uZW50IGlzIHN0aWxsIGF2YWlsYWJsZS4KLQkJICBUYWJsZSB0YWJsZSA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOwotCQkgIGlmIChpdGVtcy5sZW5ndGggPiAwKQotCQkgIHsKLQkJCSAgVGFibGVJdGVtIHNlbGVjdFtdID0gbmV3IFRhYmxlSXRlbVsxXTsKLQkJCSAgc2VsZWN0WzBdID0gaXRlbXNbMF07Ci0JCQkgIHRhYmxlLnNldFNlbGVjdGlvbihzZWxlY3QpOwotCQkgIH0KLQkJICB1cGRhdGVDYW5GaW5pc2goKTsKLQkgIH0KLSAgfQotCi1wcml2YXRlIGNsYXNzIFNjb3BlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgICAgICAgCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgaWYgKGIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIHNjb3BlQ2hhbmdlSGFuZGxlcihiKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRDdXJyZW50UmVzb3VyY2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRSZXNvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSZXNvdXJjZShJUmVzb3VyY2UgY3VycmVudFJlc291cmNlKQotICB7Ci0gICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Rlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4M2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLQotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZQotewotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoIkxpc3Q6Iik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dCgiRmlsdGVyOiIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihuZXcgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoImZvbyIpKTsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsICJ0ZXN0IiwgY29uZmlndXJhdGlvbik7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLSAgY2xhc3MgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLSAgewotICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcihTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBjb21wb25lbnQ7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBnZXROYW1lKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZykgY29tcG9uZW50KS5zdGFydHNXaXRoKHByZWZpeCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0JcHVibGljIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotICB9Ci0gIAotICBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGVsbG8hIik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGV5ISIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIkhvdy1hcmUteW91PyIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIldoYXQtaXMtdGhhdC1zbWVsbD8iKTsKLSAgICB9Ci0gIH07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTEzYmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCQotLy8JIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NPVVJDRV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VMRUNURURfRklMRVM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUE9QVVBfRVhQQU5EX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUE9QVVBfQ09MTEFQU0VfQUxMOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTVBPUlRfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQOwotCQotLy8JIFNlbGVjdE11bHRpRmlsZVBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREX0JVVFRPTl9UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0FMTF9CVVRUT047Ci0KLS8vCSBTZWxlY3RKYXZhUHJvamVjdFZpZXcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ0hPT1NFX0ZPTERFUjsKLQotLy8JIFNlbGVjdEphdmFQcm9qZWN0RGlhbG9nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT047Ci0KLS8vCSBUZXh0Vmlld2VyT3BlcmF0aW9uQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ09QWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BBU1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRURPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NFTEVDVF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU0hJRlRfTEVGVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TSElGVF9SSUdIVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TVFJJUF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfVU5ETzsKLQotLy8JIFNvdXJjZVZpZXdlckdvdG9MaW5lQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfR09UT19MSU5FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HT1RPX0xJTkVfRElBTE9HX1RFWFQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9DSEFOR0VEX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0RFTEVURURfU0FWRV9DSEFOR0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0RFTEVURURfRURJVE9SX0NMT1NFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0FWRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NMT1NFX0JVVFRPTjsKLQotCi0vLwkgWFNMIFByZWZlcmVyZW5jZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1NFTEVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMVF9TVFlMRVNIRUVUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1RSQU5TRk9STTsKLQotLy8JIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX1NFTEVDVF9MQVVOQ0hFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfVElMRV9FRElUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19BTkRfVFJBTlNGT1JNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfQ09OVEVYVF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9DT05URVhUOwotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT1ZFUlJJREVfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSkFWQV9FWElTVF9GSUxFMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSkFWQV9FWElTVF9GSUxFMjsKLQkgICAgICAKLS8vCSBzb21lIG9wdGlvbnMgc3RyaW5ncyBjb21tb24gdG8gc2V2ZXJhbCBwbHVnaW5zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfU0hPUlRfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9MT05HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BBUkVOVF9GT0xERVJfSVNfUkVBRF9PTkxZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVU5LTk9XTl9FUlJPUjsKLQotLy8JIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1VSTDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01QT05FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9RVUFMSUZJRVI7Ci0KLS8vCS0gY29tcG9uZW50IHNlbGVjdGlvbiBkaWFsb2dzIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUFUQ0hJTkdfQ09NUE9ORU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGSUVEX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOQ0xPU0lOR19QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NVUlJFTlRfUkVTT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFQVJDSF9TQ09QRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFSUk9XX1NFQVJDSF9TQ09QRV9SRVNPVVJDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9XT1JLSU5HX1NFVFM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ0hPT1NFOwotCi0KLQotCi0KLQotCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkhCi0JISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0JISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0JIQotCSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9MT0NBTF9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTk9UX0pBVkFfUFJPSkVDVDsKLQotLy8JIE5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyBlcnJvciBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0U7Ci0KLS8vCSBOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0NPTlRBSU5FUl9OT1RfSkFWQV9CVUlMRFBBVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9ST09UX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1NBVklOR19GSUxFOwotCi0vLwkgRmlsZSBWYWxpZGF0b3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRkFJTF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRkFJTF9NRVNTQUdFOwotCi0vLwkgUHJvcGVydHlEaXJ0eUNoYW5nZUxpc3RlbmVyIGFuZCBQcm9wZXJ0eVJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRURJVF9GQUlMX09ORV9GSUxFOwotCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnRpdGxlOwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZTsKLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3BfZXJyb3IubWVzc2FnZTsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5LnRpdGxlOwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vdmVyd3JpdGVxdWVyeS5tZXNzYWdlOwotLy8KLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M7Ci0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2NfcHJvajsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmMyNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBhUmVzb3VyY2VCdW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYVJlc291cmNlQnVuZGxlICE9IG51bGwpID8gYVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KQotICAgIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOyAgICAgCi0gICAgfQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIG9uZSBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIHR3byBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxLCBzMiB9KTsKLQl9ICAgICAKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKHBsdWdpbi5nZXRCdW5kbGUoKSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlsb2coeCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmw9IG5ldyBVUkwoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpCi0gICAgewotICAgICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgICAgCi0gICAgICBpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLSAgICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NhdmVEaXJ0eUZpbGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTgwZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQSBnZW5lcmljIHNhdmUgZmlsZXMgZGlhbG9nLiBUaGUgYnVsayBvZiB0aGUgY29kZSBmb3IgdGhpcyBkaWFsb2cgd2FzIHRha2VuCi0gKiBmcm9tIHRoZSBKRFQgcmVmYWN0b3Jpbmcgc3VwcG9ydCBpbgotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU2F2ZUhlbHBlci4gVGhpcyBjbGFzcyBpcwotICogYSBnb29kIGNhbmRpZGF0ZSBmb3IgcmV1c2UgYW1vdW5nIGNvbXBvbmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRGlydHlGaWxlc0RpYWxvZyBleHRlbmRzIExpc3REaWFsb2cKLXsKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVEaXJ0eUZpbGVzKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAvLyBUT0RPIChjcykgYWRkIHN1cHBvcnQgZm9yIHNhdmUgYXV0b21hdGljYWxseQotICAgIFNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gZ2V0RGlydHlFZGl0b3JzKCk7Ci0gICAgaWYgKGRpcnR5RWRpdG9ycy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBTYXZlRGlydHlGaWxlc0RpYWxvZyBzYXZlRGlydHlGaWxlc0RpYWxvZyA9IG5ldyBTYXZlRGlydHlGaWxlc0RpYWxvZyhzaGVsbCk7Ci0gICAgICBzYXZlRGlydHlGaWxlc0RpYWxvZy5zZXRJbnB1dChBcnJheXMuYXNMaXN0KGRpcnR5RWRpdG9ycykpOwotICAgICAgLy8gU2F2ZSBhbGwgb3BlbiBlZGl0b3JzLgotICAgICAgaWYgKHNhdmVEaXJ0eUZpbGVzRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7ICAgICAgICAKLSAgICAgICAgaW50IG51bURpcnR5RWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlydHlFZGl0b3JzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycygpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcGFnZXMubGVuZ3RoOyB4KyspCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotICAgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0gICAgICAgICAgcmVzdWx0LmFkZChlcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChJRWRpdG9yUGFydFtdKSByZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIFNhdmVEaXJ0eUZpbGVzRGlhbG9nKFNoZWxsIHBhcmVudCkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0VGl0bGUoTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcyk7Ci0gICAgc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOwotICAgIHNldExhYmVsUHJvdmlkZXIoY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpKTsKLSAgICBzZXRNZXNzYWdlKE1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmUpOwotICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikKLSAgewotICAgIENvbXBvc2l0ZSByZXN1bHQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0gICAgLy8gVE9ETy4uLiBwcm92aWRlIHByZWZlcmVuY2UgdGhhdCBzdXBwb3J0cyAnYWx3YXlzIHNhdmUnCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIAotICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKLSAgLyoqIAotICAgKiBBIHNwZWNpYWxpemVkIGNvbnRlbnQgcHJvdmlkZXIgdG8gc2hvdyBhIGxpc3Qgb2YgZWRpdG9yIHBhcnRzLgotICAgKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5MaXN0Q29udGVudFByb3ZpZGVyCi0gICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBhIGdlbmVyaWMgc29sdXRpb24gaXMgbWFkZSBhdmFpbGFibGUuCi0gICAqLyAgIAotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIExpc3QgZkNvbnRlbnRzOwotCi0gICAgcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KQotICAgIHsKLSAgICAgIGlmIChmQ29udGVudHMgIT0gbnVsbCAmJiBmQ29udGVudHMgPT0gaW5wdXQpCi0gICAgICAgIHJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIGZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLSAgICAgIGVsc2UKLSAgICAgICAgZkNvbnRlbnRzID0gbnVsbDsKLSAgICAgIC8vIHdlIHVzZSBhIGZpeGVkIHNldC4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiBmQ29udGVudHMgIT0gbnVsbCAmJiAhZkNvbnRlbnRzLmNvbnRhaW5zKG8pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUwM2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3OwotCi0KLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCXByb3RlY3RlZCBTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3I7Ci0KLQlwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJfQotCQlzZWxlY3RTaW5nbGVGaWxlVmlldyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldyhzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSkgewotCQkJcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQkJU2VsZWN0U2luZ2xlRmlsZURpYWxvZy50aGlzLmNyZWF0ZUZpbHRlckNvbnRyb2woY29tcG9zaXRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJLy8gVE9ETy4uIGVuYWJsZSBjb250ZXh0IGhlbHAKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZ0FyZWEsCi0JCS8vIEIyQkdVSUNvbnRleHRJZHMuQlRCR19TRUxFQ1RfU0lOR0xFX0ZJTEVfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLndpZHRoSGludCA9IDM1MDsKLQkJZ2QuaGVpZ2h0SGludCA9IDM1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCVNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoaXNDb21wbGV0ZSk7Ci0JCQl9Ci0JCX07Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCWltYWdlID0gZ2V0U2F2ZUFzSW1hZ2UoKTsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpbWFnZSB3YXMgY29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuLyB3aGVyZQotCSAqIGl0IGlzIGEgbm9uLUFQSSBpbWFnZSwgZGVub3RlZCBieQotCSAqIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19ETEdCQU5fU0FWRUFTX0RMRy4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGdldFNhdmVBc0ltYWdlKCkgewotCQlJbWFnZSBsb2NhbGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NhdmVhc193aXoucG5nIik7Ci0JCQl9Ci0JCQlsb2NhbGltYWdlID0gKEltYWdlKSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlUmVzb3VyY2UoZ2V0Q29udGVudHMoKS5nZXREaXNwbGF5KCkpOwotCQl9Ci0JCWNhdGNoIChEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBpbWFnZSBub3QgZm91bmQKLQkJCWxvY2FsaW1hZ2UgPSAoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbG9jYWxpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb21ibyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zLCBleGNsdWRlZEZpbGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvci5kZXN0cm95UmVzb3VyY2UoaW1hZ2UpOwotCQkJaW1hZ2UgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzFlNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCBpbXBsZW1lbnRzIERyYWdBbmREcm9wQ29tbWFuZAotewotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb3duZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBkcmFnIGFuZCBkcm9wLgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCB0YXJnZXQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBkcmFnIGFuZCBkcm9wLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IGxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBsb3dlciByYW5nZSBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIGVmZmVjdCBvZiB0aGlzIGNvbW1hbmQgcmVtYWlucyB1bmNoYW5nZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgZmxvYXQgbG93ZXJMb2NhdGlvbkJvdW5kOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSB1cHBlciByYW5nZSBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIGVmZmVjdCBvZiB0aGlzIGNvbW1hbmQgcmVtYWlucyB1bmNoYW5nZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgZmxvYXQgdXBwZXJMb2NhdGlvbkJvdW5kOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBwZXJtaXR0ZWQgb3BlcmF0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uczsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0T3BlcmF0aW9ufS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBmZWVkYmFjayB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGZWVkYmFja30uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGZlZWRiYWNrOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjb2xsZWN0aW9uIG9mIGRyYWdnZWQgc291cmNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIHNvdXJjZXM7Ci0KLSAgcHVibGljIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpCi0gIHsKLSAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLnNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZXMpOwotICAgIGlmICghY2FuRXhlY3V0ZSgpKSAKLSAgICB7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIGludCBnZXRGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoaXNBZnRlcigpKQotICAgIHsKLSAgICAgIHJldHVybiBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJldHVybiBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLSAgICB9Ci0gIH0gICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNBZnRlcigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb24gPiAwLjU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5zb3VyY2VzID0gbmV3IEFycmF5TGlzdChzb3VyY2VzKTsKLSAgICBpZiAoIWNhbkV4ZWN1dGUoKSkgCi0gICAgewotICAgICAgdGhpcy5vcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotICAgIH0KLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ViNDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIC8vICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKTsKLQotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCk7Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpOwotCi0gIHB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKTsKLSAgCi0gIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNhNWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHJhZ0FuZERyb3BNYW5hZ2VyCi17Ci0gIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvT2JqZWN0VHJhbnNmZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvT2JqZWN0VHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZWFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLQotCi0vKioKLSAqIFRoaXMgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ5dGUgYXJyYXkgdHJhbnNmZXIgc2hvcnQgY2lyY3VpdHMgdGhlIHRyYW5zZmVyIHByb2Nlc3MKLSAqIHNvIHRoYXQgYSBsb2NhbCB0cmFuc2ZlciBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIG9iamVjdAotICogYW5kIGhlbmNlIGNhbiBhbmQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIG9iamVjdCwgbm90IGp1c3QgYSBjbG9uZS4KLSAqIFlvdSBvbmx5IHJlYWxseSBuZWVkIGV2ZXIga25vdyBhYm91dCB7QGxpbmsgI2dldEluc3RhbmNlIE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCl9LAotICogc28gdGhhdCB5b3UgY2FuIGluY2x1ZGUgaXQgaW4gd2hlbiBhZGRpbmcgZHJhZyBzdXBwb3J0IHRvIGEgdmlld2VyLgotICogU2VlIHtAbGluayBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXJ9IGFuZCB7QGxpbmsgVmlld2VyRHJhZ0FkYXB0ZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gKiA8cD4KLSAqIEFzIGFuIGFkZGRlZCBndWFyZCwgdGhlIHRpbWUgaXMgcmVjb3JkZWQgYW5kIHNlcmlhbGl6ZWQgaW4gamF2YVRvTmF0aXZlCi0gKiB0byB0aGF0IG5hdml2ZSB0byBqYXZhIGNhbiBlbnN1cmUgdGhhdCBpdCdzIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWxseSB0byBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyCi17Ci0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSByZWdpc3RlciB0cmFuc2ZlciB0eXBlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAibG9jYWwtdHJhbnNmZXItZm9ybWF0IjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgSUQgdGhhdCBpcyByZWdpc3RlcmVkIHRvIHRoZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRCA9IHJlZ2lzdGVyVHlwZShUWVBFX05BTUUpOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGluaXRpYWxpemVkIGFuZCByZXR1cm5lZCBieSB7QGxpbmsgI2dldEluc3RhbmNlfS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0VHJhbnNmZXIgaW5zdGFuY2U7Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgb25lIGluc3RhbmNlIG9mIHRoaXMgdHJhbnNmZXIgYWdlbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdFRyYW5zZmVyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IE9iamVjdFRyYW5zZmVyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgdHJhbnNmZXIgZGF0YSB3YXMgcmVjb3JkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWU7Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotCi0gIC8qKgotICAgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2U7IHR5cGljYWxseSB5b3UgZ2V0IG9uZSBmcm9tIHtAbGluayAjZ2V0SW5zdGFuY2V9LgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdFRyYW5zZmVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgdHJhbnNmZXIgaWRzIHRoYXQgdGhpcyBhZ2VudCBzdXBwb3J0cy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IGludFtdIHsgVFlQRV9JRCB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgdHJhbnNmZXIgbmFtZXMgdGhhdCB0aGlzIGFnZW50IHN1cHBvcnRzLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFRZUEVfTkFNRSB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgb2JqZWN0IGFuZCBjdXJyZW50IHRpbWUgYW5kIGVuY29kZXMgb25seSB0aGUgY3VycmVudCB0aW1lIGludG8gdGhlIHRyYW5zZmVyIGRhdGEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgCi0gIHsKLSAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICBpZiAodHJhbnNmZXJEYXRhICE9IG51bGwpCi0gICAgewotICAgICAgc3VwZXIuamF2YVRvTmF0aXZlKFN0cmluZy52YWx1ZU9mKHN0YXJ0VGltZSkuZ2V0Qnl0ZXMoKSwgdHJhbnNmZXJEYXRhKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBkZWNvZGVzIHRoZSB0aW1lIG9mIHRoZSB0cmFuc2ZlciBhbmQgcmV0dXJucyB0aGUgcmVjb3JkZWQgdGhlIG9iamVjdCBpZiB0aGUgcmVjb3JkZWQgdGltZSBhbmQgdGhlIGRlY29kZWQgdGltZSBtYXRjaC4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIAotICB7Ci0gICAgbG9uZyBzdGFydFRpbWUgID0gTG9uZy52YWx1ZU9mKG5ldyBTdHJpbmcoKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKSkpLmxvbmdWYWx1ZSgpOwotICAgIHJldHVybgotICAgICAgdGhpcy5zdGFydFRpbWUgPT0gc3RhcnRUaW1lID8KLSAgICAgICAgb2JqZWN0IDoKLSAgICAgICAgbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2FhMzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50aW9uIG9mIHtAbGluayBEcmFnU291cmNlTGlzdGVuZXJ9LgotICogSXQgYWxsb3dzIHRoZSBzZWxlY3Rpb24gaW4gZWZmZWN0IGF0IHRoZSBzdGFydCBvZiB0aGUgZHJhZyBhbmQgZHJvcCBpbnRlcmFjdGlvbiB0byBiZSByZWNvcmRlZCwKLSAqIHdoaWNoIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBhIGRyYWcgYW5kIGRyb3AgaW50ZXJhY3Rpb24gd2l0aGluIGEgc2luZ2xlIHZpZXcuCi0gKiBUaGlzIGlzIGhvdyBvbmUgb2YgdGhlc2UgYWRhcHRlcnMgaXMgdHlwaWNhbGx5IGhvb2tlZCB1cDoKLSAqIDxwcmU+Ci0gKiAgIHZpZXdlci5hZGREcmFnU3VwcG9ydAotICogICAgIChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkssIAotICogICAgICBuZXcgVHJhbnNmZXIgW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSwKLSAqICAgICAgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0gKiA8L3ByZT4KLSAqIERvaW5nIHNvIHNpbXBseSBhbGxvd3MgYSBkcmFnIG9wZXJhdGlvbiB0byBiZSBpbml0aWF0ZWQgZnJvbSB0aGUgdmlld2VyCi0gKiBzdWNoIHRoYXQgdGhlIHZpZXdlcidzIHNlbGVjdGlvbiBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgZHJvcCB0YXJnZXQuCi0gKiBTZWUge0BsaW5rIEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcn0gYW5kIHtAbGluayBMb2NhbFRyYW5zZmVyfSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRHJhZ0FkYXB0ZXIgaW1wbGVtZW50cyBEcmFnU291cmNlTGlzdGVuZXIKLXsKLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHZpZXdlciB0byB3aGljaCB3ZSBhcmUgbGlzdGVuaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiB0aGF0IGlzIGluIGVmZmVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgb3BlcmF0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyBWaWV3ZXJEcmFnQWRhcHRlcihWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIC8vIFJlbWVtYmVyIHRoZSB2aWV3ZXIgYW5kIGxpc3RlbiB0byBTV1QuRHJhZ0RldGVjdCB0byBhbGVydCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgb3BlcmF0aW9uLgotICAgIC8vCi0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBpbml0aWF0ZWQ7IGl0IHJlY29yZHMgdGhlIHtAbGluayAjc2VsZWN0aW9ufSBvZiB7QGxpbmsgI3ZpZXdlcn0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgaXMgY29tcGxldGVkOyBpdCBmb3JnZXRzIHRoZSB7QGxpbmsgI3NlbGVjdGlvbn0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VsZWN0aW9uID0gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkKLSAgICB7Ci0gICAgICBldmVudC5kYXRhID0gc2VsZWN0aW9uOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQwM2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYSBkcm9wIHRhcmdldCBsaXN0ZW5lciAKLSAqIGlzIGRlc2lnbmVkIHRvIHR1cm4gYSBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbiBpbnRvIGEge0BsaW5rIENvbW1hbmR9IGJhc2VkIG9uIHRoZSBtb2RlbCBvYmplY3RzIG9mIGFuIHtAbGluayBFZGl0aW5nRG9tYWlufQotICogYW5kIGNyZWF0ZWQgYnkge0BsaW5rIERyYWdBbmREcm9wTWFuYWdlciNjcmVhdGV9LgotICogSXQgaXMgZGVzaWduZWQgdG8gZG8gZWFybHkgZGF0YSB0cmFuc2ZlciBzbyB0aGUgdGhlIGVuYWJsZW1lbnQgYW5kIGZlZWRiYWNrIG9mIHRoZSBkcmFnIGFuZCBkcm9wIGludGVyYWN0aW9uCi0gKiBjYW4gaW50aW1hdGVseSBkZXBlbmQgb24gdGhlIHN0YXRlIG9mIHRoZSBtb2RlbCBvYmplY3RzIGludm9sZWQuCi0gKiA8cD4KLSAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLgotICogQW55IGNoYW5nZSBpbiBiZWhhdmlvdXIgaXMgdHlwaWNhbGx5IGFjY29tcGxpc2hlZCBieSBvdmVycmlkaW5nIAotICoge0BsaW5rIEl0ZW1Qcm92aWRlckFkYXB0ZXJ9LmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZAotICogdG8gcmV0dXJuIGEgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRHJhZ0FuZERyb3BDb21tYW5kfS4KLSAqIFRoaXMgaXMgaG93IG9uZSB0aGVzZSBhZGFwdGVycyBpcyB0eXBpY2FsbHkgaG9va2VkIHVwOgotICogPHByZT4KLSAqICAgdmlld2VyLmFkZERyb3BTdXBwb3J0Ci0gKiAgICAgKERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSywKLSAqICAgICAgbmV3IFRyYW5zZmVyIFtdIHsgT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9LAotICogICAgICBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIodmlld2VyKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHRvIHVzZSBhIHtAbGluayBPYmplY3RUcmFuc2Zlcn0sIAotICogd2hpY2ggc2hvcnQtY2lyY3VpdHMgdGhlIHRyYW5zZmVyIHByb2Nlc3MgZm9yIHNpbXBsZSB0cmFuc2ZlcnMgd2l0aGluIHRoZSB3b3JrYmVuY2gsCi0gKiB0aGUgbWV0aG9kIHtAbGluayAjZ2V0RHJhZ1NvdXJjZX0gY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ci4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBhbHNvIG9ubHkgaGFuZGxlcyBhbiB7QGxpbmsgSVN0cnVjdHVyZWRTZWxlY3Rpb259LAotICogYnV0IHRoZSBtZXRob2Qge0BsaW5rICNleHRyYWN0RHJhZ1NvdXJjZX0gY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ci4KLSAqIDxwPgotICogWW91IGNhbiBjYWxsIHtAbGluayAjc2V0SG92ZXJUaHJlc2hvbGR9IHRvIHNldCB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgCi0gKiB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZDsKLSAqIHRoZSBkZWZhdWx0IGlzIDE1MDAgbWlsbGlzZWNvbmRzLgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRHJvcEFkYXB0ZXIgZXh0ZW5kcyBEcm9wVGFyZ2V0QWRhcHRlcgotewotICAvKioKLSAgICogVGhpcyBpcyB0aGUgdmlld2VyIGZvciB3aGljaCB0aGlzIGlzIGEgZHJvcCB0YXJnZXQgbGlzdGVuZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBvZiBzb3VyY2Ugb2JqZWN0cyBiZWluZyBkcmFnZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc291cmNlOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBjb21tYW5kIGNyZWF0ZWQgZHVyaW5nIGRyYWdnaW5nIHdoaWNoIHByb3ZpZGVzIHRoZSBmZWVkYmFjayBhbmQgd2lsbCBjYXJyeSBvdXQgdGhlIGFjdGlvbiB1cG9uIGNvbXBsZXRpb24uCi0gICAqLwotICAvLyAgcHJvdGVjdGVkIENvbW1hbmQgY29tbWFuZDsKLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kOwotIAotICAvKioKLSAgICogVGhpcyByZWNvcmRzIHRoZSBvYmplY3QgZm9yIHdoaWNoIHRoZSB7QGxpbmsgI2NvbW1hbmR9IHdhcyBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCBjb21tYW5kVGFyZ2V0OwotCi0gIC8qKgotICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdG8gaG92ZXIgb3ZlciBhIHRyZWUgaXRlbSBiZWZvcmUgZXhwYW5kaW5nIGl0Ci0gICAqLwotICBwcm90ZWN0ZWQgaW50IGhvdmVyVGhyZXNob2xkID0gMTUwMDsKLQotICAvKioKLSAgICogVGhlIGlzIHRoZSB0aW1lIHRoZSBtb3VzZSBmaXJzdCBzdGFydGVkIGhvdmVyaW5nIG92ZXIgdGhlIGN1cnJlbnQgaXRlbS4KLSAgICovCi0gIHByb3RlY3RlZCBsb25nIGhvdmVyU3RhcnQgPSAwOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBtb3N0IHJlY2VudCBpdGVtIGZvciB0aGUge0BsaW5rICNob3ZlclN0YXJ0fS4KLSAgICovCi0gIHByb3RlY3RlZCBXaWRnZXQgcHJldmlvdXNJdGVtOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24gdGhhdCB3YXMgaW4gZWZmZWN0IGJlZm9yZSB3ZSBzZXQgdGhlIGV2ZW50LmRldGFpbCBpbiBoZXJlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBvcmlnaW5hbE9wZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgY29tbWFuZC4KLSAgICovCi0gIHByb3RlY3RlZCBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbjsKLQotICBwcm90ZWN0ZWQgRHJhZ0FuZERyb3BNYW5hZ2VyIGRyYWdBbmREcm9wTWFuYWdlcjsKLQotICAvKioKLSAgICogVGhpcyBjcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZG9tYWluIGFuZCB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgVmlld2VyRHJvcEFkYXB0ZXIoVmlld2VyIHZpZXdlciwgRHJhZ0FuZERyb3BNYW5hZ2VyIGRyYWdBbmREcm9wTWFuYWdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMuZHJhZ0FuZERyb3BNYW5hZ2VyID0gZHJhZ0FuZERyb3BNYW5hZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGZpcnN0IGVudGVycyBvciBzdGFydHMgZHJhZ2dpbmcgaW4gdGhlIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBvcmlnaW5hbE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBvciBzdG9wcyBkcmFnZ2luZyBpbiB0aGUgdmlld2VyCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQ2xlYW4gdXAgdGhlIGNvbW1hbmQgaWYgdGhlcmUgaXMgb25lLgotICAgIC8vCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0vLyAgICAgICAgY29tbWFuZC5kaXNwb3NlKCk7Ci0gICAgICBjb21tYW5kID0gbnVsbDsKLSAgICAgIGNvbW1hbmRUYXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSBvdGhlciB2YWx1ZXMuCi0gICAgLy8KLSAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotICAgIGhvdmVyU3RhcnQgPSAwOwotICAgIHNvdXJjZSA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LCB0eXBpY2FsbHkgYmVjYXVzZSB0aGUgdXNlciBjaGFuZ2VzIGtleWJvYXJkIG1vZGlmaWVycy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIG9yaWdpbmFsT3BlcmF0aW9uID0gZXZlbnQuZGV0YWlsOwotICAgIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgcmVwZWF0ZWQgd2hlbiB0aGUgbW91c2Ugb3ZlciB0aGUgdmlld2VyLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQganVzdCBhcyB0aGUgbW91c2UgaXMgcmVsZWFzZWQgb3ZlciB0aGUgdmlld2VyIHRvIGluaXRpYXRlIGEgZHJvcC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIFNXVCB0aGF0IHRoZSB2aWV3IG1heSBoYXZlIHNjcm9sbGVkLgotICAgIC8vIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kYXRlIHRoYXQgdGhlIGRyb3AgYWN0aW9uIHNob3VsZCBiZSBpbnZva2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBTV1QgdGhhdCB0aGUgdmlldyBtYXkgaGF2ZSBzY3JvbGxlZC4KLSAgICAvLyBoZWxwZXIoZXZlbnQpOwotICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0KLSAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotCi0gICAgICAvLyBDbGVhbiB1cCB0aGUgc3RhdGUuCi0gICAgICAvLwotICAgICAgY29tbWFuZCA9IG51bGw7Ci0gICAgICBjb21tYW5kVGFyZ2V0ID0gbnVsbDsKLSAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0gICAgICBob3ZlclN0YXJ0ID0gMDsKLSAgICAgIHNvdXJjZSA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2FtZSB3YXkgZm9yIGVhY2ggb2YgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcn0gbWV0aG9kcywgZXhjZXB0IGR1cmluZyBsZWF2ZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBzb3VyY2UgaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAgIC8vCi0gICAgaWYgKHNvdXJjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNvdXJjZSA9IGdldERyYWdTb3VyY2UoZXZlbnQpOwotICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAoZXZlbnQuY3VycmVudERhdGFUeXBlID09IG51bGwpCi0gICAgewotICAgICAgc2V0Q3VycmVudERhdGFUeXBlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSdzIHN0aWxsIG5vIHNvdXJjZSwgd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRvIHRyeSBhZ2Fpbi4KLSAgICAvLwotICAgIGlmIChzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgIH0KLSAgICAvLyBPdGhlcndpc2UsIGlmIHdlIG5lZWQgdG8gc2Nyb2xsLi4uCi0gICAgLy8KLSAgICBlbHNlIGlmIChzY3JvbGxJZk5lZWRlZChldmVudCkpCi0gICAgewotICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBzY3JvbGwsIHdlIGp1c3QgZG8gYWxsIHRoZSB3b3JrIG9uIHRoZSBuZXh0IGV2ZW50IGFuZCBvbmx5IGp1c3Qgc2Nyb2xsIG5vdy4KLSAgICAgIC8vCi0gICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgaXRlbSwgaWYgdGhlcmUgaXMgb25lLgotICAgICAgLy8KLSAgICAgIE9iamVjdCB0YXJnZXQgPSBldmVudC5pdGVtID09IG51bGwgPyBudWxsIDogZXZlbnQuaXRlbS5nZXREYXRhKCk7Ci0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gKChUYWJsZVRyZWVJdGVtKXRhcmdldCkuZ2V0RGF0YSgpOwotICAgICAgfQotCi0gICAgICAvLyBEbyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHRoZSBob3ZlciBpbmZvcm1hdGlvbi4KLSAgICAgIC8vIElmIHdlJ3JlIG92ZXIgYSBuZXcgaXRlbSBmcm9tIGJlZm9yZS4KLSAgICAgIC8vCi0gICAgICBpZiAoZXZlbnQuaXRlbSAhPSBwcmV2aW91c0l0ZW0pCi0gICAgICB7Ci0gICAgICAgIC8vIFJlbWVtYmVyIHRoZSBpdGVtIGFuZCB0aGUgdGltZS4KLSAgICAgICAgLy8KLSAgICAgICAgcHJldmlvdXNJdGVtID0gZXZlbnQuaXRlbTsKLSAgICAgICAgaG92ZXJTdGFydCA9IGV2ZW50LnRpbWU7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IGhvdmVyVGhyZXNob2xkKQotICAgICAgICB7Ci0gICAgICAgICAgaG92ZXIodGFyZ2V0KTsKLQotICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gaG92ZXIgb3ZlciB0aGlzIGd1eSBhZ2Fpbi4KLSAgICAgICAgICAvLwotICAgICAgICAgIGhvdmVyU3RhcnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIGNyZWF0ZSBhIHZhbGlkIGNvbW1hbmQgYXQgdGhlIGN1cnJlbnQgbW91c2UgbG9jYXRpb24uCi0gICAgICAvLwotICAgICAgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJldmlvdXMgY2FjaGVkIGNvbW1hbmQuLi4KLSAgICAgIC8vCi0gICAgICBpZiAoY29tbWFuZCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbW1hbmQgYW5kIHRlc3QgaWYgaXQgaXMgZXhlY3V0YWJsZS4KLSAgICAgICAgLy8KLSAgICAgICAgY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgY29tbWFuZCA9IGRyYWdBbmREcm9wTWFuYWdlci5jcmVhdGVDb21tYW5kKHRhcmdldCwgZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNvdXJjZSk7Ci0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW50IG9wZXJhdGlvbiA9IG9yaWdpbmFsT3BlcmF0aW9uICE9IGV2ZW50LmRldGFpbCA/IG9yaWdpbmFsT3BlcmF0aW9uIDogZXZlbnQuZGV0YWlsOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZWQgY29tbWFuZCBpcyBhYmxlIHRvIHByb3ZpZGUgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHRhcmdldCA9PSBjb21tYW5kVGFyZ2V0KS8vICYmIGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKQotICAgICAgICB7Ci0gICAgICAgICAgZmxvYXQgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihldmVudCk7Ci0KLSAgICAgICAgICBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IAotICAgICAgICAgICAgbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQotICAgICAgICAgIC8vIElmIHNvLCByZXZhbGlkYXRlIHRoZSBjb21tYW5kLgotICAgICAgICAgIC8vCi0gICAgICAgICAgY29tbWFuZC5yZWluaXRpYWxpemUodGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIHZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIG5vdCwgZGlzcG9zZSB0aGUgY3VycmVudCBjb21tYW5kIGFuZCBjcmVhdGUgYSBuZXcgb25lLgotICAgICAgICAgIC8vCi0gICAgICAgICAgLy8gICAgICAgICAgY29tbWFuZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQotICAgICAgICAgIGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gCi0gICAgICAgICAgICBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24odGFyZ2V0LCBnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQotICAgICAgICAgIC8vIERyYWdBbmREcm9wTWFuYWdlci5jcmVhdGUoZG9tYWluLCB0YXJnZXQsIGdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotICAgICAgICAgIC8vCi0gICAgICAgICAgY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQotICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIAl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGlzIGNvbW1hbmQgY2FuIHByb3ZpZGUgZGV0YWlsZWQgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4uLgotICAgICAgLy8KLSAgICAgIC8vaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcENvbW1hbmQpCi0gICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBVc2UgdGhlIGZlZWRiYWNrIGZvciB0aGUgb3BlcmF0aW9uIGFuZCBtb3VzZSBwb2ludCBmcm9tIHRoZSBjb21tYW5kLgotICAgICAgICAvLwotICAgICAgICBldmVudC5kZXRhaWwgPSBjb21tYW5kLmdldE9wZXJhdGlvbigpOwotICAgICAgICBldmVudC5mZWVkYmFjayA9IGNvbW1hbmQuZ2V0RmVlZGJhY2soKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZhbGlkKQotICAgICAgewotICAgICAgICAvLyBBbGwgd2UgY2FuIGtub3cgaXMgdG8gcHJvdmlkZSBzZWxlY3Rpb24gZmVlZGJhY2suCi0gICAgICAgIC8vCi0gICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gZXhlY3V0YWJsZSBjb21tYW5kLCBzbyB3ZSdkIGJldHRlciBuaXggdGhlIHdob2xlIGRlYWwuCi0gICAgICAgIC8vCi0gICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50RGF0YVR5cGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3RUcmFuc2ZlciBvYmplY3RUcmFuc2ZlciA9IE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgVHJhbnNmZXJEYXRhIFtdIGRhdGFUeXBlcyA9IGV2ZW50LmRhdGFUeXBlczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFUeXBlcy5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhID0gZGF0YVR5cGVzW2ldOwotICAgICAgLy8gSWYgdGhlIGxvY2FsIHRhbnNmZXIgc3VwcG9ydHMgdGhpcyBkYXRhdHlwZSwgc3dpdGNoIHRvIHRoYXQgZGF0YSB0eXBlCi0gICAgICAvLwotICAgICAgaWYgKG9iamVjdFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKQotICAgICAgewotICAgICAgICBldmVudC5jdXJyZW50RGF0YVR5cGUgPSB0cmFuc2ZlckRhdGE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiBUaGlzICBhdHRlbXB0cyB0byBleHRyYWN0IHRoZSBkcmFnIHNvdXJjZSBmcm9tIHRoZSBldmVudCBlYXJseSwgaS5lLiwgYmVmb3JlIHRoZSBkcm9wIG1ldGhvZC4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byB1c2UgYSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuT2JqZWN0VHJhbnNmZXJ9LgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RHJhZ1NvdXJjZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGRhdGEgdHlwZSBjYW4gYmUgdHJhbnNmZXJlZCBsb2NhbGx5LgotICAgIC8vCi0gICAgT2JqZWN0VHJhbnNmZXIgb2JqZWN0VHJhbnNmZXIgPSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgIGlmICghb2JqZWN0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpCi0gICAgewotICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhIHR5cGVzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRhdGF0eXBlIHRoYXQgc3VwcG9ydHMgYSBsb2NhbCB0cmFuc2Zlci4KLSAgICAgIC8vCi0gICAgICBzZXRDdXJyZW50RGF0YVR5cGUoZXZlbnQpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUcmFuc2ZlciB0aGUgZGF0YSBhbmQgZXh0cmFjdCBpdC4KLSAgICAgIC8vCi0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0VHJhbnNmZXIubmF0aXZlVG9KYXZhKGV2ZW50LmN1cnJlbnREYXRhVHlwZSk7Ci0gICAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIGV4dHJhY3REcmFnU291cmNlKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZXh0cmFjdHMgYSBjb2xsZWN0aW9uIG9mIGRyYWdnZWQgc291cmNlIG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHJldHJpZXZlZCBmcm9tIHRoZSB0cmFuc2ZlciBhZ2VudC4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvbnZlcnRzIGEgc3RydWN0dXJlZCBzZWxlY3Rpb24gaW50byBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBleHRyYWN0RHJhZ1NvdXJjZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgLy8gVHJhbnNmZXIgdGhlIGRhdGEgYW5kIGNvbnZlcnQgdGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIHRvIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLgotICAgIC8vCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChJdGVyYXRvciBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5pdGVyYXRvcigpOyBlbGVtZW50cy5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChlbGVtZW50cy5uZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGdldHMgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGhvdmVyIG92ZXIgYW4gaXRlbSBiZWZvcmUge0BsaW5rICNob3Zlcn0gaXMgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRIb3ZlclRocmVzaG9sZCgpCi0gIHsKLSAgICByZXR1cm4gaG92ZXJUaHJlc2hvbGQ7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBzZXQgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGhvdmVyIG92ZXIgYW4gaXRlbSBiZWZvcmUge0BsaW5rICNob3Zlcn0gaXMgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SG92ZXJUaHJlc2hvbGQoaW50IGhvdmVyVGhyZXNob2xkKQotICB7Ci0gICAgdGhpcy5ob3ZlclRocmVzaG9sZCA9IGhvdmVyVGhyZXNob2xkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGN1cnNvciBoYXMgaG92ZXJlZCBvdmVyIHRoZSBnaXZlbiB0YXJnZXQgZm9yIGxvbmdlciB0aGFuIHtAbGluayAjaG92ZXJUaHJlc2hvbGR9LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaG92ZXIoT2JqZWN0IHRhcmdldCkKLSAgewotICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpCi0gICAgewotICAgICAgKChBYnN0cmFjdFRyZWVWaWV3ZXIpdmlld2VyKS5leHBhbmRUb0xldmVsKHRhcmdldCwgMSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiBUaGlzIHJldHVybnMgd2hldGhlciBhIHNjcm9sbCB3YXMgcGVyZm9ybWVkIGJhc2VkIG9uIHRoZSBnaXZlbiBkcmFnIGNvb3JkaW5hdGVzLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2Nyb2xsSWZOZWVkZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQnkgZGVmYXVsdCB3ZSdsbCBub3Qgc2Nyb2xsCi0gICAgLy8KLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgLy8gV2Ugb25seSBoYW5kbGUgYSB0cmVlIGl0ZW0gcmlnaHQgbm93LgotICAgIC8vCi0gICAgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkKLSAgICB7Ci0gICAgICAvLyBUcmVlIGl0ZW1zIGhhdmUgc3BlY2lhbCBkYXRhIHRoYXQgd2lsbCBoZWxwLgotICAgICAgLy8KLSAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0KLSAgICAgIC8vIFdlIG5lZWQgbmVlZCB0aGUgcG9pbnQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjb250cm9sIGFuZCB0aGUgY29udHJvbCdzIGJvdW5kcy4KLSAgICAgIC8vCi0gICAgICBUcmVlIHRyZWUgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gdHJlZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQotICAgICAgLy8gVGhpcyBpcyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvciBib3R0b20gdGhhdCB3aWxsIGNhdXNlIHNjcm9sbGluZy4KLSAgICAgIC8vCi0gICAgICBpbnQgc2Nyb2xsRXBzaWxvbiA9IE1hdGgubWluKHRyZWVJdGVtLmdldEJvdW5kcygpLmhlaWdodCwgYm91bmRzLmhlaWdodCAvIDMpOwotCi0gICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGl0ZW0gdGhhdCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB0aGUgdmlldy4KLSAgICAgIC8vCi0gICAgICBUcmVlSXRlbSBzY3JvbGxUcmVlSXRlbSA9IG51bGw7Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgdXAuCi0gICAgICAvLwotICAgICAgaWYgKHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcmVudCB0byBmaW5kIHRoZSBzaWJsaW5nLgotICAgICAgICAvLwotICAgICAgICBUcmVlSXRlbSBwYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc2libGluZ3MuCi0gICAgICAgIC8vCi0gICAgICAgIFRyZWVJdGVtIFtdIGNoaWxkcmVuID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmdldEl0ZW1zKCkgOiBwYXJlbnQuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgIC8vIElzIHRoaXMgYSBtYXRjaC4KLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSB0cmVlSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIHNpYmxpbmcuLi4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5baSAtIDFdOwotCi0gICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBkZWVwZXN0IGRlc2NlbmRlbnQgb2YgdGhpcyBwcmV2aW91cyBzaWJsaW5nLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBzY3JvbGxUcmVlSXRlbS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCAhPSAwICYmIHNjcm9sbFRyZWVJdGVtLmdldEV4cGFuZGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IG11c3QgYmUgdGhlIHByZXZpb3VzLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IHBhcmVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UncmUgZG9uZSBhZnRlciB0aGUgbWF0Y2guCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIGRvd24uLi4KLSAgICAgIC8vCi0gICAgICBlbHNlIGlmIChib3VuZHMuaGVpZ2h0IC0gcG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoaXMgdGhpbmcgaGFzIHZpc2libGUgY2hpbGRyZW4sIHRoZW4gdGhlIGZpcnN0IGNoaWxkIG11c3QgYmUgbmV4dC4KLSAgICAgICAgLy8KLSAgICAgICAgVHJlZUl0ZW0gW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOwotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggIT0gMCAmJiB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlblswXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBwYXJlbnQgdG8gZGV0ZXJtaW5lIHNpYmxpbmdzIGFuZCB3aWxsIHdhbGsgdXAgdGhlIHRyZWUgaWYgd2UgYXJlIHRoZSBsYXN0IHNpYmxpbmcuCi0gICAgICAgICAgLy8KLSAgICAgICAgICB3aGlsZSAoc2Nyb2xsVHJlZUl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgZG9uZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBUcmVlSXRlbSBwYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgICAgICAvLyBXYWxrIHRoZSBjaGlsZHJlbi4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBjaGlsZHJlbiA9IHBhcmVudCA9PSBudWxsID8gdHJlZS5nZXRJdGVtcygpIDogcGFyZW50LmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXaGVuIHdlIGZpbmQgdGhlIGNoaWxkLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gdHJlZUl0ZW0pCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBpbmRleCBpcyBhIHZhbGlkIGluZGV4Li4uCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpZiAoKytpIDwgY2hpbGRyZW4ubGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBpdGVtLgotICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcGFyZW50LgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2FsayB1cC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0cmVlSXRlbSA9IHBhcmVudDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbC4KLSAgICAgIC8vCi0gICAgICBpZiAoc2Nyb2xsVHJlZUl0ZW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gT25seSBzY3JvbGwgaWYgd2UncmUgb24gYW4gaXRlbSBmb3IgYSB3aGlsZS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHByZXZpb3VzSXRlbSAhPSBudWxsICYmIGV2ZW50LnRpbWUgLSBob3ZlclN0YXJ0ID4gMjAwKQotICAgICAgICB7Ci0gICAgICAgICAgU2Nyb2xsQmFyIHZlcnRpY2FsU2Nyb2xsQmFyID0gdHJlZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbEJhciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBiZWZvcmUgPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBpdGVtIGlzIHNjcm9sbGVkIGluIHBsYWNlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRyZWUuc2hvd0l0ZW0oc2Nyb2xsVHJlZUl0ZW0pOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2Nyb2xsIGFnYWluIHF1aWNrbHkuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSd2ZSBkb25lIGEgc2Nyb2xsIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlICE9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBjaGFuZ2VzLCByZXNldCB0aGUgdGltZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoZXZlbnQuaXRlbSAhPSBwcmV2aW91c0l0ZW0pCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIGhvdmVyU3RhcnQgPSBldmVudC50aW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKQotICAgIHsKLSAgICAgIC8vIFRhYmxlIGl0ZW1zIGhhdmUgc3BlY2lhbCBkYXRhIHRoYXQgd2lsbCBoZWxwLgotICAgICAgLy8KLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0KLSAgICAgIC8vIFdlIG5lZWQgbmVlZCB0aGUgcG9pbnQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjb250cm9sIGFuZCB0aGUgY29udHJvbCdzIGJvdW5kcy4KLSAgICAgIC8vCi0gICAgICBUYWJsZSB0YWJsZSA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gdGFibGUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgaWYgKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgaW50IG9mZnNldCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKTsKLSAgICAgICAgYm91bmRzLnkgKz0gb2Zmc2V0OwotICAgICAgICBib3VuZHMuaGVpZ2h0IC09IG9mZnNldDsKLSAgICAgICAgcG9pbnQueSAtPSBvZmZzZXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGl0ZW0uCi0gICAgICAvLwotICAgICAgaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZih0YWJsZUl0ZW0pOwotCi0gICAgICAvLyBUaGlzIGlzIHRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9yIGJvdHRvbSB0aGF0IHdpbGwgY2F1c2Ugc2Nyb2xsaW5nLgotICAgICAgLy8KLSAgICAgIGludCBzY3JvbGxFcHNpbG9uID0gTWF0aC5taW4odGFibGVJdGVtLmdldEJvdW5kcygwKS5oZWlnaHQsIGJvdW5kcy5oZWlnaHQgLyAzKTsKLQotICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpdGVtIHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdGhlIHZpZXcuCi0gICAgICAvLwotICAgICAgVGFibGVJdGVtIHNjcm9sbFRhYmxlSXRlbSA9IG51bGw7Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgdXAuCi0gICAgICAvLwotICAgICAgaWYgKHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICBpZiAoaW5kZXggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgc2Nyb2xsVGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbXMoKVtpbmRleCAtIDFdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIGRvd24uLi4KLSAgICAgIC8vCi0gICAgICBlbHNlIGlmIChib3VuZHMuaGVpZ2h0IC0gcG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCArIDEgPCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRhYmxlSXRlbSA9ICB0YWJsZS5nZXRJdGVtcygpW2luZGV4ICsgMV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbC4KLSAgICAgIC8vCi0gICAgICBpZiAoc2Nyb2xsVGFibGVJdGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE9ubHkgc2Nyb2xsIGlmIHdlJ3JlIG9uIGFuIGl0ZW0gZm9yIGEgd2hpbGUuCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwcmV2aW91c0l0ZW0gIT0gbnVsbCAmJiBldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IDIwMCkKLSAgICAgICAgewotICAgICAgICAgIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbEJhciA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgICAgICAgaWYgKHZlcnRpY2FsU2Nyb2xsQmFyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGJlZm9yZSA9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW0gaXMgc2Nyb2xsZWQgaW4gcGxhY2UuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgdGFibGUuc2hvd0l0ZW0oc2Nyb2xsVGFibGVJdGVtKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNjcm9sbCBhZ2FpbiBxdWlja2x5LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UndmUgZG9uZSBhIHNjcm9sbCBhbmQgbm90aGluZyBlbHNlIHNob3VsZCBiZSBkb25lLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZSAhPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gY2hhbmdlcywgcmVzZXQgdGhlIHRpbWVyIGluZm9ybWF0aW9uLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBob3ZlclN0YXJ0ID0gZXZlbnQudGltZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmbG9hdCBnZXRMb2NhdGlvbihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkKLSAgICB7Ci0gICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotICAgICAgQ29udHJvbCBjb250cm9sID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gKGZsb2F0KShwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KWJvdW5kcy5oZWlnaHQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pCi0gICAgewotICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLSAgICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotICAgICAgcmV0dXJuIChmbG9hdCkocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdClib3VuZHMuaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDAuMEY7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uCi0gIHsKLSAgICAvLyAgICBwcm90ZWN0ZWQgRWRpdGluZ0RvbWFpbiBkb21haW47Ci0gICAgcHJvdGVjdGVkIE9iamVjdCB0YXJnZXQ7Ci0gICAgcHJvdGVjdGVkIGZsb2F0IGxvY2F0aW9uOwotICAgIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uczsKLSAgICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzb3VyY2U7Ci0gICAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uCi0gICAgICAoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZSkKLSAgICB7Ci0gICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgIHRoaXMuc291cmNlID0gbmV3IEFycmF5TGlzdChzb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpCi0gICAgewotICAgICAgcmV0dXJuIGRyYWdBbmREcm9wTWFuYWdlci5jcmVhdGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL05hdmlnYWJsZVRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9OYXZpZ2FibGVUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjAzZDNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL05hdmlnYWJsZVRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi1wdWJsaWMgY2xhc3MgTmF2aWdhYmxlVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlcgotewotICAgVGFibGVOYXZpZ2F0b3IgbmF2aWdhdG9yOwotCi0gICBwdWJsaWMgTmF2aWdhYmxlVGFibGVWaWV3ZXIoVGFibGUgcGFyZW50KQotICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgIG5hdmlnYXRvciA9IG5ldyBUYWJsZU5hdmlnYXRvcihnZXRUYWJsZSgpLCB0aGlzKTsKLSAgIH0KLQotICAgLy9vdmVycmlkZSBzZXRDZWxsRWRpdG9ycyB0byBwdXQgaW4gY2FsbCB0byBtb3ZlQWJvdmVDZWxsRWRpdG9ycyBmb3IgVGFibGVOYXZpZ2F0b3IKLSAgIHB1YmxpYyB2b2lkIHNldENlbGxFZGl0b3JzKENlbGxFZGl0b3JbXSBlZGl0b3JzKQotICAgewotICAgICBzdXBlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLSAgICAgbmF2aWdhdG9yLm1vdmVDZWxsRWRpdG9yc0Fib3ZlKGVkaXRvcnMpOwotCi0gICB9Ci0KLSAgIC8vb3ZlcnJpZGUgcmVmcmVzaCBzbyB0aGF0IFRhYmxlTmF2aWdhdG9yIGlzIHJlZnJlc2hlZCBmb3IgYWxsIG1vZGVsIGNoYW5nZXMKLSAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICAgewotICAgCWlmKCAhdGhpcy5nZXRUYWJsZSgpLmlzRGlzcG9zZWQoKSApCi0gICAJewotICAgICAgCXN1cGVyLnJlZnJlc2goKTsKLSAgICAgIAluYXZpZ2F0b3IucmVmcmVzaCgpOwotICAgCX0KLSAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvUmVzb3VyY2VGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1Jlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTNmNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvUmVzb3VyY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciAKLXsKLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGZFeHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSUZpbGVbXSBmRXhjbHVkZWRGaWxlczsKLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZkV4Y2x1ZGVzOwotCQotICBwdWJsaWMgUmVzb3VyY2VGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucywgQ29sbGVjdGlvbiBleGNsdWRlKSAKLSAgewotICAgIGZFeHRlbnNpb25zPSBleHRlbnNpb25zOwotICAgIGZFeGNsdWRlcz0gZXhjbHVkZTsKLSAgICBmRXhjbHVkZWRGaWxlcyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgUmVzb3VyY2VGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucywgSUZpbGVbXSBleGNsdWRlZEZpbGVzLCBDb2xsZWN0aW9uIGV4Y2x1ZGUpIAotICB7Ci0gICAgZkV4dGVuc2lvbnM9IGV4dGVuc2lvbnM7Ci0gICAgZkV4Y2x1ZGVzPSBleGNsdWRlOwotICAgIGZFeGNsdWRlZEZpbGVzID0gZXhjbHVkZWRGaWxlczsKLSAgfQotCQotICBwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIAotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0JCi0gIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICB7Ci0gICAgICBpZiAoZkV4Y2x1ZGVzICE9IG51bGwgJiYgZkV4Y2x1ZGVzLmNvbnRhaW5zKGVsZW1lbnQpKSAKLSAgICAgIHsKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgbmFtZT0gKChJRmlsZSllbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICBpZiAoZkV4Y2x1ZGVkRmlsZXMgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGo9IDA7IGogPCBmRXhjbHVkZWRGaWxlcy5sZW5ndGg7IGorKykgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICgoSUZpbGUpZWxlbWVudCkuZ2V0TG9jYXRpb24oKS4KLSAgICAgICAgICAgICAgIHRvT1NTdHJpbmcoKS5jb21wYXJlVG8oKGZFeGNsdWRlZEZpbGVzW2pdKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSkgPT0gMCApCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGlmIChmRXh0ZW5zaW9ucy5sZW5ndGggPT0gMCkgCi0gICAgICB7Ci0gICAgICAgIC8vIGFzc3VtZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZmlsdGVyIGFueSBmaWxlcyBiYXNlZCBvbiAKLSAgICAgICAgLy8gZXh0ZW5zaW9uCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoZkV4dGVuc2lvbnNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgCi0gICAgeyAvLyBJUHJvamVjdCwgSUZvbGRlcgotICAgICAgdHJ5IAotICAgICAgewotICAgICAgCUlSZXNvdXJjZVtdIHJlc291cmNlcz0gKChJQ29udGFpbmVyKWVsZW1lbnQpLm1lbWJlcnMoKTsKLQlmb3IgKGludCBpPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgewotCSAgLy8gcmVjdXJzaXZlIQotCSAgaWYgKHNlbGVjdCh2aWV3ZXIsIHBhcmVudCwgcmVzb3VyY2VzW2ldKSkgCi0gICAgICAgICAgewotCSAgICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQl9Ci0gICAgICB9IAotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgCi0gICAgICB7Ci0gICAgICB9CQkJCQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdE11bHRpRmlsZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdE11bHRpRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhOTA4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RNdWx0aUZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLS8vIFBhZ2UgdG8gc3BlY2lmeSB0aGUgc291cmNlIGZpbGVzCi1wdWJsaWMgY2xhc3MgU2VsZWN0TXVsdGlGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotICBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLSAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotICBib29sZWFuIGlzRmlsZU1hbmRhdG9yeTsKLSAgVHJlZVZpZXdlciBzb3VyY2VGaWxlVmlld2VyOwotICBCdXR0b24gYWRkQnV0dG9uOwotICBCdXR0b24gcmVtb3ZlQnV0dG9uOwotICBCdXR0b24gcmVtb3ZlQWxsQnV0dG9uOwotICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IHNlbGVjdGVkTGlzdEJveDsKLSAgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgcHJpdmF0ZSBWZWN0b3IgZkZpbHRlcnM7Ci0gIHByb3RlY3RlZCBJRmlsZVtdIGZpbGVOYW1lczsKLSAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdDsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX0xJU1RTX0hFSUdIVCA9IDIwMDsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJWklOR19MSVNUU19XSURUSCA9IDE1MDsKLQotICAvLyBwYXJhbWV0ZXIgaXNGaWxlTWFuZGF0b3J5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSBmaWxlIG11c3QgYmUgc2VsZWN0ZWQgIAotICAvLyBiZWZvcmUgYmVpbmcgYWJsZSB0byBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhZ2UKLSAgcHVibGljIFNlbGVjdE11bHRpRmlsZVBhZ2UoCi0gICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCwKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwKLSAgICAgIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSB7Ci0gICAgc3VwZXIoIlNlbGVjdE11bHRpRmlsZVBhZ2UiKTsKLSAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB0aGlzLmlzRmlsZU1hbmRhdG9yeSA9IGlzRmlsZU1hbmRhdG9yeTsKLSAgICB0aGlzLndvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIHRoaXMuZmlsZU5hbWVzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAotICAgIENvbXBvc2l0ZSBwYWdlQ29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBwYWdlQ29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBwYWdlQ29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIC8vIHZhcmlhYmxlIG5ldmVyIHVzZWQgLi4uIGlzIHBhZ2VDb250ZW50LmdldExheW91dERhdGEoKSBuZWVkZWQ/Ci0gICAgLy9HcmlkRGF0YSBvdXRlckZyYW1lR3JpZERhdGEgPSAoR3JpZERhdGEpIAotICAgIHBhZ2VDb250ZW50LmdldExheW91dERhdGEoKTsKLSAgICAKLSAgICAvLwkJb3V0ZXJGcmFtZUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0gICAgLy8JCW91dGVyRnJhbWVHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEw7Ci0KLSAgICAvLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0gICAgLy8gICAgICAgIHBhZ2VDb250ZW50LAotICAgIC8vICAgICAgICBCMkJHVUlDb250ZXh0SWRzLkJUQkdfU0VMRUNUX01VTFRJX0ZJTEVfUEFHRSk7Ci0KLSAgICBjcmVhdGVMYWJlbHMocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZVNvdXJjZVZpZXdlcihwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlQnV0dG9uUGFuZWwocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZVNlbGVjdGVkTGlzdEJveChwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlSW1wb3J0QnV0dG9uKHBhZ2VDb250ZW50KTsKLQotICAgIHNldENvbnRyb2wocGFnZUNvbnRlbnQpOwotICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpCi0gICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCi0gIH0KLQotICBwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcygpIHsKLSAgICByZXR1cm4gZmlsZU5hbWVzOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLSAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotICAvLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotICAgIC8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIFN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPQotICAgICAgbmV3IFN0cmluZ1tmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgfQotCi0gICAgVmlld2VyRmlsdGVyIGZpbHRlciA9Ci0gICAgICBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgbnVsbCk7Ci0gICAgYWRkRmlsdGVyKGZpbHRlcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkU291cmNlRmlsZVZpZXdlclNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICBpZiAodmlzaWJsZSA9PSB0cnVlKSB7Ci0gICAgICBpZiAoZkZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlc2V0RmlsdGVycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmRmlsdGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgc291cmNlRmlsZVZpZXdlci5hZGRGaWx0ZXIoKFZpZXdlckZpbHRlcikgaS5uZXh0KCkpOwotICAgICAgfQotICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICB9Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotICAgIGludCBzaXplID0gQXJyYXlzLmFzTGlzdChmaWxlTmFtZXMpLnNpemUoKTsKLSAgICBWZWN0b3IgaUZpbGVOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGZpbGVOYW1lc1tpXSk7Ci0gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgaUZpbGVOYW1lcy5hZGRFbGVtZW50KHJlc291cmNlKTsKLSAgICB9Ci0gICAgSUZpbGVbXSBkdW1teUFycmF5ID0gbmV3IElGaWxlW2lGaWxlTmFtZXMuc2l6ZSgpXTsKLSAgICB0aGlzLmZpbGVOYW1lcyA9IChJRmlsZVtdKSAoaUZpbGVOYW1lcy50b0FycmF5KGR1bW15QXJyYXkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpIHsKLSAgICBmRmlsdGVycyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgewotICAgIGlmIChmRmlsdGVycyA9PSBudWxsKQotICAgICAgZkZpbHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZkZpbHRlcnMuYWRkKGZpbHRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBZGRCdXR0b25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0gICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLSAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUxhYmVscyhDb21wb3NpdGUgcGFnZUNvbnRlbnQpIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYWdlQ29udGVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbnRlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjaGVja0lmRmlsZUluVGFyZ2V0KElGaWxlIGZpbGVUb0NoZWNrKSB7Ci0gICAgU3RyaW5nW10gc3RyaW5ncyA9IHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpOwotICAgIGludCBzaXplID0gc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1Db3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBpZiAoc3RyaW5nc1tpXS5jb21wYXJlVG8oZmlsZVRvQ2hlY2suZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKQotICAgICAgICAgID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBzb3VyY2VGaWxlVmlld2VyID0KLSAgICAgIG5ldyBUcmVlVmlld2VyKAotICAgICAgICAgIG5ldyBUcmVlKAotICAgICAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgICAgIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyCi0gICAgLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3Q7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gbmV3RmlsZXNTZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgIGlmIChjaGVja0lmRmlsZUluVGFyZ2V0KChJRmlsZSkgcmVzb3VyY2UpID09IGZhbHNlKQotICAgICAgICAgICAgICAgIG5ld0ZpbGVzU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBzZXRBZGRCdXR0b25FbmFibGVkKG5ld0ZpbGVzU2VsZWN0ZWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYWRkU2VsZWN0ZWRGaWxlc1RvVGFyZ2V0TGlzdCgpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29udHJvbCB0cmVlV2lkZ2V0ID0gc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC53aWR0aEhpbnQgPSBTSVpJTkdfTElTVFNfV0lEVEg7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IFNJWklOR19MSVNUU19IRUlHSFQ7Ci0gICAgdHJlZVdpZGdldC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25QYW5lbChDb21wb3NpdGUgcGFnZUNvbnRlbnQpIHsKLSAgICBDb21wb3NpdGUgYnV0dG9uUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhZ2VDb250ZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBidXR0b25QYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBidXR0b25QYW5lbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFuZWwsIFNXVC5QVVNIKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfQUREX0JVVFRPTik7Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICBhZGRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0FERF9CVVRUT05fVE9PTF9USVApOwotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFuZWwsIFNXVC5QVVNIKTsKLSAgICByZW1vdmVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0JVVFRPTik7Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICByZW1vdmVCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9CVVRUT05fVE9PTF9USVApOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIHJlbW92ZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uUGFuZWwsIFNXVC5QVVNIKTsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0FMTF9CVVRUT04pOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQUxMX0JVVFRPTl9UT09MX1RJUCk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGVjdGVkTGlzdEJveChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgc2VsZWN0ZWRMaXN0Qm94ID0gbmV3IExpc3QocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLSAgICBzZWxlY3RlZExpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQotICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0pOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC53aWR0aEhpbnQgPSBTSVpJTkdfTElTVFNfV0lEVEg7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IFNJWklOR19MSVNUU19IRUlHSFQ7Ci0gICAgc2VsZWN0ZWRMaXN0Qm94LnNldExheW91dERhdGEoZ2QpOwotICB9Ci0KLSAgdm9pZCBjcmVhdGVJbXBvcnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgIGltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT04pOwotICAgIAotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBpbXBvcnRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgRmlsZVN5c3RlbUltcG9ydFdpemFyZCBpbXBvcnRXaXphcmQgPQotICAgICAgICAgIG5ldyBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkKCk7Ci0gICAgICAgIGltcG9ydFdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0KLSAgICAgICAgICBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBpbXBvcnRXaXphcmQpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0pOwotICAgIGltcG9ydEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZEZpbGVzVG9UYXJnZXRMaXN0KCkgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc291cmNlRmlsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotICAgIGlmIChpc1ZhbGlkU291cmNlRmlsZVZpZXdlclNlbGVjdGlvbihzZWxlY3Rpb24pKSB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXRzIGluIHRoZSBsaXN0LiBEb24ndCBhZGQgaXQgaWYgaXQgaXMuCi0gICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPQotICAgICAgICAgICAgICAgIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5pbmRleE9mKHJlc291cmNlTmFtZSkgPT0gLTEpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0Qm94LmFkZChyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBzZXRGaWxlcyhzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRBZGRCdXR0b25FbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1Db3VudCgpID4gMCkgewotICAgICAgICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpCi0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBCdXR0b25TZWxlY3RMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pIHsKLSAgICAgICAgYWRkU2VsZWN0ZWRGaWxlc1RvVGFyZ2V0TGlzdCgpOwotICAgICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVCdXR0b24pIHsKLSAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaW50IHNpemUgPSBzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICBzZWxlY3RlZExpc3RCb3gucmVtb3ZlKHN0cmluZ3NbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpCi0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHNldEZpbGVzKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpKTsKLSAgICAgIH0gZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQWxsQnV0dG9uKSB7Ci0gICAgICAgIHNlbGVjdGVkTGlzdEJveC5yZW1vdmVBbGwoKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpCi0gICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgc2V0RmlsZXMoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWYyOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotICBwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0gIHByb3RlY3RlZCBTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLSAgCi0gIC8vIHBhcmFtZXRlciBpc0ZpbGVNYW5kYXRvcnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBmaWxlIG11c3QgYmUgc2VsZWN0ZWQgIAotICAvLyBiZWZvcmUgYmVpbmcgYWJsZSB0byBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhZ2UKLSAgcHVibGljIFNlbGVjdFNpbmdsZUZpbGVQYWdlKElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KQotICB7Ci0gICAgc3VwZXIoIlNlbGVjdFNpbmdsZUZpbGVQYWdlIik7Ci0gICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7ICAgICAgICAgICAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldyhzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKHZpc2libGUpOwotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKQotICAgICAgewotICAgICAgICBzZXRQYWdlQ29tcGxldGUoaXNDb21wbGV0ZSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc2VsZWN0U2luZ2xlRmlsZVZpZXcuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotLy8gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbnRyb2wsIEIyQkdVSUNvbnRleHRJZHMuQlRCR19TRUxFQ1RfU0lOR0xFX0ZJTEVfUEFHRSk7Ci0gICAgc2V0Q29udHJvbChjb250cm9sKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIAotICB7IAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlcihmaWx0ZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7IAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpCi0gIHsgICAgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcucmVzZXRGaWx0ZXJzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgeyAgCi0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RTaW5nbGVGaWxlVmlldy4KLSAgICogQHJldHVybiBTZWxlY3RTaW5nbGVGaWxlVmlldwotICAgKi8KLSAgcHVibGljIFRyZWVWaWV3ZXIgZ2V0U291cmNlRmlsZVZpZXdlcigpIHsKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuc291cmNlRmlsZVZpZXdlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RTaW5nbGVGaWxlVmlldy4KLSAgICogQHJldHVybiBTZWxlY3RTaW5nbGVGaWxlVmlldwotICAgKi8KLSAgcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3IGdldFNlbGVjdFNpbmdsZUZpbGVWaWV3KCkgewotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMzYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkZpbGVTeXN0ZW1JbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotCi0gICAgCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlVmlldwoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgICAgICAgICAgICBjb21wb3NpdGU7Ci0gIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBib29sZWFuICAgICAgICAgICAgICBpc0ZpbGVNYW5kYXRvcnk7Ci0gIHByb3RlY3RlZCBUcmVlVmlld2VyICAgICAgICAgICBzb3VyY2VGaWxlVmlld2VyOwotICBwcm90ZWN0ZWQgQnV0dG9uICAgICAgICAgICAgICAgaW1wb3J0QnV0dG9uOwotICBwcm90ZWN0ZWQgVmVjdG9yICAgICAgICAgICAgICAgZkZpbHRlcnM7Ci0gIHByb3RlY3RlZCBJRmlsZSAgICAgICAgICAgICAgICBzZWxlY3RlZEZpbGU7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uICAgICAgICAgICBkZWZhdWx0U2VsZWN0aW9uOyAgCi0gIHByb3RlY3RlZCBMaXN0ZW5lciAgICAgICAgICAgICBsaXN0ZW5lcjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKTsgCi0gIH0KLQotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVZpZXcoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB0aGlzLmlzRmlsZU1hbmRhdG9yeSA9IGlzRmlsZU1hbmRhdG9yeTsKLSAgICB0aGlzLnNlbGVjdGVkRmlsZT0gbnVsbDsKLSAgICB0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBudWxsOyAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgICAgICAgICAgIAotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgQ29tcG9zaXRlIHNtYWxsQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBzbWFsbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwsIHRydWUsIGZhbHNlKSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBzbWFsbENvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc21hbGxDb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TT1VSQ0VfRklMRVMpOwkKLQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORywgR3JpZERhdGEuRU5ELCBmYWxzZSwgZmFsc2UpKTsKLQotICAgIC8vQ29sbGFwc2UgYW5kIEV4cGFuZCBhbGwgYnV0dG9ucwotICAgIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKHNtYWxsQ29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgdG9vbEJhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkVORCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAKLSAgICBUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2V4cGFuZEFsbC5naWYiKTsKLSAgICBJbWFnZSBpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgIHRvb2xJdGVtLnNldEltYWdlKGltYWdlKTsKLSAgICB0b29sSXRlbS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUE9QVVBfRVhQQU5EX0FMTCk7Ci0gICAgdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0gICAgCQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzb3VyY2VGaWxlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkKLQl9fSk7Ci0gICAgCi0gICAgCi0gICAgdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULk5PTkUpOwotICAgIGltYWdlRGVzY3JpcHRvciA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2NvbGxhcHNlQWxsLmdpZiIpOwotICAgIGltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgdG9vbEl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotICAgIHRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9QT1BVUF9DT0xMQVBTRV9BTEwpOwotICAgIHRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXNvdXJjZUZpbGVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJCi0JfX0pOwotCi0gICAgY3JlYXRlU291cmNlVmlld2VyKGNvbXBvc2l0ZSk7Ci0gICAgY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOyAgIAotICAgIGNyZWF0ZUltcG9ydEJ1dHRvbihjb21wb3NpdGUpOyAgCi0gICAgc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIAotICB7CQotICB9IAotCi1wdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzb3VyY2VGaWxlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIobmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUikpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgCi0gICAgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIAotICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGlzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0OwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIAotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkgCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkgCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IAotICAgICAgICAgIAotICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgICAgbGlzdGVuZXIuc2V0Q29udHJvbENvbXBsZXRlKGlzQ29tcGxldGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQkKLSAgICB9KTsKLSAgICBDb250cm9sIHRyZWVXaWRnZXQgPSBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHRyZWVXaWRnZXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gIH0KLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KQotICB7ICAgCi0gICAgaW1wb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfSU1QT1JUX0JVVFRPTik7Ci0gICAgCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsgICAgCi0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBpbXBvcnRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBsaXN0ZW5lciBpcyBpZiB0aGUgSW1wb3J0IFdpemFyZCBhZGRzIGEgbmV3IGZldywgd2Ugd2FudAotICAgICAgICAvLyBpdCB0byBiZSBzZWxlY3RlZCB3aGVuIHdlIGNvbWUgYmFjayBmcm9tIGl0Ci0gICAgICAgIEltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIgaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcj0gbmV3IEltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIoKTsKLSAgICAgICAgCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIpOwotICAgICAgICAgIAotICAgICAgICBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkIGltcG9ydFdpemFyZCA9IG5ldyBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkKCk7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGltcG9ydFdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uICE9IG51bGwgPyBzZWxlY3Rpb24gOiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgaW1wb3J0V2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICB3aXphcmREaWFsb2cub3BlbigpOwotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgIElGaWxlIGltcG9ydGVkRmlsZSA9IGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuZ2V0SW1wb3J0ZWRGaWxlKCk7Ci0gICAgICAgIGlmIChpbXBvcnRlZEZpbGUgIT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW1wb3J0ZWRGaWxlKTsKLSAgICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOyAgICAgICAgICAgICAgICAgIAotICAgIGltcG9ydEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUCk7Ci0gIH0gCi0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkRmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkKLSAgewotICAgIGZGaWx0ZXJzPW51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgCi0gIHsKLSAgICBpZiAoZkZpbHRlcnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmRmlsdGVycz0gbmV3IFZlY3RvcigpOwotICAgIH0KLSAgICBmRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgfQotCi0gIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0gIC8vIGV4ZW5zaW9ucy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgUmVzb3VyY2VGaWx0ZXIgc28gdGhhdCB1c2VycyBvZiB0aGlzCi0gIC8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLSAgLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsKLSAgICAvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0gbmV3IFN0cmluZ1tmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgCi0gICAgewotICAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLSAgICAgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgIH0KLQotICAgIFZpZXdlckZpbHRlciBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgbnVsbCk7Ci0gICAgYWRkRmlsdGVyKGZpbHRlcik7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLQotLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLS8vIGV4ZW5zaW9ucy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgUmVzb3VyY2VGaWx0ZXIgc28gdGhhdCB1c2VycyBvZiB0aGlzCi0vLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0vLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucywgSUZpbGUgW10gZXhjbHVkZWRGaWxlcykKLSAgewotICAgIC8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIFN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0gICAgICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgVmlld2VyRmlsdGVyIGZpbHRlcjsKLSAgICBpZiAoZXhjbHVkZWRGaWxlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBleGNsdWRlZEZpbGVzLCBudWxsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICB9Ci0gICAgYWRkRmlsdGVyKGZpbHRlcik7Ci0gIH0KLSAgCi0gIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0gIC8vIGV4ZW5zaW9ucy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgUmVzb3VyY2VGaWx0ZXIgc28gdGhhdCB1c2VycyBvZiB0aGlzCi0gIC8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLSAgLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsKLQkvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLQlTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0gbmV3IFN0cmluZ1tmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aF07Ci0JZm9yIChpbnQgaT0wOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgCi0JewkJCi0JICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotCSAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotCSAgewotCQljb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0JICB9Ci0JfQotCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgbnVsbCk7Ci0gICAgZkZpbHRlcnM9IG5ldyBWZWN0b3IoKTsKLQlmRmlsdGVycy5hZGQoZmlsdGVyKTsKLQlpZiAoc291cmNlRmlsZVZpZXdlciAhPSBudWxsKQotCXsJCi0JICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgc291cmNlRmlsZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaT1mRmlsdGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7ICAgICAKLQkgICAgc291cmNlRmlsZVZpZXdlci5hZGRGaWx0ZXIoKFZpZXdlckZpbHRlcilpLm5leHQoKSk7Ci0gCSAgfQotCSAgc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KHRydWUpOwotCSAgc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCkucmVkcmF3KCk7Ci0JfQkKLSAgfSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhIFdpemFyZCBwYWdlIG9yIERpYWxvZyB3aGVuIGl0IGJlY29tZXMgdmlzaWJsZQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSGVscGVyKGJvb2xlYW4gdmlzaWJsZSkKLSAgeyAgICAKLSAgICBpZiAodmlzaWJsZSA9PSB0cnVlKSAKLSAgICB7Ci0gICAgICBpZiAoZkZpbHRlcnMgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1mRmlsdGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIAotICAgICAgIAkgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRmlsdGVyKChWaWV3ZXJGaWx0ZXIpaS5uZXh0KCkpOwotICAgICAgfQotICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgxKTsKLQotICAgICAgaWYgKGRlZmF1bHRTZWxlY3Rpb24gIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0U2VsZWN0aW9uKGRlZmF1bHRTZWxlY3Rpb24sIHRydWUpOyAgICAgICAgCi0gICAgICB9ICAgCi0gICAgICBlbHNlIGlmICghc291cmNlRmlsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0gICAgICB7ICAgICAKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRTZWxlY3Rpb24oc291cmNlRmlsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSAmJiBsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICBsaXN0ZW5lci5zZXRDb250cm9sQ29tcGxldGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIGNsYXNzIEltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yCi0gIHsKLQlWZWN0b3IgaW1wb3J0ZWRGaWxlczsKLQotCUltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIoKQotCXsKLQkgIGltcG9ydGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7IAotCX0KLSAgCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQotCXsKLQkgIElSZXNvdXJjZURlbHRhIHJlc291cmNlRGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgIAotCSAgdHJ5Ci0JICB7Ci0JCWlmIChyZXNvdXJjZURlbHRhICE9IG51bGwpIAotCQl7Ci0JCSAgcmVzb3VyY2VEZWx0YS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkJLy9UT0RPLi4uIGxvZyBleGNlcHRpb24KLQkJLy9VSVBsdWdpbi5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGNhdWdodCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIiArIGUpOwotCQkvL1VJUGx1Z2luLmdldE1zZ0xvZ2dlcigpLndyaXRlQ3VycmVudFRocmVhZCgpOyAKLQkgIH0gICAgICAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkKLQl7Ci0JICBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKQotCSAgewotCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAKLQkJICBpbXBvcnRlZEZpbGVzLmFkZChkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkgIH0KLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEltcG9ydGVkRmlsZXMoKQotCXsKLQkgIHJldHVybiBpbXBvcnRlZEZpbGVzOwotCX0KLSAgICAKLQkvLyBUaGlzIHJldHVybnMgdGhlIGZpcnN0IGltcG9ydGVkIGZpbGUgaW4gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgZmlsZXMKLQlwdWJsaWMgSUZpbGUgZ2V0SW1wb3J0ZWRGaWxlKCkKLQl7Ci0JICBpZiAoaW1wb3J0ZWRGaWxlcy5pc0VtcHR5KCkgPT0gZmFsc2UpIAotCQlyZXR1cm4gKElGaWxlKWltcG9ydGVkRmlsZXMuZmlyc3RFbGVtZW50KCk7Ci0gIAotCSAgcmV0dXJuIG51bGw7Ci0JfQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRUcmVlTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB0cmVlTGlzdGVuZXIpIHsKLSAgCXNvdXJjZUZpbGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVMaXN0ZW5lcik7Ci0gIH0KLX0gICAgICAgICAgICAgIAotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9UYWJsZU5hdmlnYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFibGVOYXZpZ2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwMzdhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9UYWJsZU5hdmlnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLQotICAvKioKLSAgICogQWRkcyBhIFRhYmxlQ3Vyc29yIHRvIGEgU3RydWN0dXJlZFZpZXdlciAtIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uIG9mIHRoZSB0YWJsZQotICAgKiBUaGUgaW50ZW50IG9mIHRoaXMgY2xhc3MgaXMgdG8gcHJvdmlkZSB0aGUgc3RhbmRhcmQgbGlzdGVuZXJzIGZvciB1c2luZyBGMiB0bwotICAgKiBhY3RpdmF0ZSBjZWxsIGVkaXRvcnMuCi0gICAqCi0gICAqIER1ZSB0byBhIGN1cnJlbnQgYnVnIGluIHRoZSBUYWJsZUN1cnNvciwgVGFibGVWaWV3ZXJzIHVzaW5nIHRoaXMgY2xhc3MgbXVzdCBtYWtlCi0gICAqIGEgY2FsbCBzaW1pbGFyIHRvIHRoZSBUYWJsZU5hdmlnYXRvciBtZXRob2QgbW92ZUNlbGxFZGl0b3JzQWJvdmUoY2VsbEVkaXRvcnMpCi0gICAqIHdoZW5ldmVyIGEgc2V0Q2VsbEVkaXRvcnMgY2FsbCBpcyBtYWRlIGluIHRoZSBTdHJ1Y3R1cmVkVmlld2VyLiAgVGhpcyBpcyBzbyB0aGF0IHRoZQotICAgKiBjZWxsIGVkaXRvciBjb250cm9sIHNob3dzIHVwIGFib3ZlIHRoZSB0YWJsZSBjdXJzb3IgY29udHJvbC4KLSAgICovCi0KLXB1YmxpYyBjbGFzcyBUYWJsZU5hdmlnYXRvciBleHRlbmRzIFRhYmxlQ3Vyc29yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRVRSRUVJVEVNX0lEID0gIlRhYmxlVHJlZUl0ZW1JRCI7Ci0KLSAgIGZpbmFsIFRhYmxlIHRhYmxlOwotCi0gICBwdWJsaWMgVGFibGVOYXZpZ2F0b3IoVGFibGUgdGFibGUsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgewotICAgICAgc3VwZXIodGFibGUsIFNXVC5OT05FKTsKLSAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKLSAgICAgIGZpbmFsIFRhYmxlIGN1cnJlbnRUYWJsZSA9IHRhYmxlOwotICAgICAgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzVmlld2VyID0gdmlld2VyOwotCi0gICAgICAvLyBMaW51eCBpbmRleCBvdXQgb2YgYm91bmRzIGZpeC4gIFNlZSBkZWZlY3QgMjUzNDI5LCAyNTM0MzMsIGFuZCBtb3JlCi0gICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgICAgYWRkUGFpbnRMaXN0ZW5lcih2aWV3ZXIpOwotICAgICAgYWRkS2V5TGlzdGVuZXJzKHZpZXdlcik7Ci0gICAgICBhZGRNb3VzZUxpc3RlbmVycyh2aWV3ZXIpOwotICAgICAgYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJICAgICBpZiAoc1ZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKWdldFJvdygpLmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0YWJsZVRyZWVJdGVtLmdldERhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgc1ZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgfQotCQl9Ci0KLQotICAgICAgfSk7Ci0gICAgICBhZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKXsKLSAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICAgICAgIHsKLSAgICAgICAgIAkvLyBpZiBlLnNvdXJjZSBpcyBub3QgYSBjaGlsZCBvZiB0aGUgdGFibGUgdGhlbiBzZXQgc2VsZWN0aW9uIC0gdGhpcyBpcyBmb3IgdGFiIGludG8gdmlld2VyCi0gICAgICAgICAJT2JqZWN0IGV2ZW50U291cmNlID0gZS5nZXRTb3VyY2UoKTsKLSAgICAgICAgIAlpZiAoZXZlbnRTb3VyY2UgaW5zdGFuY2VvZiBDb250cm9sKQotICAgICAgICAgCXsKLSAgICAgICAgIAlpZiAoIWlzQ2hpbGQoY3VycmVudFRhYmxlLCAoQ29udHJvbClldmVudFNvdXJjZSkpCi0gICAgICAgICAJewotICAgICAgICAgCSAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtQ291bnQoKSA+IDAgJiYgY3VycmVudFRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPD0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBpZiAoc1ZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKWdldFJvdygpLmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0YWJsZVRyZWVJdGVtLmdldERhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgc1ZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIAkgICBjdXJyZW50VGFibGUuc2V0U2VsZWN0aW9uKDApOyAKLSAgICAgICAgICAgICAgIAkgICBzZXRTZWxlY3Rpb24oMCwwKTsKLSAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgIAkgICAgfQotICAgICAgIAkgICAgZWxzZSAKLSAgICAgICAJICAgIHsKLSAgICAgICAJICAgICAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtcygpLmxlbmd0aCA+IDApCi0gICAgICAgCSAgICAgIHsKLSAgICAgICAJICAgICAgCSAvLyBjdXJzb3IgY2FuIGVuZCB1cCBvbiBhIG5vbi1leGlzdGVudCB0YWJsZSByb3cgCi0gICAgICAgCSAgICAgICAgIC8vICAgY3VycmVudGx5IG5vIHdheSB0byBnZXQgdGhlIGN1cnJlbnQgdGFibGUgY3Vyc29yIHJvdyAKLSAgICAgICAJICAgICAgCSAvLyAgIHNvIGZvciBub3cganVzdCBjYXRjaCB0aGUgZXhjZXB0aW9uIHNpbmNlIGl0IGRvZXNuJ3QKLSAgICAgICAJICAgICAgCSAvLyAgIGNhdXNlIGFueSBzaWRlIGVmZmVjdHMuCi0gICAgICAgCSAgICAgIAkgdHJ5Ci0gICAgICAgCSAgICAgIAkgewotICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgCSAgICAgIAkgfQotICAgICAgIAkgICAgICAJIGNhdGNoIChFeGNlcHRpb24gZWUpCi0gICAgICAgCSAgICAgIAkgeyAgICAgCSAgICAgICAgICAgIAkgICAgICAJCi0gICAgICAgCSAgICAgIAkJY3VycmVudFRhYmxlLnNldFNlbGVjdGlvbigwKTsgICAgICAgCSAgICAgIAkJICAgICAgICAgCi0gICAgICAgCSAgICAgIAkJc2V0U2VsZWN0aW9uKDAsMCk7Ci0gICAgICAgCSAgICAgIAkgfQotICAgICAgIAkgICAgICAgfSAgICAgICAJICAgIAotICAgICAgIAkgICAgICAgZWxzZSAgLy8gZG8gbm90IHNob3cgdGFibGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgdGFibGUgLSBhdm9pZCByZXBhaW50Ci0gICAgICAgCSAgICAgICB7Ci0gICAgICAgCSAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgICAgIAkgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAJfSAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGlsZChDb250cm9sIHBhcmVudCwgQ29udHJvbCBjaGlsZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb250cm9sIHRlbXBDaGlsZCA9IGNoaWxkOwotICAgICAgICAgICAgd2hpbGUgKHRlbXBDaGlsZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAodGVtcENoaWxkID09IHBhcmVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHRlbXBDaGlsZCA9IHRlbXBDaGlsZC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlciNmb2N1c0xvc3QoRm9jdXNFdmVudCkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgdGFibGUgbmF2aWdhdG9yIHRvIGJlIG5vdCB2aXNpYmxlIGlmIHRoZSB0aGUgdGFibGUKLSAgICAgICAgICAgIC8vIGlzIG5vdCBpbiBmb2N1cyBhbmQgYSBjaGlsZCBvZiB0aGUgdGFibGUgaXMgbm90IGluIGZvY3VzCi0gICAgICAgICAgICAvLyBub3RlIHRoYXQgd2UgZG8gdGhpcyBhc3luY2hyb25vdXNseSBzbyB3ZSBkb24ndCBtZXNzIHVwIHRoZQotICAgICAgICAgICAgLy8gY3VycmVudCBmb2N1cyBoYW5kbGluZy4KLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUYWJsZSAhPSBudWxsICYmICFjdXJyZW50VGFibGUuaXNEaXNwb3NlZCgpICYmICFjdXJyZW50VGFibGUuaXNGb2N1c0NvbnRyb2woKSAmJgotICAgICAgICAgICAgICAgICAgICAhaXNDaGlsZChjdXJyZW50VGFibGUsIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEZvY3VzQ29udHJvbCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0KLQotICAgICAgfSk7IAotICAgICAgCi0gICAgIAotICAgICAgCi0KLSAgICAgIHRhYmxlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lciNmb2N1c0dhaW5lZChGb2N1c0V2ZW50KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gb25seSBkaXNwbGF5IG5hdmlnYXRvciBpZiB0aGVyZSBhcmUgaXRlbXMgaW4gdGhlIHRhYmxlIAotICAgICAgICAgIC8vIGFuZCBpZiB0aGUgZm9jdXMgd2Fzbid0IGdhaW5lZCBmcm9tIG91ciBvd24gdGFibGUgbmF2aWdhdG9yCi0gICAgICAgICAgLy8gKGllIGZvY3VzIGNhbWUgZnJvbSBvdXRzaWRlKQotICAgICAgICAgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwICYmCi0gICAgICAgICAgICAgIChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRGb2N1c0NvbnRyb2woKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAhRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0Rm9jdXNDb250cm9sKCkuZXF1YWxzKFRhYmxlTmF2aWdhdG9yLnRoaXMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyB0aGlzIGFzeW5jaHJvbm91c2x5IHNvIHdlIGRvbid0IG1lc3MgdXAgdGhlCi0gICAgICAgICAgICAvLyBjdXJyZW50IGZvY3VzIGhhbmRsaW5nLgotICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpICAgICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ucyBoZXJlIC0gaW5kZXggb3V0IG9mIGJvdW5kcyBvbiB0YWJsZXZpZXdlcgotICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFibGUuc2V0U2VsZWN0aW9uKDApOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbigwLDApOyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZSAgLy8gZG8gbm90IHNob3cgdGFibGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgdGFibGUgLSBhdm9pZCByZXBhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsgICAgICAgICAgIAotICAgfQotCi0gICBwdWJsaWMgVGFibGUgZ2V0VGFibGUoKQotICAgewotICAgICByZXR1cm4gdGFibGU7Ci0gICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWludExpc3RlbmVyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgCi0gICAgICBhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgCi0gICAgICB7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKQotICAgICAgICAgewotICAgICAgICAgCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgZmluYWwgVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjZWxsVGV4dCA9IHJvdy5nZXRUZXh0KGdldENvbHVtbigpKTsKLSAgICAgICAgICAgIGZpbmFsIEltYWdlIGNlbGxJbWFnZSA9IHJvdy5nZXRJbWFnZShnZXRDb2x1bW4oKSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sID0gZ2V0Q29sdW1uKCk7Ci0KLSAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICghcm93LmlzRGlzcG9zZWQoKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcm93LmdldFRleHQoZ2V0Q29sdW1uKCkpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdUZXh0LmVxdWFscyhjZWxsVGV4dCkgfHwgIShyb3cuZ2V0SW1hZ2UoY29sKSA9PSBjZWxsSW1hZ2UpKSAKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0pOwotICAgICAgICAgICB9Ci0gICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2VsZWN0aW9uS2V5QWRhcHRlciBnZXRLZXlBZGFwdGVyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgICAgaWYgKGtleUFkYXB0ZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbktleUFkYXB0ZXIodmlld2VyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHJldHVybiBrZXlBZGFwdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleUFkYXB0ZXIoU2VsZWN0aW9uS2V5QWRhcHRlciBrQWRhcHRlcikKLSAgICB7Ci0gICAgICAga2V5QWRhcHRlciA9IGtBZGFwdGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZWxlY3Rpb25LZXlBZGFwdGVyIGtleUFkYXB0ZXIgPSBudWxsOwotCi0gICAgcHVibGljIGNsYXNzIFNlbGVjdGlvbktleUFkYXB0ZXIgZXh0ZW5kcyBLZXlBZGFwdGVyCi0gICAgewotICAgICAgIFN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlcjsKLQotICAgICAgIHB1YmxpYyBTZWxlY3Rpb25LZXlBZGFwdGVyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgICAgIHsKLSAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgIHRoaXMuc3RydWN0dXJlZFZpZXdlciA9IHZpZXdlcjsKLSAgICAgICB9Ci0KLSAgICAgICBpbnQgbGFzdEtleVByZXNzZWQgPSAtMTsgIC8vIHVzZWQgdG8gY2FjaGUgdGhlIGxhc3Qga2V5IGZvciBrZXkgY29tYm9zCi0KLSAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIAotICAgICAgIHsgICAgICAgCQotICAgICAgICAgICAgICAgVGFibGVJdGVtIHJvdyA9IGdldFJvdygpOwotICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGdldENvbHVtbigpOyAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgLy8gaGFjayB0byBlbXVsYXRlIFNISUZUK0YxMCBwb3B1cCBtZW51IC0gb3RoZXJ3aXNlIHRhYmxlIGN1cnNvcgotICAgICAgICAgICAgICAgLy8gICBvYnNjdXJlcyB0aGUgdGFibGUgcG9wdXAgbWVjaGFuaXNtIGFuZCBpdCBkb2Vzbid0IHdvcmsuCi0gICAgICAgICAgICAgICBpZiAobGFzdEtleVByZXNzZWQgPT0gU1dULlNISUZUICYmIGUua2V5Q29kZSA9PSBTV1QuRjEwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgTWVudSBwb3B1cCA9IGdldFRhYmxlKCkuZ2V0TWVudSgpOwotICAgICAgICAgICAgICAgICAgcG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGxhc3RLZXlQcmVzc2VkID0gZS5rZXlDb2RlOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAvL2p2aCAtIGxvb2sgZm9yICsgb3IgLSBrZXkKLSAgICAgICAgICAgICAgIC8vIGNvbHVtbiA9PSAwCi0gICAgICAgICAgICAgICBpZiAocm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCkgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gMCAmJiBlLmNoYXJhY3RlciA9PSAnKycpIAotCSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIAkgIAkgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwkgICAgICAgICAgICAgICAJCi0JICAgICAgICAgICAgICAgCSAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuc2V0RXhwYW5kZWRTdGF0ZSh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgdHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAJICByZWZyZXNoKCk7Ci0JICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbiA9PSAwICYmIGUuY2hhcmFjdGVyID09ICctJykgCi0JICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgIAkgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwkgICAgICAgICAgICAgICAJCi0JICAgICAgICAgICAgICAgCSAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuc2V0RXhwYW5kZWRTdGF0ZSh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotCSAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIC8vIHVzZSBGMiB0byBpbnZva2UgZWRpdGluZyBmb3IgYSBjZWxsCi0gICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IFNXVC5GMikgICAgIAotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgCSAgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikKLSAgICAgICAgICAgICAgIAkgIHsKLSAgICAgICAgICAgICAgICAgICAgKChUYWJsZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5lZGl0RWxlbWVudChyb3cuZ2V0RGF0YSgpLCBjb2x1bW4pOyAgIAotICAgICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgCSAgZWxzZSBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikKLSAgICAgICAgICAgICAgIAkgIHsgIAotICAgICAgICAgICAgICAgCSAgCSAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAJICAJICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW4pOyAgIAotICAgICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgYWRkS2V5TGlzdGVuZXIoZ2V0S2V5QWRhcHRlcihzdHJ1Y3R1cmVkVmlld2VyKSk7Ci0gICAgfSAgICAgIAotICAgIAotICAgcHVibGljIHZvaWQgYWRkTW91c2VMaXN0ZW5lcnMoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICB7Ci0gICAgICBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSB2aWV3ZXI7Ci0KLSAgICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgICB7Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSAKLSAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgICAgVGFibGVJdGVtIHJvdyA9IGdldFJvdygpOwotICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGdldENvbHVtbigpOyAKLSAgICAgICAgIAotICAgICAgICAgICAgICAgLy8gdXNlIG1vdXNlIGJ1dHRvbiAxIHRvIGludm9rZSBlZGl0aW5nIGZvciBhIGNlbGwKLSAgICAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PSAxKSAgICAgCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgKChUYWJsZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5lZGl0RWxlbWVudChyb3cuZ2V0RGF0YSgpLCBjb2x1bW4pOyAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlciAmJiBjb2x1bW4gPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5lZGl0RWxlbWVudCh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyICYmIHJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpIGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwYW5kU3RhdGUgPSB0YWJsZVRyZWVJdGVtLmdldEV4cGFuZGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUodGFibGVUcmVlSXRlbS5nZXREYXRhKCksICFleHBhbmRTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgfSk7Ci0gICAgIH0KLQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCBjZWxsIGVkaXRvciBjb250cm9sIHNob3dzIHVwIGFib3ZlIHRoZSB0YWJsZSBjdXJzb3IgY29udHJvbC4KLSAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgdGFibGUgdmlld2VyIG1ha2VzIGEgbmV3IGNhbGwgdG8gc2V0Q2VsbEVkaXRvcnMKLSAgICogaS5lLiBpbiBjb25zdHJ1Y3RvciBhbmQgaW4gcmVmcmVzaENlbGxFZGl0b3JzCi0gICAqCi0gICAqIEBwYXJhbSAtIGFycmF5IG9mIGNlbGwgZWRpdG9ycyBmb3IgdGhlIFN0cnVjdHVyZWRWaWV3ZXIKLSAgICovCi0KLSAgcHVibGljIHZvaWQgbW92ZUNlbGxFZGl0b3JzQWJvdmUoQ2VsbEVkaXRvcltdIGVkaXRvckFycmF5KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JBcnJheS5sZW5ndGggOyBpKyspCi0gICAgewotICAgICAgQ2VsbEVkaXRvciBjRWQgPSBlZGl0b3JBcnJheVtpXTsKLSAgICAgIGlmIChjRWQgIT0gbnVsbCAmJiBjRWQuZ2V0Q29udHJvbCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNFZC5nZXRDb250cm9sKCkubW92ZUFib3ZlKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKCFpc0Rpc3Bvc2VkKCkgJiYgaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0KLSAgICAgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI4MGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvdmlzaW9uYWwuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIE5vIGxvbmdlciBuZWNlc3NhcnkgYXMgb2YgMy4yTTMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZSBleHRlbmRzIE11bHRpUGFnZUVkaXRvclNpdGUgewotCS8qKgotCSAqIFRoZSBwb3N0IHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIsIGluaXRpYWxpemVkIGxhemlseTsKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgeWV0IGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBudWxsOwotCi0JcHVibGljIFBvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlKE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlQYWdlRWRpdG9yLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIobXVsdGlQYWdlRWRpdG9yLCBlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBjaGFuZ2VkIGxpc3RlbmVyIHdoaWNoIGxpc3RlbnMgdG8gdGhlIG5lc3RlZAotCSAqIGVkaXRvcidzIHBvc3Qgc2VsZWN0aW9uIGNoYW5nZXMsIGFuZCBjYWxscwotCSAqIDxjb2RlPmhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcgotCSAqLwotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBnZXRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlpZiAocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJUG9zdE11bHRpUGFnZUVkaXRvclNpdGUudGhpcy5oYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgcG9zdCBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBmcm9tIHRoZSBuZXN0ZWQgZWRpdG9yLiBUaGUKLQkgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGdldHMgdGhlIHNlbGVjdGlvbiBwcm92aWRlciBmcm9tIHRoZSBtdWx0aS1wYWdlCi0JICogZWRpdG9yJ3Mgc2l0ZSwgYW5kIGNhbGxzIDxjb2RlPmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gb24gaXQKLQkgKiAob25seSBpZiBpdCBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjwvY29kZT4pLAotCSAqIHBhc3NpbmcgYSBuZXcgZXZlbnQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBvciByZWltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIHBhcmVudFByb3ZpZGVyID0gZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWlmIChwYXJlbnRQcm92aWRlciBpbnN0YW5jZW9mIFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IG5ld0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChwYXJlbnRQcm92aWRlciwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJKChQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIHBhcmVudFByb3ZpZGVyKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQobmV3RXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIDxjb2RlPk11bHRpUGFnZUVkaXRvclNpdGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLQkgKiA8Y29kZT5JV29ya2JlbmNoUGFydFNpdGU8L2NvZGU+IG1ldGhvZCByZW1lbWJlcnMgdGhlIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLCBhbmQgYWxzbyBob29rcyBhIGxpc3RlbmVyIG9uIGl0LCB3aGljaCBjYWxscwotCSAqIDxjb2RlPmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+IHdoZW4gYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudAotCSAqIG9jY3VycyBhbmQgPGNvZGU+aGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+IHdoZW4gYSBwb3N0Ci0JICogc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgb2NjdXJzLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKiBAc2VlIFBvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlI2hhbmRsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlJU2VsZWN0aW9uUHJvdmlkZXIgb2xkU2VsZWN0aW9uUHJvdmlkZXIgPSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlpZiAob2xkU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKG9sZFNlbGVjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgb2xkU2VsZWN0aW9uUHJvdmlkZXIpLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnNldFNlbGVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZjkwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3Zpc2lvbmFsLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIE5vIGxvbmdlciBuZWNlc3NhcnkgYXMgb2YgMy4yTTMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIgewotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHBvc3RMaXN0ZW5lcnM7Ci0KLQlwdWJsaWMgUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlQYWdlRWRpdG9yKSB7Ci0JCXN1cGVyKG11bHRpUGFnZUVkaXRvcik7Ci0JCXBvc3RMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBvc3RMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHBvc3RMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCVBsYXRmb3JtLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcGwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcG9zdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RTZWxlY3Rpb25NdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0U2VsZWN0aW9uTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QyZjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RTZWxlY3Rpb25NdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm92aXNpb25hbC5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLQotLyoqCi0gKiBBZGRzIHBvc3RzIHNlbGVjdGlvbiBub3RpZmljYXRpb25zIGZyb20gY29udGFpbmVkIGVkaXRvciBwYXJ0cyB0bwotICogbGlzdGVuZXJzLiBUaGlzIHBhcnQgd2FzIGNyZWF0ZWQgYXMgYSB3b3JrYXJvdW5kIGZvcgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODMyNCBhbmQgd2lsbCBiZSByZW1vdmVkCi0gKiBvbmNlIFdUUCBpcyBidWlsZGluZyBvbiBhIHBsYXRmb3JtIG1pbGVzdG9uZSB0aGF0IGluY2x1ZGVzIGEgZml4LgotICogCi0gKiBAZGVwcmVjYXRlZCAtIE5vIGxvbmdlciBuZWNlc3NhcnkgYXMgb2YgMy4yTTMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQb3N0U2VsZWN0aW9uTXVsdGlQYWdlRWRpdG9yUGFydCBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgewotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKHRoaXMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBnZXRFZGl0b3IobmV3UGFnZUluZGV4KTsKLQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVFZGl0b3IuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCQkoKFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDMzNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdXJpcmVzb2x2ZXIuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTliNjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTBkNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDE5OjQ4OjA3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E5YWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvUkVBRE1FLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FmNTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBJIGZvciBhbiBVUkkgcmVzb2x2ZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhYTk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NjY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPUNvbW1vbiBVUkkgUmVzb2x2ZXIgRnJhbWV3b3JrCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXJlc29sdmVyRXh0ZW5zaW9ucz1VUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYTk5YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb2x2ZXJFeHRlbnNpb25zIiBuYW1lPSIlcmVzb2x2ZXJFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZCIvPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zY2hlbWEvcmVzb2x2ZXJFeHRlbnNpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMmJiMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiBpZD0icmVzb2x2ZXJFeHRlbnNpb25zIiBuYW1lPSJVUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgVVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcmVnaXN0ZXIgY3VzdG9tIFVSSSByZXNvbHZlcnMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzIGJ5IHRvb2xzIHN1Y2ggYXMgZWRpdG9ycywgZ2VuZXJhdG9ycywgdmFsaWRhdG9ycywgYW5kIHdpemFyZHMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmVyRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvbHZlckV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3ROYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YWdlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzdGFnZSBpbiB3aGljaCB0byBydW4gdGhpcyBleHRlbnNpb24gcmVzb2x2ZXI6IHByZW5vcm1hbGl6YXRpb24sIHBvc3Rub3JtYWxpemF0aW9uLCBvciBwaHlzaWNhbC4gRGVmYXVsdHMgdG8gcG9zdG5vcm1hbGl6YXRpb24uJmx0O2JyJmd0OwotcHJlbm9ybWFsaXphdGlvbjogIHJ1biBiZWZvcmUgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQmbHQ7YnImZ3Q7Ci1wb3N0bm9ybWFsaXphdGlvbjogcnVuIGFmdGVyIG5vcm1hbGl6YXRpb24gb2YgdGhlIGlucHV0Jmx0O2JyJmd0OwotcGh5c2ljYWw6ICAgICAgICAgIHJ1biBhZnRlciBhbGwgcHJlIGFuZCBwb3N0bm9ybWFsaXphdGlvbiByZXNvbHZlcnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcmlvcml0eSBvZiB0aGlzIHJlc29sdmVyOiBoaWdoLCBtZWRpdW0sIG9yIGxvdy4gRGVmYXVsdHMgdG8gbWVkaXVtLiBUaGUgcHJpb3JpdHkgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZW4gdGhpcyByZXNvbHZlciBzaG91bGQgcnVuIHdpdGggcmVzcGVjdCB0byBvdGhlciByZXNvbHZlcnMgZGVmaW5lZCBmb3IgdGhlIHNhbWUgc3RhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3ROYXR1cmUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIElmIGEgcHJvamVjdCBuYXR1cmUgaXMgc3BlY2lmaWVkIHRoZSBVUkkgcmVzb2x2ZXIgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHByb2plY3RzIHRoYXQgY29udGFpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IG5hdHVyZXMuIElmIG5vIHByb2plY3QgbmF0dXJlcyBhcmUgc3BlY2lmaWVkIHRoZSBVUkkgcmVzb2x2ZXIgd2lsbCBiZSB1c2VkIGZvciBhbGwgcHJvamVjdHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgcHJvamVjdCBuYXR1cmUgSUQgZm9yIHdoaWNoIHRoZSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gVVJJIHJlc29sdmVyIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtyZXNvbHZlckV4dGVuc2lvbgotICAgICAgICAgICAgc3RhZ2U9JnF1b3Q7cGh5c2ljYWwmcXVvdDsKLSAgICAgICAgICAgIHByaW9yaXR5PSZxdW90O2xvdyZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5TYW1wbGVSZXNvbHZlciZxdW90OyZndDsKLSAgICAgICZsdDsvcmVzb2x2ZXJFeHRlbnNpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZXNvbHZlcgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBhIHByb2plY3Qgd2l0aCBtdWx0aXBsZSBjb21wb25lbnRzCi0mbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uCi0mbHQ7L2NvZGUmZ3Q7Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGEgY2FjaGUKLSZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uCi0mbHQ7L2NvZGUmZ3Q7Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGZyb20gYW4gWE1MIGNhdGFsb2cKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL0V4dGVuc2libGVVUklSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL0V4dGVuc2libGVVUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIyYzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBjc2FsdGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2libGVVUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2dFeGNlcHRpb25zID0gZmFsc2U7Ci0KLQkvL3Byb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLy9UT0RPLi4uIGNvbnNpZGVyIGN0b3IgdGhhdCB0YWtlcyBhIHByb2plY3QgYXJnCi0JLy9wdWJsaWMgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKElQcm9qZWN0IHByb2plY3QpCi0JLy97Ci0JLy8JdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkvL30KLQotCXB1YmxpYyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIoKQotCXsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0KLQkJLy8gY29tcHV0ZSB0aGUgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSByZXNvdXJjZQotCQkvLwotICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShiYXNlTG9jYXRpb24pOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gIGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbDsKLQotCQlVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlc29sdmVyUmVnaXN0cnkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmdldEludGFuY2UoKTsKLQkJTGlzdCBsaXN0ID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhwcm9qZWN0KTsKLQotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwcmUtbm9ybWFsaXplZCByZXNvbHZlcnMgZnJvbSB0aGUKLQkJLy8gZXh0ZW5zaW9uIHJlZ2lzdHJ5Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QUkVOT1JNQUxJWkFUSU9OKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCVVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0ZW1wcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShmaWxlLCBiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXN1bHQpOwotCQkJaWYodGVtcHJlc3VsdCAhPSBudWxsKQotCQkJewotCQkJICByZXN1bHQgPSB0ZW1wcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJLy8gbm9ybWFsaXplIHRoZSB1cmkKLQkJLy8KLQkJcmVzdWx0ID0gbm9ybWFsaXplKGJhc2VMb2NhdGlvbiwgcmVzdWx0KTsKLQotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwb3N0LW5vcm1hbGl6ZWQgcmVzb2x2ZXJzIGZyb20gdGhlCi0JCS8vIGV4dGVuc2lvbiByZWdpc3RyeQotCQkvLwkJCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7IAotCQkJVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb24pIGkubmV4dCgpOwotCQkJU3RyaW5nIHRlbXByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGZpbGUsIGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHJlc3VsdCk7Ci0JCQlpZih0ZW1wcmVzdWx0ICE9IG51bGwpCi0JCQl7Ci0JCQkgIHJlc3VsdCA9IHRlbXByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbikKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gbG9naWNhbExvY2F0aW9uOwotICAgICAgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZXNvbHZlclJlZ2lzdHJ5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnRhbmNlKCk7Ci0gICAgICBJRmlsZSBmaWxlID0gY29tcHV0ZUZpbGUoYmFzZUxvY2F0aW9uKTsKLSAgICAgIAotICAgICAgLy8gY29tcHV0ZSB0aGUgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSByZXNvdXJjZQotICAgICAgLy8gICAgICAKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAgZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsOyAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhwcm9qZWN0KTsgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QSFlTSUNBTCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwaHlzaWNhbCByZXNvbHZlcnMgZnJvbSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5Ci0gICAgICAgIC8vCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgdGVtcHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoZmlsZSwgYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgcmVzdWx0KTsKLSAgICAgICAgICBpZih0ZW1wcmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGVtcHJlc3VsdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCSAgLy8gSWYgbm8gc3lzdGVtSWQgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLQkgIC8vIHNvIHJldHVybiBudWxsOwotCSAgaWYoc3lzdGVtSWQgPT0gbnVsbCkKLQkgICAgcmV0dXJuIG51bGw7Ci0JICBTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0gICAgICAKLSAgICAgIC8vIGNzIDogc29tZXRpbWVzIG5vcm1hbGl6aW5nIHRoZSBVUkkgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gZ2V0IHRocm93bgotICAgICAgLy8gZm9yIGV4YW1wbGUgdGhlICdiYWQnIHZlcnNpb24gb2YgdGhlIFVSSSBiZWxvdyAuLi4KLSAgICAgIC8vCi0gICAgICAvLyAgIGdvb2QgPSAiamFyOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvV2ViQ29udGVudC9XRUItSU5GL2xpYi9nZW5lcmF0b3IuamFyIS9NRVRBLUlORi9zY2hlbWEvY29uZmlnLmR0ZCIKLSAgICAgIC8vICAgYmFkICA9ICJqYXI6L3Jlc291cmNlL3Byb2plY3QtbmFtZS9XZWJDb250ZW50L1dFQi1JTkYvbGliL2dlbmVyYXRvci5qYXIvTUVUQS1JTkYvc2NoZW1hL2NvbmZpZy5kdGQiCi0gICAgICAvLwotICAgICAgLy8gSGVyZSB3ZSBlbmNsb3NlIHRoZSBub3JtYWxpemF0aW9uIGluIGEgdHJ5L2NhdGNoIGJsb2NrIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY2FsbGVyCi0gICAgICAvLyAoaS5lLiB0aGUgJ3Jlc29sdmUnIG1ldGhvZCkgaXNuJ3QgaW50ZXJlc3RlZCBpbiBoYW5kbGluZyB0aGlzIGV4Y2VwdGlvbi4gICAgICAgIAotCSAgdHJ5Ci0JICB7Ci0JICAgIC8vIG5vcm1hbGl6ZSB0aGUgVVJJCi0JICAgIFVSSSBzeXN0ZW1VUkkgPSBVUkkuY3JlYXRlVVJJKHN5c3RlbUlkKTsKLQkgICAgaWYgKHN5c3RlbVVSSS5pc1JlbGF0aXZlKCkpCi0JICAgIHsKLQkgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24ucmVwbGFjZSgnXFwnLCcvJyk7Ci0JICAgICAgVVJJIGJhc2VVUkkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETyAoY3MpIHdlIHNob3VsZCBhZGQgbW9yZSBjb21tZW50cyB0byBleHBsYWluIHRoaXMgaW4gYSBiaXQgbW9yZSBkZXRhaWwKLQkgICAgICB0cnkKLQkgICAgICB7Ci0JICAgICAgICByZXN1bHQgPSBzeXN0ZW1VUkkucmVzb2x2ZShiYXNlVVJJKS50b1N0cmluZygpOwotCSAgICAgIH0KLQkgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBVUklSZXNvbHZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOwotCSAgICAgICAgSVN0YXR1cyBzdGF0dXNPYmogPSBudWxsOwotCSAgICAgICAgamF2YS5uZXQuVVJJIGJhc2VVUkkyID0gbnVsbDsKLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIGJhc2VVUkkyID0gamF2YS5uZXQuVVJJLmNyZWF0ZShiYXNlTG9jYXRpb24pOwotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMikgewotCSAgICAgICAgICBpZihsb2dFeGNlcHRpb25zKSB7Ci0JICAgICAgICAgICAgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsICJQcm9ibGVtIGluIGNyZWF0aW5nIGphdmEubmV0LlVSSSBpbiBFeHRlbnNpYmxlVVJJUmVzb2x2ZXI6IiArIGUyLmdldE1lc3NhZ2UoKSwgZTIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIGlmKGJhc2VVUkkyICE9IG51bGwpIHsKLQkgICAgICAgICAgICBqYXZhLm5ldC5VUkkgcmVzdWx0VVJJID0gYmFzZVVSSTIucmVzb2x2ZShzeXN0ZW1JZCk7Ci0JICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0VVJJLnRvU3RyaW5nKCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkgICAgICAgICAgaWYobG9nRXhjZXB0aW9ucykgewotCSAgICAgICAgICAgIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSBpbiByZXNvbHZpbmcgd2l0aCBqYXZhLm5ldC5VUkkgaW4gRXh0ZW5zaWJsZVVSSVJlc29sdmVyOiIgKyBlMi5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsgICAgIAotICAgICAgICAvLyBqdXN0IGVhdCB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4gYmFjayB0aGUgb3JpZ2luYWwgc3lzdGVtSWQKLQkgIH0KLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHByb3RlY3RlZCBJRmlsZSBjb21wdXRlRmlsZShTdHJpbmcgYmFzZUxvY2F0aW9uKQotICB7Ci0gICAgSUZpbGUgZmlsZSA9IG51bGw7Ci0gICAgaWYgKGJhc2VMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXR0ZXJuID0gImZpbGU6Ly8vIjsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKHBhdHRlcm4pKQotICAgICAgewotICAgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24uc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgfQotICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0gICAgICBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRkMjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSksIGFzIHNwZWNpZmllZCBieQotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQyAyMzk2PC9hPiwgd2l0aCBjZXJ0YWluCi0gKiBlbmhhbmNlbWVudHMuICBBIDxjb2RlPlVSSTwvY29kZT4gaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgYnkgc3BlY2lmeWluZwotICogdmFsdWVzIGZvciBpdHMgY29tcG9uZW50cywgb3IgYnkgcHJvdmlkaW5nIGEgc2luZ2xlIFVSSSBzdHJpbmcsIHdoaWNoIGlzCi0gKiBwYXJzZWQgaW50byBpdHMgY29tcG9uZW50cy4gIFN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgd2hvc2UgbmFtZXMgYmVnaW4KLSAqIHdpdGggImNyZWF0ZSIgYXJlIHVzZWQgZm9yIGJvdGggZm9ybXMgb2Ygb2JqZWN0IGNyZWF0aW9uLiAgTm8gcHVibGljIG9yCi0gKiBwcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBwcm92aWRlZDsgdGhpcyBjbGFzcyBjYW4gbm90IGJlIHN1YmNsYXNzZWQuCi0gKgotICogPHA+TGlrZSA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5VUkk8L2NvZGU+IGlzIGFuIGltbXV0YWJsZSBjbGFzczsKLSAqIGEgPGNvZGU+VVJJPC9jb2RlPiBpbnN0YW5jZSBvZmZlcnMgc2V2ZXJhbCBieS12YWx1ZSBtZXRob2RzIHRoYXQgcmV0dXJuIGEKLSAqIG5ldyA8Y29kZT5VUkk8L2NvZGU+IG9iamVjdCBiYXNlZCBvbiBpdHMgY3VycmVudCBzdGF0ZS4gIE1vc3QgdXNlZnVsLAotICogYSByZWxhdGl2ZSA8Y29kZT5VUkk8L2NvZGU+IGNhbiBiZSB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZlfWQgYWdhaW5zdAotICogYSBiYXNlIGFic29sdXRlIDxjb2RlPlVSSTwvY29kZT4gLS0gdGhlIGxhdHRlciB0eXBpY2FsbHkgaWRlbnRpZmllcyB0aGUKLSAqIGRvY3VtZW50IGluIHdoaWNoIHRoZSBmb3JtZXIgYXBwZWFycy4gIFRoZSBpbnZlcnNlIHRvIHRoaXMgaXMge0BsaW5rCi0gKiAjZGVyZXNvbHZlKFVSSSkgZGVyZXNvbHZlfSwgd2hpY2ggYW5zd2VycyB0aGUgcXVlc3Rpb24sICJ3aGF0IHJlbGF0aXZlCi0gKiBVUkkgd2lsbCByZXNvbHZlLCBhZ2FpbnN0IHRoZSBnaXZlbiBiYXNlLCB0byB0aGlzIGFic29sdXRlIFVSST8iCi0gKgotICogPHA+SW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkM8L2E+LCBtdWNoCi0gKiBhdHRlbnRpb24gaXMgZm9jdXNlZCBvbiBhIGhpZXJhcmNoaWNhbCBuYW1pbmcgc3lzdGVtIHVzZWQgd2lkZWx5IHRvCi0gKiBsb2NhdGUgcmVzb3VyY2VzIHZpYSBjb21tb24gcHJvdG9jb2xzIHN1Y2ggYXMgSFRUUCwgRlRQLCBhbmQgR29waGVyLCBhbmQKLSAqIHRvIGlkZW50aWZ5IGZpbGVzIG9uIGEgbG9jYWwgZmlsZSBzeXN0ZW0uICBBY29yZGluZ2x5LCBtb3N0IG9mIHRoaXMKLSAqIGNsYXNzJ3MgZnVuY3Rpb25hbGl0eSBpcyBmb3IgaGFuZGxpbmcgc3VjaCBVUklzLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZAotICogdmlhIHtAbGluayAjaXNIaWVyYXJjaGljYWwgaXNIaWVyYXJjaGljYWx9LgotICoKLSAqIDxwPjxhIG5hbWU9ImRldmljZV9leHBsYW5hdGlvbiI+Ci0gKiBUaGUgcHJpbWFyeSBlbmhhbmNlbWVudCBiZXlvbmQgdGhlIFJGQyBkZXNjcmlwdGlvbiBpcyBhbiBvcHRpb25hbAotICogZGV2aWNlIGNvbXBvbmVudC4gIEluc3RlYWQgb2YgdHJlYXRpbmcgdGhlIGRldmljZSBhcyBqdXN0IGFub3RoZXIgc2VnbWVudAotICogaW4gdGhlIHBhdGgsIGl0IGNhbiBiZSBzdG9yZWQgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQgKGFsbW9zdCBhCi0gKiBzdWItYXV0aG9yaXR5KSwgd2l0aCB0aGUgcm9vdCBiZWxvdyBpdC4gIEZvciBleGFtcGxlLCByZXNvbHZpbmcKLSAqIDxjb2RlPi9iYXI8L2NvZGU+IGFnYWluc3QgPGNvZGU+ZmlsZTovLy9jOi9mb288L2NvZGU+IHdvdWxkIHJlc3VsdCBpbgotICogPGNvZGU+ZmlsZTovLy9jOi9iYXI8L2NvZGU+IGJlaW5nIHJldHVybmVkLiAgQWxzbywgeW91IGNhbm5vdCB0YWtlCi0gKiB0aGUgcGFyZW50IG9mIGEgZGV2aWNlLCBzbyByZXNvbHZpbmcgPGNvZGU+Li48L2NvZGU+IGFnYWluc3QKLSAqIDxjb2RlPmZpbGU6Ly8vYzovPC9jb2RlPiB3b3VsZCBub3QgeWllbGQgPGNvZGU+ZmlsZTovLy88L2NvZGU+LCBhcyB5b3UKLSAqIG1pZ2h0IGV4cGVjdC4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggZmlsZS1zY2hlbWUKLSAqIFVSSXMsIGFzIGRldmljZXMgZG8gbm90IHR5cGljYWxseSBvY2N1ciBpbiBwcm90b2NvbC1iYXNlZCBvbmVzLiAgQQotICogZGV2aWNlLWVuYWJsZWQgPGNvZGU+VVJJPC9jb2RlPiBpcyBjcmVhdGVkIGJ5IHBhcnNpbmcgYSBzdHJpbmcgd2l0aAotICoge0BsaW5rICNjcmVhdGVVUkkoU3RyaW5nKSBjcmVhdGVVUkl9OyBpZiB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aAotICogZW5kcyB3aXRoIHRoZSA8Y29kZT46PC9jb2RlPiBjaGFyYWN0ZXIsIGl0IGlzIHN0b3JlZCAoaW5jbHVkaW5nIHRoZSBjb2xvbikKLSAqIGFzIHRoZSBkZXZpY2UsIGluc3RlYWQuICBBbHRlcm5hdGVseSwgZWl0aGVyIHRoZSB7QGxpbmsKLSAqICNjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIG5vLXBhdGh9Ci0gKiBvciB0aGUge0BsaW5rICNjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nW10sCi0gKiBTdHJpbmcsIFN0cmluZykgYWJzb2x1dGUtcGF0aH0gZm9ybSBvZiA8Y29kZT5jcmVhdGVIaWVyYXJjaGljYWxVUkkoKTwvY29kZT4KLSAqIGNhbiBiZSB1c2VkLCBpbiB3aGljaCBhIG5vbi1udWxsIDxjb2RlPmRldmljZTwvY29kZT4gcGFyYW1ldGVyIGNhbiBiZQotICogc3BlY2lmaWVkLgotICoKLSAqIDxwPjxhIG5hbWU9ImFyY2hpdmVfZXhwbGFuYXRpb24iPiAKLSAqIFRoZSBvdGhlciBlbmhhbmNlbWVudCBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgYWxtb3N0LWhpZXJhcmNoaWNhbAotICogZm9ybSB1c2VkIGZvciBmaWxlcyB3aXRoaW4gYXJjaGl2ZXMsIHN1Y2ggYXMgdGhlIEpBUiBzY2hlbWUsIGRlZmluZWQKLSAqIGZvciB0aGUgSmF2YSBQbGF0Zm9ybSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ige0BsaW5rCi0gKiBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9ufS4gQnkgZGVmYXVsdCwgdGhpcyBzdXBwb3J0IGlzIGVuYWJsZWQgZm9yCi0gKiBhYnNvbHV0ZSBVUklzIHdpdGggc2NoZW1lIGVxdWFsIHRvICJqYXIiLCAiemlwIiwgb3IgImFyY2hpdmUiIChpZ25vcmluZyBjYXNlKSwgYW5kCi0gKiBpcyBpbXBsZW1lbnRlZCBieSBhIGhpZXJhcmNoaWNhbCBVUkksIHdob3NlIGF1dGhvcml0eSBpbmNsdWRlcyB0aGUKLSAqIGVudGlyZSBVUkkgb2YgdGhlIGFyY2hpdmUsIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIDxjb2RlPiE8L2NvZGU+Ci0gKiBjaGFyYWN0ZXIuICBUaGUgVVJJIG9mIHRoZSBhcmNoaXZlIG11c3QgaGF2ZSBubyBmcmFnbWVudC4gIFRoZSB3aG9sZQotICogYXJjaGl2ZSBVUkkgbXVzdCBoYXZlIG5vIGRldmljZSBhbmQgYW4gYWJzb2x1dGUgcGF0aC4gIFNwZWNpYWwgaGFuZGxpbmcKLSAqIGlzIHN1cHBvcnRlZCBmb3Ige0BsaW5rICNjcmVhdGVVUkkgY3JlYXRpbmd9LCB7QGxpbmsKLSAqICN2YWxpZEFyY2hpdmVBdXRob3JpdHkgdmFsaWRhdGluZ30sIHtAbGluayAjZGV2aWNlUGF0aCBnZXR0aW5nIHRoZSBwYXRofQotICogZnJvbSwgYW5kIHtAbGluayAjdG9TdHJpbmcgZGlzcGxheWluZ30gYXJjaGl2ZSBVUklzLiBJbiBhbGwgb3RoZXIKLSAqIG9wZXJhdGlvbnMsIGluY2x1ZGluZyB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZpbmd9IGFuZCB7QGxpbmsKLSAqICNkZXJlc29sdmUoVVJJKSBkZXJlc29sdmluZ30sIHRoZXkgYXJlIGhhbmRsZWQgbGlrZSBhbnkgb3JkaW5hcnkgVVJJLgotICoKLSAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaW1wb3NlIHRoZSBhbGwgb2YgdGhlIHJlc3RyaWN0aW9ucyBvbgotICogY2hhcmFjdGVyIHZhbGlkaXR5IHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgUkZDLiAgU3RhdGljIG1ldGhvZHMgd2hvc2UKLSAqIG5hbWVzIGJlZ2luIHdpdGggInZhbGlkIiBhcmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgaXMgdmFsaWQKLSAqIHZhbHVlIGZvciB0aGUgdmFyaW91cyBVUkkgY29tcG9uZW50cy4gIFByZXNlbnRseSwgdGhlc2UgdGVzdHMgcGxhY2Ugbm8KLSAqIHJlc3RyaWN0aW9ucyBiZXlvbmQgd2hhdCB3b3VsZCBoYXZlIGJlZW4gcmVxdWlyZWQgaW4gb3JkZXIgZm9yIHtAbGluawotICogY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfSB0byBoYXZlIHBhcnNlZCB0aGVtIGNvcnJlY3RseSBmcm9tIGEgc2luZ2xlCi0gKiBVUkkgc3RyaW5nLiAgSWYgbmVjZXNzYXJ5IGluIHRoZSBmdXR1cmUsIHRoZXNlIHRlc3RzIG1heSBiZSBtYWRlIG1vcmUKLSAqIHN0cmljdCwgdG8gYmV0dGVyIGNvZm9ybSB0byB0aGUgUkZDLgotICogCi0gKiA8cD5Bbm90aGVyIGdyb3VwIG9mIHN0YXRpYyBtZXRob2RzLCB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJlbmNvZGUiLCB1c2UKLSAqIHBlcmNlbnQgZXNjYXBpbmcgdG8gZW5jb2RlIGFueSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gdGhlCi0gKiB2YXJpb3VzIFVSSSBjb21wb25lbnRzLiBBbm90aGVyIHN0YXRpYyBtZXRob2QgaXMgcHJvdmlkZWQgdG8ge0BsaW5rCi0gKiAjZGVjb2RlIGRlY29kZX0gZW5jb2RlZCBzdHJpbmdzLiAgQW4gZXNjYXBlZCBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYXMKLSAqIGEgcGVyY2VudCBzeWJvbCAoPGNvZGU+JTwvY29kZT4pLCBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cyB0aGF0IHNwZWNpZnkKLSAqIHRoZSBjaGFyYWN0ZXIgY29kZS4gIFRoZXNlIGVuY29kaW5nIG1ldGhvZHMgYXJlIG1vcmUgc3RyaWN0IHRoYW4gdGhlCi0gKiB2YWxpZGF0aW9uIG1ldGhvZHMgZGVzY3JpYmVkIGFib3ZlLiAgVGhleSBlbnN1cmUgdmFsaWRpdHkgYWNjb3JkaW5nIHRvIHRoZQotICogUkZDLCB3aXRoIG9uZSBleGNlcHRpb246IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICoKLSAqIDxwPlRoZSBSRkMgYWxsb3dzIG9ubHkgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gNy1iaXQgVVMtQVNDSUkKLSAqIHJlcHJlc2VudGF0aW9ucy4gIE5vbi1BU0NJSSwgc2luZ2xlLWJ5dGUgY2hhcmFjdGVycyBjYW4gYmUgdXNlZCBvbmx5IHZpYQotICogcGVyY2VudCBlc2NhcGluZywgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIEphdmEncwotICogVW5pY29kZSA8Y29kZT5jaGFyPC9jb2RlPiBhbmQgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbnMsIGFuZAotICogbWFrZXMgbm8gYXR0ZW1wdCB0byBlbmNvZGUgY2hhcmFjdGVycyAweEEwIGFuZCBhYm92ZS4gIENoYXJhY3RlcnMgaW4gdGhlCi0gKiByYW5nZSAweDgwLTB4OUYgYXJlIHN0aWxsIGVzY2FwZWQuICBJbiB0aGlzIHJlc3BlY3QsIHRoaXMgbm90aW9uIG9mIGEgVVJJCi0gKiBpcyBhY3R1YWxseSBtb3JlIGxpa2UgYW4gSVJJIChJbnRlcm5hdGlvbmFsaXplZCBSZXNvdXJjZSBJZGVudGlmaWVyKSwgZm9yCi0gKiB3aGljaCBhbiBSRkMgaXMgbm93IGluIDxocmVmPSJodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL2lyaS1lZGl0L2RyYWZ0LWR1ZXJzdC1pcmktMDkudHh0Ij5kcmFmdAotICogZm9ybTwvYT4uCi0gKgotICogPHA+RmluYWxseSwgbm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgPGNvZGU+bnVsbDwvY29kZT4gcGFyYW1ldGVyIHRvCi0gKiB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBhbmQgYW4gZW1wdHkgc3RyaW5nLiAgVGhlIGZvcm1lciBzaWduaWZpZXMgdGhlCi0gKiBhYnNlbnNlIG9mIGEgZ2l2ZW4gVVJJIGNvbXBvbmVudCwgd2hpbGUgdGhlIGxhdHRlciBzaW1wbHkgbWFrZXMgdGhlCi0gKiBjb21wb25lbnQgYmxhbmsuICBUaGlzIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgZWZmZWN0IHdoZW4gcmVzb2x2aW5nLiAgRm9yCi0gKiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHR3byBVUklzOiA8Y29kZT4vYmFyPC9jb2RlPiAod2l0aCBubwotICogYXV0aG9yaXR5KSBhbmQgPGNvZGU+Ly8vYmFyPC9jb2RlPiAod2l0aCBhIGJsYW5rIGF1dGhvcml0eSkuICBJbWFnaW5lCi0gKiByZXNvbHZpbmcgdGhlbSBhZ2FpbnN0IGEgYmFzZSB3aXRoIGFuIGF1dGhvcml0eSwgc3VjaCBhcwotICogPGNvZGU+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2NvZGU+LiAgVGhlIGZvcm1lciBjYXNlIHdpbGwgeWllbGQKLSAqIDxjb2RlPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYmFyPC9jb2RlPiwgYXMgdGhlIGJhc2UgYXV0aG9yaXR5IHdpbGwgYmUKLSAqIHByZXNlcnZlZC4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGVtcHR5IGF1dGhvcml0eSB3aWxsIG92ZXJyaWRlIHRoZQotICogYmFzZSBhdXRob3JpdHksIHJlc3VsdGluZyBpbiA8Y29kZT5odHRwOi8vL2JhcjwvY29kZT4hCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVUkkKLXsKLSAgLy8gQ29tbW9uIHRvIGFsbCBVUkkgdHlwZXMuCi0gIHByaXZhdGUgZmluYWwgaW50IGhhc2hDb2RlOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGllcmFyY2hpY2FsOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBzY2hlbWU7ICAvLyBudWxsIC0+IHJlbGF0aXZlIFVSSSByZWZlcmVuY2UKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5OwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBmcmFnbWVudDsKLSAgcHJpdmF0ZSBVUkkgY2FjaGVkVHJpbUZyYWdtZW50OwotICBwcml2YXRlIFN0cmluZyBjYWNoZWRUb1N0cmluZzsKLSAgLy9wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXJpOwotICAvL3ByaXZhdGUgVVJJIGNhY2hlZEFTQ0lJVVJJOwotCi0gIC8vIEFwcGxpY2FibGUgb25seSB0byBhIGhpZXJhcmNoaWNhbCBVUkkuCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGRldmljZTsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFic29sdXRlUGF0aDsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBzZWdtZW50czsgLy8gZW1wdHkgbGFzdCBzZWdtZW50IC0+IHRyYWlsaW5nIHNlcGFyYXRvcgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBxdWVyeTsKLQotICAvLyBBIGNhY2hlIG9mIFVSSXMsIGtleWVkIGJ5IHRoZSBzdHJpbmdzIGZyb20gd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuCi0gIC8vIFRoZSBmcmFnbWVudCBvZiBhbnkgVVJJIGlzIHJlbW92ZWQgYmVmb3JlIGNhY2hpbmcgaXQgaGVyZSwgdG8gbWluaW1pemUKLSAgLy8gdGhlIHNpemUgb2YgdGhlIGNhY2hlIGluIHRoZSB1c3VhbCBjYXNlIHdoZXJlIG1vc3QgVVJJcyBvbmx5IGRpZmZlciBieQotICAvLyB0aGUgZnJhZ21lbnQuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCB1cmlDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQotICAvLyBUaGUgbG93ZXItY2FzZWQgc2NoZW1lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSBhcmNoaXZlIFVSSXMuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBhcmNoaXZlU2NoZW1lczsKLQotICAvLyBJZGVudGlmaWVzIGEgZmlsZS10eXBlIGFic29sdXRlIFVSSS4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9GSUxFID0gImZpbGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0pBUiA9ICJqYXIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX1pJUCA9ICJ6aXAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7Ci0KLSAgLy8gU3BlY2lhbCBzZWdtZW50IHZhbHVlcyBpbnRlcnByZXRlZCBhdCByZXNvbHZlIGFuZCByZXNvbHZlIHRpbWUuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX0VNUFRZID0gIiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX1NFTEYgPSAiLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX1BBUkVOVCA9ICIuLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PX1NFR01FTlRTID0gbmV3IFN0cmluZ1swXTsKLQotICAvLyBTZXBhcmF0b3JzIGZvciBwYXJzaW5nIGEgVVJJIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTQ0hFTUVfU0VQQVJBVE9SID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZX1NFUEFSQVRPUiA9ICIvLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgREVWSUNFX0lERU5USUZJRVIgPSAnOic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VHTUVOVF9TRVBBUkFUT1IgPSAnLyc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVFUllfU0VQQVJBVE9SID0gJz8nOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZSQUdNRU5UX1NFUEFSQVRPUiA9ICcjJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVU0VSX0lORk9fU0VQQVJBVE9SID0gJ0AnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBPUlRfU0VQQVJBVE9SID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUiA9ICcuJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBUkNISVZFX0lERU5USUZJRVIgPSAnISc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1NFUEFSQVRPUiA9ICIhLyI7Ci0KLSAgLy8gQ2hhcmFjdGVycyB0byB1c2UgaW4gZXNjYXBpbmcuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVNDQVBFID0gJyUnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsKLSAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKLQotICAvLyBTb21lIGNoYXJhY3RlciBjbGFzc2VzLCBhcyBkZWZpbmVkIGluIFJGQyAyMzk2J3MgQk5GIGZvciBVUkkuCi0gIC8vIFRoZXNlIGFyZSAxMjgtYml0IGJpdG1hc2tzLCBzdG9yZWQgYXMgdHdvIGxvbmdzLCB3aGVyZSB0aGUgTnRoIGJpdCBpcyBzZXQKLSAgLy8gaWZmIHRoZSBBU0NJSSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSBOIGlzIGluY2x1ZGVkIGluIHRoZSBzZXQuICBUaGVzZSBhcmUKLSAgLy8gY3JlYXRlZCB3aXRoIHRoZSBoaWdoQml0bWFzaygpIGFuZCBsb3dCaXRtYXNrKCkgbWV0aG9kcyBkZWZpbmVkIGJlbG93LAotICAvLyBhbmQgYSBjaGFyYWN0ZXIgaXMgdGVzdGVkIGFnYWluc3QgdGhlbSB1c2luZyBtYXRjaGVzKCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFfSEkgPSBoaWdoQml0bWFzaygnYScsICd6JykgfCBoaWdoQml0bWFzaygnQScsICdaJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFfTE8gPSBsb3dCaXRtYXNrKCdhJywgJ3onKSAgfCBsb3dCaXRtYXNrKCdBJywgJ1onKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBESUdJVF9ISSA9IGhpZ2hCaXRtYXNrKCcwJywgJzknKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBESUdJVF9MTyA9IGxvd0JpdG1hc2soJzAnLCAnOScpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBTlVNX0hJID0gQUxQSEFfSEkgfCBESUdJVF9ISTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQU5VTV9MTyA9IEFMUEhBX0xPIHwgRElHSVRfTE87Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSEVYX0hJID0gRElHSVRfSEkgfCBoaWdoQml0bWFzaygnQScsICdGJykgfCBoaWdoQml0bWFzaygnYScsICdmJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSEVYX0xPID0gRElHSVRfTE8gfCBsb3dCaXRtYXNrKCdBJywgJ0YnKSAgfCBsb3dCaXRtYXNrKCdhJywgJ2YnKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVTlJFU0VSVkVEX0hJID0gQUxQSEFOVU1fSEkgfCBoaWdoQml0bWFzaygiLV8uIX4qJygpIik7IAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVOUkVTRVJWRURfTE8gPSBBTFBIQU5VTV9MTyB8IGxvd0JpdG1hc2soIi1fLiF+KicoKSIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFU0VSVkVEX0hJID0gaGlnaEJpdG1hc2soIjsvPzpAJj0rJCwiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFUlZFRF9MTyA9IGxvd0JpdG1hc2soIjsvPzpAJj0rJCwiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUklDX0hJID0gUkVTRVJWRURfSEkgfCBVTlJFU0VSVkVEX0hJOyAgLy8gfCB1Y3NjaGFyIHwgZXNjYXBlZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVSSUNfTE8gPSBSRVNFUlZFRF9MTyB8IFVOUkVTRVJWRURfTE87Ci0KLSAgLy8gQWRkaXRpb25hbCB1c2VmdWwgY2hhcmFjdGVyIGNsYXNzZXMsIGluY2x1ZGluZyBjaGFyYWN0ZXJzIHZhbGlkIGluIGNlcnRhaW4KLSAgLy8gVVJJIGNvbXBvbmVudHMgYW5kIHNlcGFyYXRvcnMgdXNlZCBpbiBwYXJzaW5nIHRoZW0gb3V0IG9mIGEgc3RyaW5nLiAKLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0NIQVJfSEkgPSBVTlJFU0VSVkVEX0hJIHwgaGlnaEJpdG1hc2soIjs6QCY9KyQsIik7ICAvLyB8IHVjc2NoYXIgfCBlc2NhcGVkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9DSEFSX0xPID0gVU5SRVNFUlZFRF9MTyB8IGxvd0JpdG1hc2soIjs6QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEFUSF9DSEFSX0hJID0gU0VHTUVOVF9DSEFSX0hJIHwgaGlnaEJpdG1hc2soJy8nKTsgIC8vIHwgdWNzY2hhciB8IGVzY2FwZWQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQVRIX0NIQVJfTE8gPSBTRUdNRU5UX0NIQVJfTE8gfCBsb3dCaXRtYXNrKCcvJyk7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQ0hFTUVfQ0hBUl9ISSA9IEFMUEhBTlVNX0hJIHwgaGlnaEJpdG1hc2soIistLiIpOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRU1FX0NIQVJfTE8gPSBBTFBIQU5VTV9MTyB8IGxvd0JpdG1hc2soIistLiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BSk9SX1NFUEFSQVRPUl9ISSA9IGhpZ2hCaXRtYXNrKCI6Lz8jIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFKT1JfU0VQQVJBVE9SX0xPID0gbG93Qml0bWFzaygiOi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfRU5EX0hJID0gaGlnaEJpdG1hc2soIi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfRU5EX0xPID0gbG93Qml0bWFzaygiLz8jIik7Ci0KLSAgLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciBhcmNoaXZlU2NoZW1lcy4KLSAgc3RhdGljCi0gIHsKLSAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICBzZXQuYWRkKFNDSEVNRV9KQVIpOwotICAgIHNldC5hZGQoU0NIRU1FX1pJUCk7Ci0gICAgc2V0LmFkZChTQ0hFTUVfQVJDSElWRSk7Ci0gICAgCi0gICAgCi0gICAgYXJjaGl2ZVNjaGVtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoc2V0KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGxvd2VyIGhhbGYgYml0bWFzayBmb3IgdGhlIGdpdmVuIEFTQ0lJIGNoYXJhY3Rlci4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb3dCaXRtYXNrKGNoYXIgYykKLSAgewotICAgIHJldHVybiBjIDwgNjQgPyAxTCA8PCBjIDogMEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1cHBlciBoYWxmIGJpdG1hc2sgZm9yIHRoZSBnaXZlbiBBQ1NJSSBjaGFyYWN0ZXIuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soY2hhciBjKQotICB7Ci0gICAgcmV0dXJuIGMgPj0gNjQgJiYgYyA8IDEyOCA/IDFMIDw8IChjIC0gNjQpIDogMEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHR3bwotICAvLyBnaXZlbiBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgbG93Qml0bWFzayhjaGFyIGZyb20sIGNoYXIgdG8pCi0gIHsKLSAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgIGlmIChmcm9tIDwgNjQgJiYgZnJvbSA8PSB0bykKLSAgICB7Ci0gICAgICB0byA9IHRvIDwgNjQgPyB0byA6IDYzOwotICAgICAgZm9yIChjaGFyIGMgPSBmcm9tOyBjIDw9IHRvOyBjKyspCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCB8PSAoMUwgPDwgYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1cHBlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCBBc0NJSSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHR3bwotICAvLyBnaXZlbiBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soY2hhciBmcm9tLCBjaGFyIHRvKQotICB7Ci0gICAgcmV0dXJuIHRvIDwgNjQgPyAwIDogbG93Qml0bWFzaygoY2hhcikoZnJvbSA8IDY0ID8gMCA6IGZyb20gLSA2NCksIChjaGFyKSh0byAtIDY0KSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCB0aGUgQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLSAgLy8gc3RyaW5nLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGxvd0JpdG1hc2soU3RyaW5nIGNoYXJzKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBjaGFycy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA8IDY0KSByZXN1bHQgfD0gKDFMIDw8IGMpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0gIC8vIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBoaWdoQml0bWFzayhTdHJpbmcgY2hhcnMpCi0gIHsKLSAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBjaGFycy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGNoYXJzLmNoYXJBdChpKTsKLSAgICAgIGlmIChjID49IDY0ICYmIGMgPCAxMjgpIHJlc3VsdCB8PSAoMUwgPDwgKGMgLSA2NCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHNldCBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuCi0gIC8vIGJpdG1hc2suCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGlmIChjID49IDEyOCkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjIDwgNjQgPwotICAgICAgKCgxTCA8PCBjKSAmIGxvd0JpdG1hc2spICE9IDAgOgotICAgICAgKCgxTCA8PCAoYyAtIDY0KSkgJiBoaWdoQml0bWFzaykgIT0gMDsKLSAgfQotCi0gIC8vIERlYnVnZ2luZyBtZXRob2Q6IGNvbnZlcnRzIHRoZSBnaXZlbiBsb25nIHRvIGEgc3RyaW5nIG9mIGJpbmFyeSBkaWdpdHMuCi0vKgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9CaXRzKGxvbmcgbCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgIHsKLSAgICAgIGJvb2xlYW4gYiA9IChsICYgMUwpICE9IDA7Ci0gICAgICByZXN1bHQuaW5zZXJ0KDAsIGIgPyAnMScgOiAnMCcpOwotICAgICAgbCA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0qLwotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgZ2VuZXJpYywgbm9uLWhpZXJhcmNoaWNhbCBVUkkuICBUaGVyZSBpcyBubwotICAgKiBjb25jZXB0IG9mIGEgcmVsYXRpdmUgbm9uLWhpZXJhcmNoaWNhbCBVUkk7IHN1Y2ggYW4gb2JqZWN0IGNhbm5vdCBiZQotICAgKiBjcmVhdGVkLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBudWxsLCBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlCi0gICAqIFVSSTwvYT4gc2NoZW1lLCBvciBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+LCA8Y29kZT5vcGFxdWVQYXJ0PC9jb2RlPiwgb3IKLSAgICogPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlR2VuZXJpY1VSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgb3BhcXVlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoc2NoZW1lID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVsYXRpdmUgbm9uLWhpZXJhcmNoaWNhbCBVUkkiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLWhpZXJhcmNoaWNhbCBhcmNoaXZlIFVSSSIpOwotICAgIH0KLQotICAgIHZhbGlkYXRlVVJJKGZhbHNlLCBzY2hlbWUsIG9wYXF1ZVBhcnQsIG51bGwsIGZhbHNlLCBOT19TRUdNRU5UUywgbnVsbCwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKGZhbHNlLCBzY2hlbWUsIG9wYXF1ZVBhcnQsIG51bGwsIGZhbHNlLCBOT19TRUdNRU5UUywgbnVsbCwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggbm8gcGF0aC4gIFRoZQotICAgKiBVUkkgd2lsbCBiZSByZWxhdGl2ZSBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIG5vbi1udWxsLCBhbmQgYWJzb2x1dGUKLSAgICogb3RoZXJ3aXNlLiAgQW4gYWJzb2x1dGUgVVJJIHdpdGggbm8gcGF0aCByZXF1aXJlcyBhIG5vbi1udWxsCi0gICAqIDxjb2RlPmF1dGhvcml0eTwvY29kZT4gYW5kL29yIDxjb2RlPmRldmljZTwvY29kZT4uCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzCi0gICAqIG5vbi1udWxsIHdoaWxlIDxjb2RlPmF1dGhvcml0eTwvY29kZT4gYW5kIDxjb2RlPmRldmljZTwvY29kZT4gYXJlIG51bGwsCi0gICAqIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUKLSAgICogVVJJPC9hPiBzY2hlbWUsIG9yIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4sIDxjb2RlPmF1dGhvcml0eTwvY29kZT4sCi0gICAqIDxjb2RlPmRldmljZTwvY29kZT4sIDxjb2RlPnF1ZXJ5PC9jb2RlPiwgb3IgPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdAotICAgKiB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZSB2YWxpZFNoZW1lfSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LAotICAgKiB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwKLSAgICogcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aG91dCBhdXRob3JpdHksIGRldmljZSwgcGF0aCIpOwotICAgIH0KLQotICAgIGlmIChpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhcmNoaXZlIFVSSSB3aXRoIG5vIHBhdGgiKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBmYWxzZSwgTk9fU0VHTUVOVFMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgZmFsc2UsIE5PX1NFR01FTlRTLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYWJzb2x1dGUgcGF0aC4KLSAgICogVGhlIFVSSSB3aWxsIGJlIHJlbGF0aXZlIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgbm9uLW51bGwsIGFuZAotICAgKiBhYnNvbHV0ZSBvdGhlcndpc2UuIAotICAgKgotICAgKiBAcGFyYW0gc2VnbWVudHMgYW4gYXJyYXkgb2Ygbm9uLW51bGwgc3RyaW5ncywgZWFjaCByZXByZXNlbnRpbmcgb25lCi0gICAqIHNlZ21lbnQgb2YgdGhlIHBhdGguICBBcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCBpcyBhdXRvbWF0aWNhbGx5Ci0gICAqIHByZWNlZWRlZCBieSBhIDxjb2RlPi88L2NvZGU+IHNlcGFyYXRvci4gIElmIGRlc2lyZWQsIGEgdHJhaWxpbmcKLSAgICogc2VwYXJhdG9yIHNob3VsZCBiZSByZXByZXNlbnRlZCBieSBhbiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhcyB0aGUgbGFzdAotICAgKiBlbGVtZW50IG9mIHRoZSBhcnJheS4gCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzCi0gICAqIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT4gc2NoZW1lIGFuZCAKLSAgICogPGNvZGU+ZGV2aWNlPC9jb2RlPiBpcyBub24tbnVsbCwgb3IgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiwKLSAgICogPGNvZGU+YXV0aG9yaXR5PC9jb2RlPiwgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgPGNvZGU+c2VnbWVudHM8L2NvZGU+LAotICAgKiA8Y29kZT5xdWVyeTwvY29kZT4sIG9yIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvCi0gICAqIHtAbGluayAjdmFsaWRTY2hlbWUgdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fQotICAgKiBvciB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eSB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsKLSAgICogI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsKLSAgICogI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMKLSAgICogYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgZGV2aWNlICE9IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJjaGl2ZSBVUkkgd2l0aCBkZXZpY2UiKTsKLSAgICB9Ci0KLSAgICBzZWdtZW50cyA9IGZpeChzZWdtZW50cyk7Ci0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgdHJ1ZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgdHJ1ZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIHJlbGF0aXZlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCByZWxhdGl2ZQotICAgKiBwYXRoLgotICAgKgotICAgKiBAcGFyYW0gc2VnbWVudHMgYW4gYXJyYXkgb2Ygbm9uLW51bGwgc3RyaW5ncywgZWFjaCByZXByZXNlbnRpbmcgb25lCi0gICAqIHNlZ21lbnQgb2YgdGhlIHBhdGguICBBIHRyYWlsaW5nIHNlcGFyYXRvciBpcyByZXByZXNlbnRlZCBieSBhbgotICAgKiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnRzPC9jb2RlPiwKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+LCBvciA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byAKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZ1tdIHNlZ21lbnRzLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBzZWdtZW50cyA9IGZpeChzZWdtZW50cyk7Ci0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIG51bGwgdG8gbGVuZ3RoLXplcm8gYXJyYXksIGFuZCBjbG9uZXMgYXJyYXkgdG8gZW5zdXJlCi0gIC8vIGltbXV0YWJpbGl0eS4KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZml4KFN0cmluZ1tdIHNlZ21lbnRzKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzID09IG51bGwgPyBOT19TRUdNRU5UUyA6IChTdHJpbmdbXSlzZWdtZW50cy5jbG9uZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBVUkkgc3RyaW5nLCB3aXRoIAotICAgKiA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5leHBsaWNpdCBkZXZpY2Ugc3VwcG9ydDwvYT4gYW5kIGhhbmRsaW5nCi0gICAqIGZvciA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUklzPC9hPiBlbmFibGVkLiBUaGUKLSAgICogc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJzZWQgYXMgZGVzY3JpYmVkIGluIDxhCi0gICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMgMjM5NjwvYT4sIGFuZCBhbgotICAgKiBhcHByb3ByaWF0ZSA8Y29kZT5VUkk8L2NvZGU+IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLiAgTm90ZSB0aGF0Ci0gICAqIHZhbGlkaXR5IHRlc3RpbmcgaXMgbm90IGFzIHN0cmljdCBhcyBpbiB0aGUgUkZDOyBlc3NlbnRpYWxseSwgb25seQotICAgKiBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZC4gIFNvLCBmb3IgZXhhbXBsZSwgbm9uLUxhdGluCi0gICAqIGFscGhhYmV0IGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIHRoZSBzY2hlbWUgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgYW4KLSAgICogZXJyb3IuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVSSVdpdGhDYWNoZSh1cmkpOyAKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgdGhhdCBlbmNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIFVSSSBzdHJpbmcuCi0gICAqIEFwcHJvcHJpYXRlIGVuY29kaW5nIGlzIHBlcmZvcm1lZCBmb3IgZWFjaCBjb21wb25lbnQgb2YgdGhlIFVSSS4KLSAgICogSWYgbW9yZSB0aGFuIG9uZSA8Y29kZT4jPC9jb2RlPiBpcyBpbiB0aGUgc3RyaW5nLCB0aGUgbGFzdCBvbmUgaXMKLSAgICogYXNzdW1lZCB0byBiZSB0aGUgZnJhZ21lbnQncyBzZXBhcmF0b3IsIGFuZCBhbnkgb3RoZXJzIGFyZSBlbmNvZGVkLgotICAgKiAgCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gPGNvZGU+dXJpPC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkKLSAgICogdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluawotICAgKiAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzIGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUoZW5jb2RlVVJJKHVyaSwgaWdub3JlRXNjYXBlZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgVVJJIHN0cmluZywgd2l0aCAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZXhwbGljaXQgZGV2aWNlIHN1cHBvcnQ8L2E+IGVuYWJsZWQuICAKLSAgICogTm90ZSB0aGF0IHZhbGlkaXR5IHRlc3RpbmcgaXMgbm90IGEgc3RyaWN0IGFzIGluIHRoZSBSRkM7IGVzc2VudGlhbGx5LAotICAgKiBvbmx5IHNlcGFyYXRvciBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkLiAgU28sIGZvciBleGFtcGxlLCBub24tTGF0aW4KLSAgICogYWxwaGFiZXQgY2hhcmFjdGVycyBhcHBlYXJpbmcgaW4gdGhlIHNjaGVtZSB3b3VsZCBub3QgYmUgY29uc2lkZXJlZCBhbgotICAgKiBlcnJvci4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gPGNvZGU+dXJpPC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkKLSAgICogdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluawotICAgKiAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzIGFwcHJvcHJpYXRlLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjcmVhdGVVUkkgY3JlYXRlVVJJfSwgd2hpY2ggbm93IGhhcyBleHBsaWNpdAotICAgKiBkZXZpY2Ugc3VwcG9ydCBlbmFibGVkLiBUaGUgdHdvIG1ldGhvZHMgbm93IG9wZXJhdGUgaWRlbnRpY2FsbHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVEZXZpY2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUodXJpKTsKLSAgfQotCi0gIC8vIFVzZXMgYSBjYWNoZSB0byBzcGVlZCB1cCBjcmVhdGlvbiBvZiBhIFVSSSBmcm9tIGEgc3RyaW5nLiAgVGhlIGNhY2hlCi0gIC8vIGlzIGNvbnN1bHRlZCB0byBzZWUgaWYgdGhlIFVSSSwgbGVzcyBhbnkgZnJhZ21lbnQsIGhhcyBhbHJlYWR5IGJlZW4KLSAgLy8gY3JlYXRlZC4gIElmIG5lZWRlZCwgdGhlIGZyYWdtZW50IGlzIHJlLWFwcGVuZGVkIHRvIHRoZSBjYWNoZWQgVVJJLAotICAvLyB3aGljaCBpcyBjb25zaWRlcmFibHkgbW9yZSBlZmZpY2llbnQgdGhhbiBjcmVhdGluZyB0aGUgd2hvbGUgVVJJIGZyb20KLSAgLy8gc2NyYXRjaC4gIElmIHRoZSBVUkkgd2Fzbid0IGZvdW5kIGluIHRoZSBjYWNoZSwgaXQgaXMgY3JlYXRlZCB1c2luZwotICAvLyBwYXJzZUludG9VUkkoKSBhbmQgdGhlbiBjYWNoZWQuICBUaGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIHVzZWQKLSAgLy8gYnkgc3RyaW5nLXBhcnNpbmcgZmFjdG9yeSBtZXRob2RzLCBpbnN0ZWFkIG9mIHBhcnNlSW50b1VSSSgpIGRpcmVjdGx5LgotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2FzIGluY2x1ZGVkIGluIHRoZSBwdWJsaWMgQVBJIGJ5IG1pc3Rha2UuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0ZVVSSX0gaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSVdpdGhDYWNoZShTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IGkgPSB1cmkuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpOwotICAgIFN0cmluZyBiYXNlID0gaSA9PSAtMSA/IHVyaSA6IHVyaS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgU3RyaW5nIGZyYWdtZW50ID0gaSA9PSAtMSA/IG51bGwgOiB1cmkuc3Vic3RyaW5nKGkgKyAxKTsKLQotICAgIFVSSSByZXN1bHQgPSAoVVJJKXVyaUNhY2hlLmdldChiYXNlKTsKLQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwYXJzZUludG9VUkkoYmFzZSk7Ci0gICAgICB1cmlDYWNoZS5wdXQoYmFzZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZXN1bHQuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gU3RyaW5nLXBhcnNpbmcgaW1wbGVtZW50YXRpb24uCi0gIHByaXZhdGUgc3RhdGljIFVSSSBwYXJzZUludG9VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gaGllcmFyY2hpY2FsID0gdHJ1ZTsKLSAgICBTdHJpbmcgc2NoZW1lID0gbnVsbDsKLSAgICBTdHJpbmcgYXV0aG9yaXR5ID0gbnVsbDsKLSAgICBTdHJpbmcgZGV2aWNlID0gbnVsbDsKLSAgICBib29sZWFuIGFic29sdXRlUGF0aCA9IGZhbHNlOwotICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLSAgICBTdHJpbmcgZnJhZ21lbnQgPSBudWxsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGludCBqID0gZmluZCh1cmksIGksIE1BSk9SX1NFUEFSQVRPUl9ISSwgTUFKT1JfU0VQQVJBVE9SX0xPKTsKLQotICAgIGlmIChqIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaikgPT0gU0NIRU1FX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBzY2hlbWUgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGogKyAxOwotICAgIH0KLQotICAgIGJvb2xlYW4gYXJjaGl2ZVNjaGVtZSA9IGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpOwotICAgIGlmIChhcmNoaXZlU2NoZW1lKQotICAgIHsKLSAgICAgIGogPSB1cmkubGFzdEluZGV4T2YoQVJDSElWRV9TRVBBUkFUT1IpOwotICAgICAgaWYgKGogPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFyY2hpdmUgc2VwYXJhdG9yIik7Ci0gICAgICB9Ci0gICAgICBoaWVyYXJjaGljYWwgPSB0cnVlOwotICAgICAgYXV0aG9yaXR5ID0gdXJpLnN1YnN0cmluZyhpLCArK2opOwotICAgICAgaSA9IGo7Ci0gICAgfQotICAgIGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEFVVEhPUklUWV9TRVBBUkFUT1IsIGkpKQotICAgIHsKLSAgICAgIGkgKz0gQVVUSE9SSVRZX1NFUEFSQVRPUi5sZW5ndGgoKTsKLSAgICAgIGogPSBmaW5kKHVyaSwgaSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2NoZW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAoaSA9PSB1cmkubGVuZ3RoKCkgfHwgdXJpLmNoYXJBdChpKSAhPSBTRUdNRU5UX1NFUEFSQVRPUikpCi0gICAgewotICAgICAgaGllcmFyY2hpY2FsID0gZmFsc2U7Ci0gICAgICBqID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SLCBpKTsKLSAgICAgIGlmIChqID09IC0xKSBqID0gdXJpLmxlbmd0aCgpOwotICAgICAgYXV0aG9yaXR5ID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLQotICAgIGlmICghYXJjaGl2ZVNjaGVtZSAmJiBpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgaiA9IGZpbmQodXJpLCBpICsgMSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgIFN0cmluZyBzID0gdXJpLnN1YnN0cmluZyhpICsgMSwgaik7Ci0gICAgICAKLSAgICAgIGlmIChzLmxlbmd0aCgpID4gMCAmJiBzLmNoYXJBdChzLmxlbmd0aCgpIC0gMSkgPT0gREVWSUNFX0lERU5USUZJRVIpCi0gICAgICB7Ci0gICAgICAgIGRldmljZSA9IHM7Ci0gICAgICAgIGkgPSBqOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgaSsrOwotICAgICAgYWJzb2x1dGVQYXRoID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoc2VnbWVudHNSZW1haW4odXJpLCBpKSkKLSAgICB7Ci0gICAgICBMaXN0IHNlZ21lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICB3aGlsZSAoc2VnbWVudHNSZW1haW4odXJpLCBpKSkKLSAgICAgIHsKLSAgICAgICAgaiA9IGZpbmQodXJpLCBpLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotICAgICAgICBzZWdtZW50TGlzdC5hZGQodXJpLnN1YnN0cmluZyhpLCBqKSk7Ci0gICAgICAgIGkgPSBqOwotCi0gICAgICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXNlZ21lbnRzUmVtYWluKHVyaSwgKytpKSkgc2VnbWVudExpc3QuYWRkKFNFR01FTlRfRU1QVFkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudExpc3Quc2l6ZSgpXTsKLSAgICAgIHNlZ21lbnRMaXN0LnRvQXJyYXkoc2VnbWVudHMpOwotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gUVVFUllfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGogPSB1cmkuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IsICsraSk7Ci0gICAgICBpZiAoaiA9PSAtMSkgaiA9IHVyaS5sZW5ndGgoKTsKLSAgICAgIHF1ZXJ5ID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpKSAvLyAmJiB1cmkuY2hhckF0KGkpID09IEZSQUdNRU5UX1NFUEFSQVRPUiAoaW1wbGllZCkKLSAgICB7Ci0gICAgICBmcmFnbWVudCA9IHVyaS5zdWJzdHJpbmcoKytpKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHN0cmluZyBjb250YWlucyBhbnkgbW9yZSBzZWdtZW50cyBhZnRlciB0aGUgb25lIHRoYXQKLSAgLy8gc3RhcnRzIGF0IHBvc2l0aW9uIGkuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VnbWVudHNSZW1haW4oU3RyaW5nIHVyaSwgaW50IGkpCi0gIHsKLSAgICByZXR1cm4gaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpICE9IFFVRVJZX1NFUEFSQVRPUiAmJgotICAgICAgdXJpLmNoYXJBdChpKSAhPSBGUkFHTUVOVF9TRVBBUkFUT1I7Ci0gIH0KLQotICAvLyBGaW5kcyB0aGUgbmV4dCBvY2N1cmFuY2Ugb2Ygb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQgcmVwcmVzZW50ZWQKLSAgLy8gYnkgdGhlIGdpdmVuIGJpdG1hc2sgaW4gdGhlIGdpdmVuIHN0cmluZywgYmVnaW5uaW5nIGF0IGluZGV4IGkuIFRoZSBpbmRleAotICAvLyBvZiB0aGUgZmlyc3QgZm91bmQgY2hhcmFjdGVyLCBvciBzLmxlbmd0aCgpIGlmIHRoZXJlIGlzIG5vbmUsIGlzCi0gIC8vIHJldHVybmVkLiAgQmVmb3JlIHNlYXJjaGluZywgaSBpcyBsaW1pdGVkIHRvIHRoZSByYW5nZSBbMCwgcy5sZW5ndGgoKV0uCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGludCBmaW5kKFN0cmluZyBzLCBpbnQgaSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrKQotICB7Ci0gICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4gbGVuOwotCi0gICAgZm9yIChpID0gaSA+IDAgPyBpIDogMDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtYXRjaGVzKHMuY2hhckF0KGkpLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIHtAbGluayBqYXZhLmlvLkZpbGV9IHBhdGgKLSAgICogc3RyaW5nLiAgVGhlIDxjb2RlPnBhdGhOYW1lPC9jb2RlPiBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcHByb3ByaWF0ZQotICAgKiBmb3JtLCBhcyBmb2xsb3dzOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcnMgYXJlIGNvbnZlcnRlZCB0bwotICAgKiA8Y29kZT4vPGNvZGU+OyB0aGUgcGF0aCBpcyBlbmNvZGVkOyBhbmQgYSAiZmlsZSIgc2NoZW1lIGFuZCwgaWYgbWlzc2luZywKLSAgICogYSBsZWFkaW5nIDxjb2RlPi88L2NvZGU+LCBhcmUgYWRkZWQgdG8gYW4gYWJzb2x1dGUgcGF0aC4gIFRoZSByZXN1bHQKLSAgICogaXMgdGhlbiBwYXJzZWQgdXNpbmcge0BsaW5rICNjcmVhdGVVUkkoU3RyaW5nKSBjcmVhdGVVUkl9LgotICAgKgotICAgKiA8cD5UaGUgZW5jb2Rpbmcgc3RlcCBlc2NhcGVzIGFsbCBzcGFjZXMsIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3RlcnMsIGFuZAotICAgKiBvdGhlciBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gVVJJcywgYXMgd2VsbCBhcyA8Y29kZT4/PC9jb2RlPiwgd2hpY2gKLSAgICogd291bGQgZGVsaW1pdCBhIHBhdGggZnJvbSBhIHF1ZXJ5LiAgRGVjb2RpbmcgaXMgYXV0b21hdGljYWxseSBwZXJmb3JtZWQKLSAgICogYnkge0BsaW5rICN0b0ZpbGVTdHJpbmcgdG9GaWxlU3RyaW5nfSwgYW5kIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSB2YWx1ZXMKLSAgICogcmV0dXJuZWQgYnkgb3RoZXIgYWNjZXNzb3JzIGJ5IHZpYSB0aGUgc3RhdGljIHtAbGluayAjZGVjb2RlKFN0cmluZykKLSAgICogZGVjb2RlfSBtZXRob2QuCi0gICAqCi0gICAqIDxwPkEgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc3BlY2lmaWVkIGRldmljZSAoc29tZXRoaW5nIGxpa2UKLSAgICogPGNvZGU+QzpteWZpbGUudHh0PC9jb2RlPikgY2Fubm90IGJlIGV4cHJlc3NlZCBhcyBhIHZhbGlkIFVSSS4KLSAgICogCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5wYXRoTmFtZTwvY29kZT4KLSAgICogc3BlY2lmaWVzIGEgZGV2aWNlIGFuZCBhIHJlbGF0aXZlIHBhdGgsIG9yIGlmIGFueSBjb21wb25lbnQgb2YgdGhlIHBhdGgKLSAgICogaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rCi0gICAqICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIG9yIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwKLSAgICoge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVGaWxlVVJJKFN0cmluZyBwYXRoTmFtZSkKLSAgewotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhOYW1lKTsKLSAgICBTdHJpbmcgdXJpID0gRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJyA/IHBhdGhOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCBTRUdNRU5UX1NFUEFSQVRPUikgOiBwYXRoTmFtZTsKLSAgICB1cmkgPSBlbmNvZGUodXJpLCBQQVRIX0NIQVJfSEksIFBBVEhfQ0hBUl9MTywgZmFsc2UpOwotICAgIGlmIChmaWxlLmlzQWJzb2x1dGUoKSkKLSAgICB7Ci0gICAgICBVUkkgcmVzdWx0ID0gY3JlYXRlVVJJKCh1cmkuY2hhckF0KDApID09IFNFR01FTlRfU0VQQVJBVE9SID8gImZpbGU6IiA6ICJmaWxlOi8iKSArIHVyaSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSh1cmkpOwotICAgICAgaWYgKHJlc3VsdC5zY2hlbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHJlbGF0aXZlIHBhdGhOYW1lOiAiICsgcGF0aE5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBwbGF0Zm9ybS1yZWxhdGl2ZSBwYXRoIHN0cmluZy4KLSAgICoKLSAgICogPHA+VGhlIDxjb2RlPnBhdGhOYW1lPC9jb2RlPiBtdXN0IGJlIG9mIHRoZSBmb3JtOgotICAgKiA8cHJlPgotICAgKiAgIC9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiA8cD5QbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvcnMgd2lsbCBiZSBjb252ZXJ0ZXJ0ZWQgdG8gc2xhc2hlcy4KLSAgICogSWYgbm90IGluY2x1ZGVkLCB0aGUgbGVhZGluZyBwYXRoIHNlcGFyYXRvciB3aWxsIGJlIGFkZGVkLiAgVGhlCi0gICAqIHJlc3VsdCB3aWxsIGJlIG9mIHRoaXMgZm9ybSwgd2hpY2ggaXMgcGFyc2VkIHVzaW5nIHtAbGluayAjY3JlYXRlVVJJCi0gICAqIGNyZWF0ZVVSSX06Ci0gICAqIDxwcmU+Ci0gICAqICAgcGxhdGZvcm06L3Jlc291cmNlL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIAotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSB0aGUgcGF0aCBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LAotICAgKiB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3IKLSAgICoge0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNyZXNvbHZlCi0gICAqIEBzZWUgI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nLCBib29sZWFuKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aE5hbWUpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShwYXRoTmFtZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgcGxhdGZvcm0tcmVsYXRpdmUgcGF0aCBzdHJpbmcsCi0gICAqIHdpdGggYW4gb3B0aW9uIHRvIGVuY29kZSB0aGUgY3JlYXRlZCBVUkkuCi0gICAqCi0gICAqIDxwPlRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gbXVzdCBiZSBvZiB0aGUgZm9ybToKLSAgICogPHByZT4KLSAgICogICAvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+UGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIHdpbGwgYmUgY29udmVydGVydGVkIHRvIHNsYXNoZXMuCi0gICAqIElmIG5vdCBpbmNsdWRlZCwgdGhlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3Igd2lsbCBiZSBhZGRlZC4gIFRoZQotICAgKiByZXN1bHQgd2lsbCBiZSBvZiB0aGlzIGZvcm0sIHdoaWNoIGlzIHBhcnNlZCB1c2luZyB7QGxpbmsgI2NyZWF0ZVVSSQotICAgKiBjcmVhdGVVUkl9OgotICAgKiA8cHJlPgotICAgKiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiA8cD5UaGlzIHNjaGVtZSBzdXBwb3J0cyByZWxvY2F0YWJsZSBwcm9qZWN0cyBpbiBFY2xpcHNlIGFuZCBpbgotICAgKiBzdGFuZC1hbG9uZSAuCi0gICAqCi0gICAqIDxwPkRlcGVuZGluZyBvbiB0aGUgPGNvZGU+ZW5jb2RlPC9jb2RlPiBhcmd1bWVudCwgdGhlIHBhdGggbWF5IGJlCi0gICAqIGF1dG9tYXRpY2FsbHkgZW5jb2RlZCB0byBlc2NhcGUgYWxsIHNwYWNlcywgPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVycywKLSAgICogYW5kIG90aGVyIGNoYXJhY3RlcnMgZGlzYWxsb3dlZCBpbiBVUklzLCBhcyB3ZWxsIGFzIDxjb2RlPj88L2NvZGU+LAotICAgKiB3aGljaCB3b3VsZCBkZWxpbWl0IGEgcGF0aCBmcm9tIGEgcXVlcnkuICBEZWNvZGluZyBjYW4gYmUgcGVyZm9ybWVkIHdpdGgKLSAgICogdGhlIHN0YXRpYyB7QGxpbmsgI2RlY29kZShTdHJpbmcpIGRlY29kZX0gbWV0aG9kLgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gdGhlIHBhdGggaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0jcmVzb2x2ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aE5hbWUsIGJvb2xlYW4gZW5jb2RlKQotICB7Ci0gICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSBTRUdNRU5UX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCBTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGVuY29kZSkKLSAgICB7Ci0gICAgICBwYXRoTmFtZSA9IGVuY29kZShwYXRoTmFtZSwgUEFUSF9DSEFSX0hJLCBQQVRIX0NIQVJfTE8sIGZhbHNlKTsKLSAgICB9Ci0gICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSgocGF0aE5hbWUuY2hhckF0KDApID09IFNFR01FTlRfU0VQQVJBVE9SID8gInBsYXRmb3JtOi9yZXNvdXJjZSIgOiAicGxhdGZvcm06L3Jlc291cmNlLyIpICsgcGF0aE5hbWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIHVzZSBvZiBzdGF0aWMgZmFjdG9yeSBtZXRob2RzLgotICBwcml2YXRlIFVSSShib29sZWFuIGhpZXJhcmNoaWNhbCwgU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSwgYm9vbGVhbiBhYnNvbHV0ZVBhdGgsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGludCBoYXNoQ29kZSA9IDA7Ci0gICAgLy9ib29sZWFuIGlyaSA9IGZhbHNlOwotCi0gICAgaWYgKGhpZXJhcmNoaWNhbCkKLSAgICB7Ci0gICAgICArK2hhc2hDb2RlOwotICAgIH0KLSAgICBpZiAoYWJzb2x1dGVQYXRoKQotICAgIHsKLSAgICAgIGhhc2hDb2RlICs9IDI7Ci0gICAgfQotICAgIGlmIChzY2hlbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBzY2hlbWUudG9Mb3dlckNhc2UoKS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gYXV0aG9yaXR5Lmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmIChkZXZpY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBkZXZpY2UuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoZGV2aWNlKTsKLSAgICB9Ci0gICAgaWYgKHF1ZXJ5ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gcXVlcnkuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkocXVlcnkpOwotICAgIH0KLSAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBmcmFnbWVudC5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShmcmFnbWVudCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IHNlZ21lbnRzW2ldLmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0KLSAgICB0aGlzLmhhc2hDb2RlID0gaGFzaENvZGU7Ci0gICAgLy90aGlzLmlyaSA9IGlyaTsKLSAgICB0aGlzLmhpZXJhcmNoaWNhbCA9IGhpZXJhcmNoaWNhbDsKLSAgICB0aGlzLnNjaGVtZSA9IHNjaGVtZSA9PSBudWxsID8gbnVsbCA6IHNjaGVtZS5pbnRlcm4oKTsKLSAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICB0aGlzLmRldmljZSA9IGRldmljZTsKLSAgICB0aGlzLmFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLSAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OwotICAgIHRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKLSAgfQotICAKLSAgLy8gVmFsaWRhdGVzIGFsbCBvZiB0aGUgVVJJIGNvbXBvbmVudHMuICBGYWN0b3J5IG1ldGhvZHMgc2hvdWxkIGNhbGwgdGhpcwotICAvLyBiZWZvcmUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yLCB0aG91Z2ggdGhleSBtdXN0IGVuc3VyZSB0aGF0IHRoZQotICAvLyBpbnRlci1jb21wb25lbnQgcmVxdWlyZW1lbnRzIGRlc2NyaWJlZCBpbiB0aGVpciBvd24gSmF2YWRvY3MgYXJlIGFsbAotICAvLyBzYXRpc2ZpZWQsIHRoZW1zZWx2ZXMuICBJZiBhIG5ldyBVUkkgaXMgYmVpbmcgY29uc3RydWN0ZWQgb3V0IG9mCi0gIC8vIGFuIGV4aXN0aW5nIFVSSSwgdGhpcyBuZWVkIG5vdCBiZSBjYWxsZWQuICBJbnN0ZWFkLCBqdXN0IHRoZSBuZXcKLSAgLy8gY29tcG9uZW50cyBtYXkgYmUgdmFsaWRhdGVkIGluZGl2aWR1YWxseS4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVVSSShib29sZWFuIGhpZXJhcmNoaWNhbCwgU3RyaW5nIHNjaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIFN0cmluZyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFic29sdXRlUGF0aCwgU3RyaW5nW10gc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRTY2hlbWUoc2NoZW1lKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHNjaGVtZTogIiArIHNjaGVtZSk7Ci0gICAgfQotICAgIGlmICghaGllcmFyY2hpY2FsICYmICF2YWxpZE9wYXF1ZVBhcnQoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG9wYXF1ZVBhcnQ6ICIgKyBhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoaGllcmFyY2hpY2FsICYmICFpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSAmJiAhdmFsaWRBdXRob3JpdHkoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGF1dGhvcml0eTogIiArIGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmIChoaWVyYXJjaGljYWwgJiYgaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgIXZhbGlkQXJjaGl2ZUF1dGhvcml0eShhdXRob3JpdHkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYXV0aG9yaXR5OiAiICsgYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZERldmljZShkZXZpY2UpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnRzKHNlZ21lbnRzKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IHNlZ21lbnRzID09IG51bGwgPyAiaW52YWxpZCBzZWdtZW50czogIiArIHNlZ21lbnRzIDoKLSAgICAgICAgImludmFsaWQgc2VnbWVudDogIiArIGZpcnN0SW52YWxpZFNlZ21lbnQoc2VnbWVudHMpOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzKTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZFF1ZXJ5KHF1ZXJ5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHF1ZXJ5OiAiICsgcXVlcnkpOwotICAgIH0KLSAgICBpZiAoIXZhbGlkRnJhZ21lbnQoZnJhZ21lbnQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZnJhZ21lbnQ6ICIgKyBmcmFnbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWx0ZXJuYXRlLCBzdHJpY3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIG1ldGhvZHMKLSAgLy8gYXJlIHByb3ZpZGVkLCBjb21tZW50ZWQgb3V0LCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLgotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBzY2hlbWUgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHNjaGVtZSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlCi0gICAqIGZvbGxvd2luZzogPGNvZGU+OiAvID8gIzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNjaGVtZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhY29udGFpbnModmFsdWUsIE1BSk9SX1NFUEFSQVRPUl9ISSwgTUFKT1JfU0VQQVJBVE9SX0xPKTsgIAotCi0gIC8vIDxwPkEgdmFsaWQgc2NoZW1lIG1heSBiZSBudWxsLCBvciBjb25zaXN0IG9mIGEgc2luZ2xlIGxldHRlciBmb2xsb3dlZAotICAvLyBieSBhbnkgbnVtYmVyIG9mIGxldHRlcnMsIG51bWJlcnMsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6Ci0gIC8vIDxjb2RlPisgLSAuPC9jb2RlPgotCi0gICAgLy9pZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgLy9yZXR1cm4gdmFsdWUubGVuZ3RoKCkgIT0gMCAmJgotICAgIC8vICBtYXRjaGVzKHZhbHVlLmNoYXJBdCgwKSwgQUxQSEFfSEksIEFMUEhBX0xPKSAmJgotICAgIC8vICB2YWxpZGF0ZSh2YWx1ZSwgU0NIRU1FX0NIQVJfSEksIFNDSEVNRV9DSEFSX0xPLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIG9wYXF1ZSBwYXJ0IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBvcGFxdWUgcGFydCBtdXN0IGJlIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBub3QgY29udGFpbiB0aGUKLSAgICogPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVyLiAgSW4gYWRkaXRpb24sIGl0cyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBub3QgYmUKLSAgICogPGNvZGU+LzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE9wYXF1ZVBhcnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpID09IC0xICYmCi0gICAgdmFsdWUubGVuZ3RoKCkgPiAwICYmIHZhbHVlLmNoYXJBdCgwKSAhPSBTRUdNRU5UX1NFUEFSQVRPUjsKLQotICAvLyA8cD5BIHZhbGlkIG9wYXF1ZSBwYXJ0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eS4gSXQgbWF5IGNvbnRhaW4KLSAgLy8gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMsIGJ1dCBpdHMgZmlyc3QgY2hhcmFjdGVyIG1heSBub3QgYmUKLSAgLy8gPGNvZGU+LzwvY29kZT4gCi0KLSAgICAvL3JldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpICE9IDAgJiYKLSAgICAvLyAgdmFsdWUuY2hhckF0KDApICE9IFNFR01FTlRfU0VQQVJBVE9SICYmCi0gICAgLy8gIHZhbGlkYXRlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIGF1dGhvcml0eSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IKLSAgICogdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/ICM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRBdXRob3JpdHkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIEEgdmFsaWQgYXV0aG9yaXR5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMgZXhjZXB0Ci0gIC8vIGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID88L2NvZGU+Ci0KLSAgICAvL3JldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbGlkYXRlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiBhbiA8YQotICAgKiBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+OyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5UbyBiZSB2YWxpZCwgdGhlIGF1dGhvcml0eSwgaXRzZWxmLCBtdXN0IGJlIGEgVVJJIHdpdGggbm8gZnJhZ21lbnQsCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBjaGFyYWN0ZXIgPGNvZGU+ITwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRBcmNoaXZlQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCAmJgotICAgICAgICB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoKCkgLSAxKSA9PSBBUkNISVZFX0lERU5USUZJRVIpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSSSBhcmNoaXZlVVJJID0gY3JlYXRlVVJJKHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgcmV0dXJuICFhcmNoaXZlVVJJLmhhc0ZyYWdtZW50KCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGRldmljZSBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgZGV2aWNlIG1heSBiZSBudWxsIG9yIG5vbi1lbXB0eSwgY29udGFpbmluZyBhbnkgY2hhcmFjdGVycwotICAgKiBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPyAjPC9jb2RlPiAgSW4gYWRkaXRpb24sIGl0cyBsYXN0Ci0gICAqIGNoYXJhY3RlciBtdXN0IGJlIDxjb2RlPjo8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWREZXZpY2UoU3RyaW5nIHZhbHVlKQotICB7ICAgIAotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgcmV0dXJuIGxlbiA+IDAgJiYgdmFsdWUuY2hhckF0KGxlbiAtIDEpID09IERFVklDRV9JREVOVElGSUVSICYmCi0gICAgICAhY29udGFpbnModmFsdWUsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0KLSAgLy8gPHA+QSB2YWxpZCBkZXZpY2UgbWF5IGJlIG51bGwgb3Igbm9uLWVtcHR5LCBjb250YWluaW5nIGFueSBhbGxvd2VkIFVSSQotICAvLyBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPiAgSW4gYWRkaXRpb24sIGl0cwotICAvLyBsYXN0IGNoYXJhY3RlciBtdXN0IGJlIDxjb2RlPjo8L2NvZGU+Ci0KLSAgICAvL2lmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAvL2ludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAvL3JldHVybiBsZW4gPiAwICYmIHZhbGlkYXRlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgdHJ1ZSwgdHJ1ZSkgJiYKLSAgICAvLyAgdmFsdWUuY2hhckF0KGxlbiAtIDEpID09IERFVklDRV9JREVOVElGSUVSOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogYSB2YWxpZCBwYXRoIHNlZ21lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vdCBjb250YWluIGFueSBvZiB0aGUKLSAgICogZm9sbG93aW5nIGNoYXJhY3RlcnM6IDxjb2RlPi8gPyAjPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkU2VnbWVudChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhY29udGFpbnModmFsdWUsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0KLSAgLy8gPHA+QSB2YWxpZCBwYXRoIHNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBhbmQgbWF5IGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJCi0gIC8vIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID88L2NvZGU+IAotCi0gICAgLy9yZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogYSB2YWxpZCBwYXRoIHNlZ21lbnQgYXJyYXkgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IGFycmF5IG11c3QgYmUgbm9uLW51bGwgYW5kIGNvbnRhaW4gb25seSBwYXRoCi0gICAqIHNlZ2VtZW50cyB0aGF0IGFyZSB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNlZ21lbnQgdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNlZ21lbnRzKFN0cmluZ1tdIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCF2YWxpZFNlZ21lbnQodmFsdWVbaV0pKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gUmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWNpZWQgdmFsdWUgaXMgbnVsbCBvciB3b3VsZCBiZSBhIHZhbGlkIHBhdGgKLSAgLy8gc2VnbWVudCBhcnJheSBvZiBhIFVSSTsgb3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludmFsaWQKLSAgLy8gc2VnbWVudC4gCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaXJzdEludmFsaWRTZWdtZW50KFN0cmluZ1tdIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXZhbGlkU2VnbWVudCh2YWx1ZVtpXSkpIHJldHVybiB2YWx1ZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgcXVlcnkgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHF1ZXJ5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgZXhjZXB0IGZvcgotICAgKiA8Y29kZT4jPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkUXVlcnkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpID09IC0xOwotCi0gIC8vIDxwPkEgdmFsaWQgcXVlcnkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycy4KLQotICAgIC8vcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsaWRhdGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIHRydWUsIHRydWUpOwotfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBmcmFnbWVudCBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgZnJhZ21lbnQgaXMgdGFrZW4gdG8gYmUgdW5jb25kaXRpb25hbGx5IHZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRnJhZ21lbnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gPHA+QSB2YWxpZCBmcmFnbWVudCBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzLgotCi0gICAgLy9yZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWxpZGF0ZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvLyBTZWFyY2hlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBmb3IgYW55IGNoYXJhY3RlcnMgaW4gdGhlIHNldCByZXByZXNudGVkCi0gIC8vIGJ5IHRoZSAxMjgtYml0IGJpdG1hc2suICBSZXR1cm5zIHRydWUgaWYgYW55IG9jY3VyLCBvciBmYWxzZSBvdGhlcndpc2UuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHMsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG1hdGNoZXMocy5jaGFyQXQoaSksIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3RzIHRoZSBub24tbnVsbCBzdHJpbmcgdmFsdWUgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIG9ubHkgQVNDSUkKLSAgLy8gY2hhcmFjdGVycyBpbiB0aGUgc2V0IHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQgMTI4LWJpdCBiaXRtYXNrLAotICAvLyBhcyB3ZWxsIGFzLCBvcHRpb25hbGx5LCBub24tQVNDSUkgY2hhcmFjdGVycyAweEEwIGFuZCBhYm92ZSwgYW5kLAotICAvLyBhbHNvIG9wdGlvbmFsbHksIGVzY2FwZSBzZXF1ZW5jZXMgb2YgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4KLSAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgdGhlIG5ldywgc3RyaWN0IFVSSSB2YWxpZGF0aW9uIHRoYXQgaXMgbm90Ci0gIC8vIG5vdCBjdXJyZW50bHkgaW4gcGxhY2UuCi0vKgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlKFN0cmluZyB2YWx1ZSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOb25BU0NJSSwgYm9vbGVhbiBhbGxvd0VzY2FwZWQpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7IAotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAobWF0Y2hlcyhjLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIGNvbnRpbnVlOwotICAgICAgaWYgKGFsbG93Tm9uQVNDSUkgJiYgYyA+PSAxNjApIGNvbnRpbnVlOwotICAgICAgaWYgKGFsbG93RXNjYXBlZCAmJiBpc0VzY2FwZWQodmFsdWUsIGkpKQotICAgICAgewotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotKi8KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcmVsYXRpdmUgVVJJLCBvcgotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYW4gYWJzb2x1dGUgVVJJLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lID09IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGEgYSBoaWVyYXJjaGljYWwgVVJJLCBvcgotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgb2YgdGhlIGdlbmVyaWMgZm9ybS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiBoaWVyYXJjaGljYWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2ljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5Ci0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNBdXRob3JpdHkoKQotICB7Ci0gICAgcmV0dXJuIGhpZXJhcmNoaWNhbCAmJiBhdXRob3JpdHkgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBub24taGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIG9wYXF1ZSBwYXJ0IGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc09wYXF1ZVBhcnQoKQotICB7Ci0gICAgLy8gbm90ZTogaGllcmFyY2hpY2FsIC0+IGF1dGhvcml0eSAhPSBudWxsCi0gICAgcmV0dXJuICFoaWVyYXJjaGljYWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgZGV2aWNlCi0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0RldmljZSgpCi0gIHsKLSAgICAvLyBub3RlOiBkZXZpY2UgIT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gZGV2aWNlICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGg7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IChhYnNvbHV0ZVBhdGggfHwgYXV0aG9yaXR5ID09IG51bGwpIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhYnNvbHV0ZVBhdGggfHwgKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4KLSAgICogYWJzb2x1dGUgcGF0aCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vbi1oaWVyYXJjaGljYWwsIGhhcyBubwotICAgKiBwYXRoLCBvciBoYXMgYSByZWxhdGl2ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQWJzb2x1dGVQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IGFic29sdXRlUGF0aCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gYWJzb2x1dGVQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHJlbGF0aXZlCi0gICAqIHBhdGgsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub24taGllcmFyY2hpY2FsLCBoYXMgbm8gcGF0aCwgb3IKLSAgICogaGFzIGFuIGFic29sdXRlIHBhdGguCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWxhdGl2ZVBhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGVtcHR5Ci0gICAqIHJlbGF0aXZlIHBhdGg7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuICAKLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IDxjb2RlPiFoYXNFbXB0eSgpPC9jb2RlPiBkb2VzIDxlbT5ub3Q8L2VtPiBpbXBseSB0aGF0IHRoaXMKLSAgICogVVJJIGhhcyBhbnkgcGF0aCBzZWdtZW50czsgaG93ZXZlciwgPGNvZGU+aGFzUmVsYXRpdmVQYXRoICYmCi0gICAqICFoYXNFbXB0eVBhdGgoKTwvY29kZT4gZG9lcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0VtcHR5UGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCAmJgotICAgICAgc2VnbWVudHMubGVuZ3RoID09IDA7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcXVlcnkKLSAgICogY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUXVlcnkoKQotICB7Ci0gICAgLy8gbm90ZTogcXVlcnkgIT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gcXVlcnkgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgVVJJIGhhcyBhIGZyYWdtZW50IGNvbXBvbmVudDsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiBmcmFnbWVudCAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlOyB0aGF0Ci0gICAqIGlzLCBpZiBpdCBpcyBhIHJlbGF0aXZlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBubyBhdXRob3JpdHksIGRldmljZSBvcgotICAgKiBxdWVyeSBjb21wb25lbnRzLCBhbmQgbm8gcGF0aCBzZWdtZW50czsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkCi0gICAqIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoICYmCi0gICAgICBzZWdtZW50cy5sZW5ndGggPT0gMCAmJiBxdWVyeSA9PSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHtAbGluawotICAgKiAjaXNDdXJyZW50RG9jdW1lbnRSZWZlcmVuY2UoKSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZX0gd2l0aCBubwotICAgKiBmcmFnbWVudCBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIEBzZWUgI2lzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGggJiYKLSAgICAgIHNlZ21lbnRzLmxlbmd0aCA9PSAwICYmIHF1ZXJ5ID09IG51bGwgJiYgZnJhZ21lbnQgPT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHRoYXQgbWF5IHJlZmVyCi0gICAqIGRpcmVjdGx5IHRvIGEgbG9jYWxseSBhY2Nlc3NpYmxlIGZpbGUuICBUaGlzIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlCi0gICAqIGNhc2UgZm9yIGEgZmlsZS1zY2hlbWUgYWJzb2x1dGUgVVJJLCBvciBmb3IgYSByZWxhdGl2ZSBVUkkgd2l0aCBubyBxdWVyeTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSAmJgotICAgICAgKChpc1JlbGF0aXZlKCkgJiYgIWhhc1F1ZXJ5KCkpIHx8IFNDSEVNRV9GSUxFLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBhcmNoaXZlIFVSSS4gIElmIHNvLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKLSAgLy8gaXQgaXMgYWxzbyBoaWVyYXJjaGljYWwsIHdpdGggYW4gYXV0aG9yaXR5IChjb25zaXN0aW5nIG9mIGFuIGFic29sdXRlCi0gIC8vIFVSSSBmb2xsb3dlZCBieSAiISIpLCBubyBkZXZpY2UsIGFuZCBhbiBhYnNvbHV0ZSBwYXRoLgotICBwcml2YXRlIGJvb2xlYW4gaXNBcmNoaXZlKCkKLSAgewotICAgIHJldHVybiBpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBzY2hlbWUgb2YgYW4gPGEKLSAgICogaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPjsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FyY2hpdmVTY2hlbWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYXJjaGl2ZVNjaGVtZXMuY29udGFpbnModmFsdWUudG9Mb3dlckNhc2UoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUuCi0gICAqLwotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgewotICAgIHJldHVybiBoYXNoQ29kZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YKLSAgICogPGNvZGU+VVJJPC9jb2RlPiBlcXVhbCB0byB0aGlzIG9uZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+RXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBzdHJpY3RseSBieSBjb21wYXJpbmcgY29tcG9uZW50cywgbm90IGJ5Ci0gICAqIGF0dGVtcHRpbmcgdG8gaW50ZXJwcmV0IHdoYXQgcmVzb3VyY2UgaXMgYmVpbmcgaWRlbnRpZmllZC4gIFRoZQotICAgKiBjb21wYXJpc29uIG9mIHNjaGVtZXMgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICB7Ci0gICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBVUkkpKSByZXR1cm4gZmFsc2U7Ci0gICAgVVJJIHVyaSA9IChVUkkpIG9iajsKLQotICAgIHJldHVybiBoYXNoQ29kZSA9PSB1cmkuaGFzaENvZGUoKSAmJgotICAgICAgaGllcmFyY2hpY2FsID09IHVyaS5pc0hpZXJhcmNoaWNhbCgpICYmCi0gICAgICBhYnNvbHV0ZVBhdGggPT0gdXJpLmhhc0Fic29sdXRlUGF0aCgpICYmCi0gICAgICBlcXVhbHMoc2NoZW1lLCB1cmkuc2NoZW1lKCksIHRydWUpICYmCi0gICAgICBlcXVhbHMoYXV0aG9yaXR5LCBoaWVyYXJjaGljYWwgPyB1cmkuYXV0aG9yaXR5KCkgOiB1cmkub3BhcXVlUGFydCgpKSAmJgotICAgICAgZXF1YWxzKGRldmljZSwgdXJpLmRldmljZSgpKSAmJgotICAgICAgZXF1YWxzKHF1ZXJ5LCB1cmkucXVlcnkoKSkgJiYgCi0gICAgICBlcXVhbHMoZnJhZ21lbnQsIHVyaS5mcmFnbWVudCgpKSAmJgotICAgICAgc2VnbWVudHNFcXVhbCh1cmkpOwotICB9Ci0KLSAgLy8gVGVzdHMgd2hldGhlciB0aGlzIFVSSSdzIHBhdGggc2VnbWVudCBhcnJheSBpcyBlcXVhbCB0byB0aGF0IG9mIHRoZQotICAvLyBnaXZlbiB1cmkuCi0gIHByaXZhdGUgYm9vbGVhbiBzZWdtZW50c0VxdWFsKFVSSSB1cmkpCi0gIHsKLSAgICBpZiAoc2VnbWVudHMubGVuZ3RoICE9IHVyaS5zZWdtZW50Q291bnQoKSkgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXNlZ21lbnRzW2ldLmVxdWFscyh1cmkuc2VnbWVudChpKSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRvbGVyYXRpbmcgbnVsbHM7IG51bGwgaXMgY29uc2lkZXJlZAotICAvLyB0byBiZSBhIHZhbGlkIHZhbHVlIHRoYXQgaXMgb25seSBlcXVhbCB0byBpdHNlbGYuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICB7Ci0gICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKLSAgfQotCi0gIC8vIFRlc3RzIHR3byBzdHJpbmdzIGZvciBlcXVhbGl0eSwgdG9sZXJhdGluZyBudWxscyBhbmQgb3B0aW9uYWxseQotICAvLyBpZ25vcmluZyBjYXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgczEsIFN0cmluZyBzMiwgYm9vbGVhbiBpZ25vcmVDYXNlKQotICB7Ci0gICAgcmV0dXJuIHMxID09IG51bGwgPyBzMiA9PSBudWxsIDoKLSAgICAgIGlnbm9yZUNhc2UgPyBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKSA6IHMxLmVxdWFscyhzMik7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBVUkksIHJldHVybnMgdGhlIHNjaGVtZSBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWU7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIG5vbi1oaWVyYXJjaGljYWwgVVJJLCByZXR1cm5zIHRoZSBvcGFxdWUgcGFydCBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgb3BhcXVlUGFydCgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSA/IG51bGwgOiBhdXRob3JpdHk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGF1dGhvcml0eSgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSA/IGF1dGhvcml0eSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogdXNlciBpbmZvIHBvcnRpb24sIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdXNlckluZm8oKQotICB7IAotICAgIGlmICghaGFzQXV0aG9yaXR5KCkpIHJldHVybiBudWxsOwotICAgCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihVU0VSX0lORk9fU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogYXV0aG9yaXR5LnN1YnN0cmluZygwLCBpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eSBjb21wb25lbnQgdGhhdCBoYXMgYQotICAgKiBob3N0IHBvcnRpb24sIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaG9zdCgpCi0gIHsKLSAgICBpZiAoIWhhc0F1dGhvcml0eSgpKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBpbnQgaSA9IGF1dGhvcml0eS5pbmRleE9mKFVTRVJfSU5GT19TRVBBUkFUT1IpOwotICAgIGludCBqID0gYXV0aG9yaXR5LmluZGV4T2YoUE9SVF9TRVBBUkFUT1IpOwotICAgIHJldHVybiBqIDwgMCA/IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEpIDogYXV0aG9yaXR5LnN1YnN0cmluZyhpICsgMSwgaik7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogcG9ydCBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHBvcnQoKQotICB7Ci0gICAgaWYgKCFoYXNBdXRob3JpdHkoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBpbnQgaSA9IGF1dGhvcml0eS5pbmRleE9mKFBPUlRfU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogYXV0aG9yaXR5LnN1YnN0cmluZyhpICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIGRldmljZSBjb21wb25lbnQsIHJldHVybnMgaXQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZGV2aWNlKCkKLSAgewotICAgIHJldHVybiBkZXZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHBhdGgsIHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZwotICAgKiB0aGUgc2VnbWVudHMgb2YgdGhlIHBhdGg7IGFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4gIFRoZSBsZWFkaW5nCi0gICAqIHNlcGFyYXRvciBpbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIG5vdCByZXByZXNlbnRlZCBpbiB0aGlzIGFycmF5LCBidXQgYQotICAgKiB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHktc3RyaW5nIHNlZ21lbnQgYXMgdGhlCi0gICAqIGZpbmFsIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gc2VnbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlzZWdtZW50cy5jbG9uZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBzZWdtZW50cyBhcyB0aGUgYXJyYXkKLSAgICogcmV0dXJuZWQgYnkge0BsaW5rICNzZWdtZW50cyBzZWdtZW50c30uCi0gICAqLwotICBwdWJsaWMgTGlzdCBzZWdtZW50c0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChzZWdtZW50cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VnbWVudCBhcnJheSB0aGF0IHdvdWxkIGJlCi0gICAqIHJldHVybmVkIGJ5IHtAbGluayAjc2VnbWVudHMgc2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIGludCBzZWdtZW50Q291bnQoKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBmYXN0LCBpbmRleGVkIGFjY2VzcyB0byBpbmRpdmlkdWFsIHNlZ21lbnRzIGluIHRoZSBwYXRoCi0gICAqIHNlZ21lbnQgYXJyYXkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+aSA8IDA8L2NvZGU+IG9yCi0gICAqIDxjb2RlPmkgPj0gc2VnbWVudENvdW50KCk8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzZWdtZW50KGludCBpKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzW2ldOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgc2VnbWVudCBhcnJheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGxhc3RTZWdtZW50KCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gc2VnbWVudHNbbGVuIC0gMV07Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHBhdGgsIHJldHVybnMgYSBzdHJpbmcKLSAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGg7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4gIFRoZSBwYXRoCi0gICAqIGNvbnNpc3RzIG9mIGEgbGVhZGluZyBzZWdtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIgKGEgc2xhc2gpLCBpZiB0aGUKLSAgICogcGF0aCBpcyBhYnNvbHV0ZSwgZm9sbG93ZWQgYnkgdGhlIHNsYXNoLXNlcGFyYXRlZCBwYXRoIHNlZ21lbnRzLiAgSWYKLSAgICogdGhpcyBVUkkgaGFzIGEgc2VwYXJhdGUgPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZGV2aWNlCi0gICAqIGNvbXBvbmVudDwvYT4sIGl0IGlzIDxlbT5ub3Q8L2VtPiBpbmNsdWRlZCBpbiB0aGUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcGF0aCgpCi0gIHsKLSAgICBpZiAoIWhhc1BhdGgoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGEgc3RyaW5nCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGF1dGhvcml0eSBhbmQgdGhlIAotICAgKiA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5kZXZpY2UgY29tcG9uZW50PC9hPjsgCi0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4gIAotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBubyBhdXRob3JpdHksIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgYW4gYXV0aG9yaXR5LCBpdCBpczoKLSAgICogPHByZT4KLSAgICogICAvL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKgotICAgKiA8cD5Gb3IgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPiwgaXQncyBqdXN0OgotICAgKiA8cHJlPgotICAgKiAgIGF1dGhvcml0eS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGRldmljZVBhdGgoKQotICB7Ci0gICAgaWYgKCFoYXNQYXRoKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzQXJjaGl2ZSgpKSByZXN1bHQuYXBwZW5kKEFVVEhPUklUWV9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotCi0gICAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQsIHJldHVybnMgaXQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIHF1ZXJ5OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBmcm9tIHRoaXMgVVJJIGFuZCB0aGUgZ2l2ZW4gcXVlcnkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5xdWVyeTwvY29kZT4gaXMgbm90IGEgdmFsaWQgcXVlcnkgKHBvcnRpb24pIGFjY29yZGluZwotICAgKiB0byB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFF1ZXJ5KFN0cmluZyBxdWVyeSkKLSAgewotICAgIGlmICghdmFsaWRRdWVyeShxdWVyeSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgcXVlcnkgcG9ydGlvbjogIiArIHF1ZXJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBub24tbnVsbCB7QGxpbmsgI3F1ZXJ5IHF1ZXJ5fSwgcmV0dXJucyB0aGUgVVJJCi0gICAqIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1RdWVyeSgpCi0gIHsKLSAgICBpZiAocXVlcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgbnVsbCwgZnJhZ21lbnQpOyAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgZnJhZ21lbnQgY29tcG9uZW50LCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGZyb20gdGhpcyBVUkkgYW5kIHRoZSBnaXZlbiBmcmFnbWVudC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAqIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBmcmFnbWVudCAocG9ydGlvbikgYWNjb3JkaW5nCi0gICAqIHRvIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKCF2YWxpZEZyYWdtZW50KGZyYWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiaW52YWxpZCBmcmFnbWVudCBwb3J0aW9uOiAiICsgZnJhZ21lbnQpOwotICAgIH0KLSAgICBVUkkgcmVzdWx0ID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotCi0gICAgaWYgKCFoYXNGcmFnbWVudCgpKQotICAgIHsKLSAgICAgIHJlc3VsdC5jYWNoZWRUcmltRnJhZ21lbnQgPSB0aGlzOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIG5vbi1udWxsIHtAbGluayAjZnJhZ21lbnQgZnJhZ21lbnR9LCByZXR1cm5zIHRoZSBVUkkKLSAgICogZm9ybWVkIGJ5IHJlbW92aW5nIGl0OyB0aGlzIFVSSSB1bmNoYW5nZWQsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbUZyYWdtZW50KCkKLSAgewotICAgIGlmIChmcmFnbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBlbHNlIGlmIChjYWNoZWRUcmltRnJhZ21lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjYWNoZWRUcmltRnJhZ21lbnQgPSBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIG51bGwpOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FjaGVkVHJpbUZyYWdtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoaXMgVVJJIHJlZmVyZW5jZSBhZ2FpbnN0IGEgPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUKLSAgICogaGllcmFyY2hpY2FsIFVSSSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgYWJzb2x1dGUgVVJJLiAgSWYgYWxyZWFkeQotICAgKiBhYnNvbHV0ZSwgdGhlIFVSSSBpdHNlbGYgaXMgcmV0dXJuZWQuICBVUkkgcmVzb2x1dGlvbiBpcyBkZXNjcmliZWQgaW4KLSAgICogZGV0YWlsIGluIHNlY3Rpb24gNS4yIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMKLSAgICogMjM5NjwvYT4sICJSZXNvbHZpbmcgUmVsYXRpdmUgUmVmZXJlbmNlcyB0byBBYnNvbHV0ZSBGb3JtLiIKLSAgICoKLSAgICogPHA+RHVyaW5nIHJlc29sdXRpb24sIGVtcHR5IHNlZ21lbnRzLCBzZWxmIHJlZmVyZW5jZXMgKCIuIiksIGFuZCBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyAoIi4uIikgYXJlIGludGVycHJldGVkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgICogcGF0aC4gIFN0ZXAgNihnKSBnaXZlcyBhIGNob2ljZSBvZiBob3cgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHBhcmVudAotICAgKiByZWZlcmVuY2VzIHBvaW50IHRvIGEgcGF0aCBhYm92ZSB0aGUgcm9vdDogdGhlIG9mZmVuZGluZyBzZWdtZW50cyBjYW4KLSAgICogYmUgcHJlc2VydmVkIG9yIGRpc2NhcmRlZC4gIFRoaXMgbWV0aG9kIHByZXNlcnZlcyB0aGVtLiAgVG8gaGF2ZSB0aGVtCi0gICAqIGRpc2NhcmRlZCwgcGxlYXNlIHVzZSB0aGUgdHdvLXBhcmFtZXRlciBmb3JtIG9mIHtAbGluawotICAgKiAjcmVzb2x2ZShVUkksIGJvb2xlYW4pIHJlc29sdmV9LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSkKLSAgewotICAgIHJldHVybiByZXNvbHZlKGJhc2UsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoaXMgVVJJIHJlZmVyZW5jZSBhZ2FpbnN0IGEgPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUKLSAgICogaGllcmFyY2hpY2FsIFVSSSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgYWJzb2x1dGUgVVJJLiAgSWYgYWxyZWFkeQotICAgKiBhYnNvbHV0ZSwgdGhlIFVSSSBpdHNlbGYgaXMgcmV0dXJuZWQuICBVUkkgcmVzb2x1dGlvbiBpcyBkZXNjcmliZWQgaW4KLSAgICogZGV0YWlsIGluIHNlY3Rpb24gNS4yIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMKLSAgICogMjM5NjwvYT4sICJSZXNvbHZpbmcgUmVsYXRpdmUgUmVmZXJlbmNlcyB0byBBYnNvbHV0ZSBGb3JtLiIKLSAgICoKLSAgICogPHA+RHVyaW5nIHJlc3VsdGlvbiwgZW1wdHkgc2VnbWVudHMsIHNlbGYgcmVmZXJlbmNlcyAoIi4iKSwgYW5kIHBhcmVudAotICAgKiByZWZlcmVuY2VzICgiLi4iKSBhcmUgaW50ZXJwcmV0ZWQsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQotICAgKiBwYXRoLiAgU3RlcCA2KGcpIGdpdmVzIGEgY2hvaWNlIG9mIGhvdyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgcG9pbnQgdG8gYSBwYXRoIGFib3ZlIHRoZSByb290OiB0aGUgb2ZmZW5kaW5nIHNlZ21lbnRzIGNhbgotICAgKiBiZSBwcmVzZXJ2ZWQgb3IgZGlzY2FyZGVkLiAgVGhpcyBtZXRob2QgY2FuIGRvIGVpdGhlci4KLSAgICoKLSAgICogQHBhcmFtIHByZXNlcnZlUm9vdFBhcmVudHMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2VnbWVudHMgcmVmZXJpbmcgdG8gdGhlCi0gICAqIHBhcmVudCBvZiB0aGUgcm9vdCBwYXRoIGFyZSB0byBiZSBwcmVzZXJ2ZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5Ci0gICAqIGFyZSB0byBiZSBkaXNjYXJkZWQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoIWJhc2UuaXNIaWVyYXJjaGljYWwoKSB8fCBiYXNlLmlzUmVsYXRpdmUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAicmVzb2x2ZSBhZ2FpbnN0IG5vbi1oaWVyYXJjaGljYWwgb3IgcmVsYXRpdmUgYmFzZSIpOwotICAgIH0KLQotICAgIC8vIGFuIGFic29sdXRlIFVSSSBuZWVkcyBubyByZXNvbHZpbmcKLSAgICBpZiAoIWlzUmVsYXRpdmUoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBub3RlOiBpc1JlbGF0aXZlKCkgLT4gaGllcmFyY2hpY2FsCi0KLSAgICBTdHJpbmcgbmV3QXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2U7Ci0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBzZWdtZW50czsKLSAgICBTdHJpbmcgbmV3UXVlcnkgPSBxdWVyeTsKLSAgICAvLyBub3RlOiBpdCdzIG9rYXkgZm9yIHR3byBVUklzIHRvIHNoYXJlIGEgc2VnbWVudHMgYXJyYXksIHNpbmNlCi0gICAgLy8gbmVpdGhlciB3aWxsIGV2ZXIgbW9kaWZ5IGl0Ci0gICAgCi0gICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIG5vIGF1dGhvcml0eTogdXNlIGJhc2UncwotICAgICAgbmV3QXV0aG9yaXR5ID0gYmFzZS5hdXRob3JpdHkoKTsKLQotICAgICAgaWYgKGRldmljZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBubyBkZXZpY2U6IHVzZSBiYXNlJ3MKLSAgICAgICAgbmV3RGV2aWNlID0gYmFzZS5kZXZpY2UoKTsKLQotICAgICAgICBpZiAoaGFzRW1wdHlQYXRoKCkgJiYgcXVlcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlOiB1c2UgYmFzZSBwYXRoIGFuZCBxdWVyeQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGJhc2UuaGFzQWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBiYXNlLnNlZ21lbnRzKCk7Ci0gICAgICAgICAgbmV3UXVlcnkgPSBiYXNlLnF1ZXJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyByZWxhdGl2ZSBwYXRoOiBtZXJnZSB3aXRoIGJhc2UgYW5kIGtlZXAgcXVlcnkgKG5vdGU6IGlmIHRoZQotICAgICAgICAgIC8vIGJhc2UgaGFzIG5vIHBhdGggYW5kIHRoaXMgYSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aCwgdGhlcmUgaXMKLSAgICAgICAgICAvLyBhbiBpbXBsaWVkIHJvb3QgaW4gdGhlIHJlc3VsdGluZyBwYXRoKSAKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBiYXNlLmhhc0Fic29sdXRlUGF0aCgpIHx8ICFoYXNFbXB0eVBhdGgoKTsKLSAgICAgICAgICBuZXdTZWdtZW50cyA9IG5ld0Fic29sdXRlUGF0aCA/IG1lcmdlUGF0aChiYXNlLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICAgICAgICAgICAgOiBOT19TRUdNRU5UUzsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGFic29sdXRlIHBhdGg6IGtlZXAgaXQgYW5kIHF1ZXJ5Ci0gICAgICB9Ci0gICAgICAvLyBlbHNlIGtlZXAgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICB9Ci0gICAgLy8gZWxzZSBrZWVwIGF1dGhvcml0eSwgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICAKLSAgICAvLyBhbHdheXMga2VlcCBmcmFnbWVudCwgZXZlbiBpZiBudWxsLCBhbmQgdXNlIHNjaGVtZSBmcm9tIGJhc2U7Ci0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIGJhc2Uuc2NoZW1lKCksIG5ld0F1dGhvcml0eSwgbmV3RGV2aWNlLAotICAgICAgICAgICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCwgbmV3U2VnbWVudHMsIG5ld1F1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBNZXJnZXMgdGhpcyBVUkkncyByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGJhc2Ugbm9uLXJlbGF0aXZlIHBhdGguICBJZgotICAvLyBiYXNlIGhhcyBubyBwYXRoLCB0cmVhdCBpdCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCB1bmxlc3MgdGhpcyBoYXMKLSAgLy8gbm8gcGF0aCBlaXRoZXIuCi0gIHByaXZhdGUgU3RyaW5nW10gbWVyZ2VQYXRoKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoYmFzZS5oYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXJnZSBhZ2FpbnN0IHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0gICAgaWYgKCFoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtZXJnZSBub24tcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLQotICAgIGludCBiYXNlU2VnbWVudENvdW50ID0gYmFzZS5zZWdtZW50Q291bnQoKTsKLSAgICBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIHN0YWNrID0gbmV3IFN0cmluZ1tiYXNlU2VnbWVudENvdW50ICsgc2VnbWVudENvdW50XTsKLSAgICBpbnQgc3AgPSAwOwotCi0gICAgLy8gdXNlIGEgc3RhY2sgdG8gYWNjdW11bGF0ZSBzZWdtZW50cyBvZiBiYXNlLCBleGNlcHQgZm9yIHRoZSBsYXN0Ci0gICAgLy8gKGkuZS4gc2tpcCB0cmFpbGluZyBzZXBhcmF0b3IgYW5kIGFueXRoaW5nIGZvbGxvd2luZyBpdCksIGFuZCBvZgotICAgIC8vIHJlbGF0aXZlIHBhdGgKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VTZWdtZW50Q291bnQgLSAxOyBpKyspCi0gICAgewotICAgICAgc3AgPSBhY2N1bXVsYXRlKHN0YWNrLCBzcCwgYmFzZS5zZWdtZW50KGkpLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIHNlZ21lbnRzW2ldLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgcmVsYXRpdmUgcGF0aCBpcyBlbXB0eSBvciBlbmRzIGluIGFuIGVtcHR5IHNlZ21lbnQsIGEgcGFyZW50IAotICAgIC8vIHJlZmVyZW5jZSwgb3IgYSBzZWxmIHJlZmVyZW5mY2UsIGFkZCBhIHRyYWlsaW5nIHNlcGFyYXRvciB0byBhCi0gICAgLy8gbm9uLWVtcHR5IHBhdGgKLSAgICBpZiAoc3AgPiAwICYmICAoc2VnbWVudENvdW50ID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkpKQotICAgIHsKLSAgICAgIHN0YWNrW3NwKytdID0gU0VHTUVOVF9FTVBUWTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzcF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzdGFjaywgMCwgcmVzdWx0LCAwLCBzcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIEFkZHMgYSBzZWdtZW50IHRvIGEgc3RhY2ssIHNraXBwaW5nIGVtcHR5IHNlZ21lbnRzIGFuZCBzZWxmIHJlZmVyZW5jZXMsCi0gIC8vIGFuZCBpbnRlcnByZXRpbmcgcGFyZW50IHJlZmVyZW5jZXMuCi0gIHByaXZhdGUgc3RhdGljIGludCBhY2N1bXVsYXRlKFN0cmluZ1tdIHN0YWNrLCBpbnQgc3AsIFN0cmluZyBzZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnQpKQotICAgIHsKLSAgICAgIGlmIChzcCA9PSAwKQotICAgICAgewotICAgICAgICAvLyBzcGVjaWFsIGNhcmUgbXVzdCBiZSB0YWtlbiBmb3IgYSByb290J3MgcGFyZW50IHJlZmVyZW5jZTogaXQgaXMKLSAgICAgICAgLy8gZWl0aGVyIGlnbm9yZWQgb3IgdGhlIHN5bWJvbGljIHJlZmVyZW5jZSBpdHNlbGYgaXMgcHVzaGVkCi0gICAgICAgIGlmIChwcmVzZXJ2ZVJvb3RQYXJlbnRzKSBzdGFja1tzcCsrXSA9IHNlZ21lbnQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHVubGVzcyB3ZSdyZSBhbHJlYWR5IGFjY3VtdWxhdGluZyByb290IHBhcmVudCByZWZlcmVuY2VzLAotICAgICAgICAvLyBwYXJlbnQgcmVmZXJlbmNlcyBzaW1wbHkgcG9wIHRoZSBsYXN0IHNlZ21lbnQgZGVzY2VuZGVkCi0gICAgICAgIGlmIChTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc3RhY2tbc3AgLSAxXSkpIHN0YWNrW3NwKytdID0gc2VnbWVudDsKLSAgICAgICAgZWxzZSBzcC0tOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudCkgJiYgIVNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudCkpCi0gICAgewotICAgICAgLy8gc2tpcCBlbXB0eSBzZWdtZW50cyBhbmQgc2VsZiByZWZlcmVuY2VzOyBwdXNoIGV2ZXJ5dGhpbmcgZWxzZQotICAgICAgc3RhY2tbc3ArK10gPSBzZWdtZW50OwotICAgIH0KLSAgICByZXR1cm4gc3A7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHNob3J0ZXN0IHJlbGF0aXZlIG9yLCBpZiBuZWNlc3NhcnksIHRoZSBhYnNvbHV0ZSBVUkkgdGhhdCwKLSAgICogd2hlbiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZSBoaWVyYXJjaGljYWwKLSAgICogVVJJIHVzaW5nIHtAbGluayAjcmVzb2x2ZShVUkkpIHJlc29sdmV9LCB3aWxsIHlpZWxkIHRoaXMgYWJzb2x1dGUgVVJJLiAgCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+dGhpczwvY29kZT4gaXMKLSAgICogcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIGRlcmVzb2x2ZShVUkkgYmFzZSkKLSAgewotICAgIHJldHVybiBkZXJlc29sdmUoYmFzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIGFuIGFic29sdXRlIFVSSSB0aGF0LCB3aGVuIHJlc29sdmVkIGFnYWluc3QgdGhlIGdpdmVuCi0gICAqIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgdXNpbmcge0BsaW5rCi0gICAqICNyZXNvbHZlKFVSSSwgYm9vbGVhbikgcmVzb2x2ZX0sIHdpbGwgeWllbGQgdGhpcyBhYnNvbHV0ZSBVUkkuCi0gICAqCi0gICAqIEBwYXJhbSBwcmVzZXJ2ZVJvb3RQYXJlbnRzIHRoZSBib29sZWFuIGFyZ3VtZW50IHRvIDxjb2RlPnJlc29sdmUoVVJJLAotICAgKiBib29sZWFuKTwvY29kZT4gZm9yIHdoaWNoIHRoZSByZXR1cm5lZCBVUkkgc2hvdWxkIHJlc29sdmUgdG8gdGhpcyBVUkkuCi0gICAqIEBwYXJhbSBhbnlSZWxQYXRoIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCAoaWYKLSAgICogYW55KSB3aWxsIGJlIHJlbGF0aXZlLCBpZiBwb3NzaWJsZS4gIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGZvcm0gb2YKLSAgICogdGhlIHJlc3VsdCdzIHBhdGggd2lsbCBkZXBlbmQgdXBvbiB0aGUgbmV4dCBwYXJhbWV0ZXIuCi0gICAqIEBwYXJhbSBzaG9ydGVyUmVsUGF0aCBpZiA8Y29kZT5hbnlSZWxQYXRoPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogYW5kIHRoaXMgcGFyYW1ldGVyIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCAoaWYKLSAgICogYW55KSB3aWxsIGJlIHJlbGF0aXZlLCBpZiBvbmUgY2FuIGJlIGZvdW5kIHRoYXQgaXMgbm8gbG9uZ2VyIChieSBudW1iZXIKLSAgICogb2Ygc2VnbWVudHMpIHRoYW4gdGhlIGFic29sdXRlIHBhdGguICBJZiBib3RoIDxjb2RlPmFueVJlbFBhdGg8L2NvZGU+Ci0gICAqIGFuZCB0aGlzIHBhcmFtZXRlciBhcmUgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpdCB3aWxsIGJlIGFic29sdXRlLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPnRoaXM8L2NvZGU+IGlzCi0gICAqIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSBkZXJlc29sdmUoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbnlSZWxQYXRoLCBib29sZWFuIHNob3J0ZXJSZWxQYXRoKQotICB7Ci0gICAgaWYgKCFiYXNlLmlzSGllcmFyY2hpY2FsKCkgfHwgYmFzZS5pc1JlbGF0aXZlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImRlcmVzb2x2ZSBhZ2FpbnN0IG5vbi1oaWVyYXJjaGljYWwgb3IgcmVsYXRpdmUgYmFzZSIpOwotICAgIH0KLSAgICBpZiAoaXNSZWxhdGl2ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRlcmVzb2x2ZSByZWxhdGl2ZSBVUkkiKTsKLSAgICB9Ci0KLSAgICAvLyBub3RlOiB0aGVzZSBhc3NlcnRpb25zIGltcGx5IHRoYXQgbmVpdGhlciB0aGlzIG5vciB0aGUgYmFzZSBVUkkgaGFzIGEKLSAgICAvLyByZWxhdGl2ZSBwYXRoOyB0aHVzLCBib3RoIGhhdmUgZWl0aGVyIGFuIGFic29sdXRlIHBhdGggb3Igbm8gcGF0aAotICAgIAotICAgIC8vIGRpZmZlcmVudCBzY2hlbWU6IG5lZWQgY29tcGxldGUsIGFic29sdXRlIFVSSQotICAgIGlmICghc2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoYmFzZS5zY2hlbWUoKSkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gc2luY2UgYmFzZSBtdXN0IGJlIGhpZXJhcmNoaWNhbCwgYW5kIHNpbmNlIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkKLSAgICAvLyBtdXN0IGhhdmUgYm90aCBzY2hlbWUgYW5kIG9wYXF1ZSBwYXJ0LCB0aGUgY29tcGxldGUgYWJzb2x1dGUgVVJJIGlzCi0gICAgLy8gbmVlZGVkIHRvIHJlc29sdmUgdG8gYSBub24taGllcmFyY2hpY2FsIFVSSQotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbmV3QXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2U7Ci0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBzZWdtZW50czsKLSAgICBTdHJpbmcgbmV3UXVlcnkgPSBxdWVyeTsKLQotICAgIGlmIChlcXVhbHMoYXV0aG9yaXR5LCBiYXNlLmF1dGhvcml0eSgpKSAmJgotICAgICAgICAoaGFzRGV2aWNlKCkgfHwgaGFzUGF0aCgpIHx8ICghYmFzZS5oYXNEZXZpY2UoKSAmJiAhYmFzZS5oYXNQYXRoKCkpKSkKLSAgICB7Ci0gICAgICAvLyBtYXRjaGluZyBhdXRob3JpdGllcyBhbmQgbm8gZGV2aWNlIG9yIHBhdGggcmVtb3ZhbAotICAgICAgbmV3QXV0aG9yaXR5ID0gbnVsbDsKLQotICAgICAgaWYgKGVxdWFscyhkZXZpY2UsIGJhc2UuZGV2aWNlKCkpICYmIChoYXNQYXRoKCkgfHwgIWJhc2UuaGFzUGF0aCgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbWF0Y2hpbmcgZGV2aWNlcyBhbmQgbm8gcGF0aCByZW1vdmFsCi0gICAgICAgIG5ld0RldmljZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gZXhjZXB0aW9uIGlmICghaGFzUGF0aCgpICYmIGJhc2UuaGFzUGF0aCgpKQotCi0gICAgICAgIGlmICghYW55UmVsUGF0aCAmJiAhc2hvcnRlclJlbFBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB1c2VyIHJlamVjdHMgYSByZWxhdGl2ZSBwYXRoOiBrZWVwIGFic29sdXRlIG9yIG5vIHBhdGgKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoYXNQYXRoKCkgPT0gYmFzZS5oYXNQYXRoKCkgJiYgc2VnbWVudHNFcXVhbChiYXNlKSAmJgotICAgICAgICAgICAgICAgICBlcXVhbHMocXVlcnksIGJhc2UucXVlcnkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZToga2VlcCBubyBwYXRoIG9yIHF1ZXJ5Ci0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICAgICAgICBuZXdRdWVyeSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWhhc1BhdGgoKSAmJiAhYmFzZS5oYXNQYXRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBubyBwYXRoczoga2VlcCBxdWVyeSBvbmx5Ci0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICAgICAgfQotICAgICAgICAvLyBleGNlcHRpb24gaWYgKCFoYXNBYnNvbHV0ZVBhdGgoKSkKLSAgICAgICAgZWxzZSBpZiAoaGFzQ29sbGFwc2FibGVTZWdtZW50cyhwcmVzZXJ2ZVJvb3RQYXJlbnRzKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHBhdGggZm9ybSBkZW1hbmRzIGFuIGFic29sdXRlIHBhdGg6IGtlZXAgaXQgYW5kIHF1ZXJ5Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8ga2VlcCBxdWVyeSBhbmQgc2VsZWN0IHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggYmFzZWQgb24gbGVuZ3RoCi0gICAgICAgICAgU3RyaW5nW10gcmVsID0gZmluZFJlbGF0aXZlUGF0aChiYXNlLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICAgICAgICBpZiAoYW55UmVsUGF0aCB8fCBzZWdtZW50cy5sZW5ndGggPiByZWwubGVuZ3RoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVzZXIgZGVtYW5kcyBhIHJlbGF0aXZlIHBhdGggb3IgdGhlIGFic29sdXRlIHBhdGggaXMgbG9uZ2VyCi0gICAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICAgICAgICAgIG5ld1NlZ21lbnRzID0gcmVsOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBlbHNlIGtlZXAgc2hvcnRlciBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVsc2Uga2VlcCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotICAgIH0KLSAgICAvLyBlbHNlIGtlZXAgYXV0aG9yaXR5LCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotCi0gICAgLy8gYWx3YXlzIGluY2x1ZGUgZnJhZ21lbnQsIGV2ZW4gaWYgbnVsbDsKLSAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZCBzaW5jZSBhbGwgY29tcG9uZW50cyBhcmUgZnJvbSBleGlzdGluZyBVUklzCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgbnVsbCwgbmV3QXV0aG9yaXR5LCBuZXdEZXZpY2UsIG5ld0Fic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgbmV3UXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9uLXJlbGF0aXZlIHBhdGggaW5jbHVkZXMgc2VnbWVudHMgdGhhdCB3b3VsZCBiZQotICAvLyBjb2xsYXBzZWQgd2hlbiByZXNvbHZpbmc7IGZhbHNlIG90aGVyd2lzZS4gIElmIHByZXNlcnZlUm9vdFBhcmVudHMgaXMKLSAgLy8gdHJ1ZSwgY29sbGFwc2FibGUgc2VnbWVudHMgaW5jbHVkZSBhbnkgZW1wdHkgc2VnbWVudHMsIGV4Y2VwdCBmb3IgdGhlCi0gIC8vIGxhc3Qgc2VnbWVudCwgYXMgd2VsbCBhcyBhbmQgcGFyZW50IGFuZCBzZWxmIHJlZmVyZW5jZXMuICBJZgotICAvLyBwcmVzZXJ2ZVJvb3RzUGFyZW50cyBpcyBmYWxzZSwgcGFyZW50IHJlZmVyZW5jZXMgYXJlIG5vdCBjb2xsYXBzYWJsZSBpZgotICAvLyB0aGV5IGFyZSB0aGUgZmlyc3Qgc2VnbWVudCBvciBwcmVjZWVkZWQgb25seSBieSBvdGhlciBwYXJlbnQKLSAgLy8gcmVmZXJlbmNlcy4KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxhcHNhYmxlU2VnbWVudHMoYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlc3QgY29sbGFwc2FiaWxpdHkgb2YgcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VnbWVudCA9IHNlZ21lbnRzW2ldOwotICAgICAgaWYgKChpIDwgbGVuIC0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50KSkgfHwKLSAgICAgICAgICBTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnQpIHx8Ci0gICAgICAgICAgU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnQpICYmICgKLSAgICAgICAgICAgICFwcmVzZXJ2ZVJvb3RQYXJlbnRzIHx8ICgKLSAgICAgICAgICAgICAgaSAhPSAwICYmICFTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudHNbaSAtIDFdKSkpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2hvcnRlc3QgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRoZSB0aGUgbm9uLXJlbGF0aXZlIHBhdGggb2YKLSAgLy8gdGhlIGdpdmVuIGJhc2UgYW5kIHRoaXMgYWJzb2x1dGUgcGF0aC4gIElmIHRoZSBiYXNlIGhhcyBubyBwYXRoLCBpdCBpcwotICAvLyB0cmVhdGVkIGFzIHRoZSByb290IGFic29sdXRlIHBhdGguCi0gIHByaXZhdGUgU3RyaW5nW10gZmluZFJlbGF0aXZlUGF0aChVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGJhc2UuaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImZpbmQgcmVsYXRpdmUgcGF0aCBhZ2FpbnN0IGJhc2Ugd2l0aCByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotICAgIGlmICghaGFzQWJzb2x1dGVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImZpbmQgcmVsYXRpdmUgcGF0aCBvZiBub24tYWJzb2x1dGUgcGF0aCIpOwotICAgIH0KLQotICAgIC8vIHRyZWF0IGFuIGVtcHR5IGJhc2UgcGF0aCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoCi0gICAgU3RyaW5nW10gc3RhcnRQYXRoID0gYmFzZS5jb2xsYXBzZVNlZ21lbnRzKHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIFN0cmluZ1tdIGVuZFBhdGggPSBzZWdtZW50czsKLQotICAgIC8vIGRyb3AgbGFzdCBzZWdtZW50IGZyb20gYmFzZSwgYXMgaW4gcmVzb2x2aW5nCi0gICAgaW50IHN0YXJ0Q291bnQgPSBzdGFydFBhdGgubGVuZ3RoID4gMCA/IHN0YXJ0UGF0aC5sZW5ndGggLSAxIDogMDsKLSAgICBpbnQgZW5kQ291bnQgPSBlbmRQYXRoLmxlbmd0aDsKLQotICAgIC8vIGluZGV4IG9mIGZpcnN0IHNlZ21lbnQgdGhhdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBlbmRQYXRoIGFuZCBzdGFydFBhdGgKLSAgICBpbnQgZGlmZiA9IDA7Ci0KLSAgICAvLyBpZiBlbmRQYXRoIGlzIHNob3J0ZXIgdGhhbiBzdGFydFBhdGgsIHRoZSBsYXN0IHNlZ21lbnQgb2YgZW5kUGF0aCBtYXkKLSAgICAvLyBub3QgYmUgY29tcGFyZWQ6IGJlY2F1c2Ugc3RhcnRQYXRoIGhhcyBiZWVuIGNvbGxhcHNlZCBhbmQgaGFkIGl0cwotICAgIC8vIGxhc3Qgc2VnbWVudCByZW1vdmVkLCBhbGwgcHJlY2VlZGluZyBzZWdtZW50cyBjYW4gYmUgY29uc2lkZXJlZCBub24tCi0gICAgLy8gZW1wdHkgYW5kIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdG9yLCB3aGlsZSB0aGUgbGFzdCBzZWdtZW50IG9mIGVuZFBhdGgKLSAgICAvLyB3aWxsIGVpdGhlciBiZSBub24tZW1wdHkgYW5kIG5vdCBmb2xsb3dlZCBieSBhIHNlcGFyYXRvciwgb3IganVzdCBlbXB0eQotICAgIGZvciAoaW50IGNvdW50ID0gc3RhcnRDb3VudCA8IGVuZENvdW50ID8gc3RhcnRDb3VudCA6IGVuZENvdW50IC0gMTsKLSAgICAgICAgIGRpZmYgPCBjb3VudCAmJiBzdGFydFBhdGhbZGlmZl0uZXF1YWxzKGVuZFBhdGhbZGlmZl0pOyBkaWZmKyspOwotCi0gICAgaW50IHVwQ291bnQgPSBzdGFydENvdW50IC0gZGlmZjsKLSAgICBpbnQgZG93bkNvdW50ID0gZW5kQ291bnQgLSBkaWZmOwotCi0gICAgLy8gYSBzaW5nbGUgc2VwYXJhdG9yLCBwb3NzaWJseSBwcmVjZWVkZWQgYnkgc29tZSBwYXJlbnQgcmVmZXJlbmNlCi0gICAgLy8gc2VnbWVudHMsIGlzIHJlZHVuZGFudAotICAgIGlmIChkb3duQ291bnQgPT0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhlbmRQYXRoW2VuZENvdW50IC0gMV0pKQotICAgIHsKLSAgICAgIGRvd25Db3VudCA9IDA7Ci0gICAgfQotCi0gICAgLy8gYW4gZW1wdHkgcGF0aCBuZWVkcyB0byBiZSByZXBsYWNlZCBieSBhIHNpbmdsZSAiLiIgaWYgdGhlcmUgaXMgbm8KLSAgICAvLyBxdWVyeSwgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlCi0gICAgaWYgKHVwQ291bnQgKyBkb3duQ291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocXVlcnkgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFNFR01FTlRfU0VMRiB9OwotICAgICAgcmV0dXJuIE5PX1NFR01FTlRTOwotICAgIH0KLQotICAgIC8vIHJldHVybiBhIGNvcnJlY3RseSBzaXplZCByZXN1bHQKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3VwQ291bnQgKyBkb3duQ291bnRdOwotICAgIEFycmF5cy5maWxsKHJlc3VsdCwgMCwgdXBDb3VudCwgU0VHTUVOVF9QQVJFTlQpOwotICAgIFN5c3RlbS5hcnJheWNvcHkoZW5kUGF0aCwgZGlmZiwgcmVzdWx0LCB1cENvdW50LCBkb3duQ291bnQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBDb2xsYXBzZXMgbm9uLWVuZGluZyBlbXB0eSBzZWdtZW50cywgcGFyZW50IHJlZmVyZW5jZXMsIGFuZCBzZWxmCi0gIC8vIHJlZmVyZW5jZXMgaW4gYSBub24tcmVsYXRpdmUgcGF0aCwgcmV0dXJuaW5nIHRoZSBzYW1lIHBhdGggdGhhdCB3b3VsZAotICAvLyBiZSBwcm9kdWNlZCBmcm9tIHRoZSBiYXNlIGhpZXJhcmNoaWNhbCBVUkkgYXMgcGFydCBvZiBhIHJlc29sdmUuCi0gIFN0cmluZ1tdIGNvbGxhcHNlU2VnbWVudHMoYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbGxhcHNlIHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWhhc0NvbGxhcHNhYmxlU2VnbWVudHMocHJlc2VydmVSb290UGFyZW50cykpIHJldHVybiBzZWdtZW50cygpOwotCi0gICAgLy8gdXNlIGEgc3RhY2sgdG8gYWNjdW11bGF0ZSBzZWdtZW50cwotICAgIGludCBzZWdtZW50Q291bnQgPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gc3RhY2sgPSBuZXcgU3RyaW5nW3NlZ21lbnRDb3VudF07Ci0gICAgaW50IHNwID0gMDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50OyBpKyspCi0gICAgewotICAgICAgc3AgPSBhY2N1bXVsYXRlKHN0YWNrLCBzcCwgc2VnbWVudHNbaV0sIHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vbi1lbXB0eSBhbmQgb3JpZ2luYWxseSBlbmRlZCBpbiBhbiBlbXB0eSBzZWdtZW50LCBhCi0gICAgLy8gcGFyZW50IHJlZmVyZW5jZSwgb3IgYSBzZWxmIHJlZmVyZW5jZSwgYWRkIGEgdHJhaWxpbmcgc2VwYXJhdG9yCi0gICAgaWYgKHNwID4gMCAmJiAoU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgIFNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgc3RhY2tbc3ArK10gPSBTRUdNRU5UX0VNUFRZOwotICAgIH0KLQotICAgIC8vIHJldHVybiBhIGNvcnJlY3RseSBzaXplZCByZXN1bHQKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3NwXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHN0YWNrLCAwLCByZXN1bHQsIDAsIHNwKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSS4gIEZvciBhIGdlbmVyaWMsCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgVVJJLCB0aGlzIGxvb2tzIGxpa2U6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOm9wYXF1ZVBhcnQjZnJhZ21lbnQ8L3ByZT4KLSAgICogCi0gICAqIDxwPkZvciBhIGhpZXJhcmNoaWNhbCBVUkksIGl0IGxvb2tzIGxpa2U6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOi8vYXV0aG9yaXR5L2RldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uP3F1ZXJ5I2ZyYWdtZW50PC9wcmU+Ci0gICAqCi0gICAqIDxwPkZvciBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+LCBpdCdzIGp1c3Q6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOmF1dGhvcml0eS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uP3F1ZXJ5I2ZyYWdtZW50PC9wcmU+Ci0gICAqIDxwPk9mIGNvdXJzZSwgYWJzZW50IGNvbXBvbmVudHMgYW5kIHRoZWlyIHNlcGFyYXRvcnMgd2lsbCBiZSBvbWl0dGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoY2FjaGVkVG9TdHJpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgaWYgKCFpc1JlbGF0aXZlKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzSGllcmFyY2hpY2FsKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNBcmNoaXZlKCkpIHJlc3VsdC5hcHBlbmQoQVVUSE9SSVRZX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0RldmljZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0Fic29sdXRlUGF0aCgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNRdWVyeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChRVUVSWV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQocXVlcnkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGhhc0ZyYWdtZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmcmFnbWVudCk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRUb1N0cmluZyA9IHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gY2FjaGVkVG9TdHJpbmc7Ci0gIH0KLQotICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJJIGZvciBkZWJ1Z2dpbmcsIGV4cGxpY2l0bHkKLSAgLy8gc2hvd2luZyBlYWNoIG9mIHRoZSBjb21wb25lbnRzLgotICBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBpbmNsdWRlU2ltcGxlRm9ybSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKGluY2x1ZGVTaW1wbGVGb3JtKSByZXN1bHQuYXBwZW5kKHRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuIGhpZXJhcmNoaWNhbDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChoaWVyYXJjaGljYWwpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgIHNjaGVtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChzY2hlbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgIGF1dGhvcml0eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgIGRldmljZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuIGFic29sdXRlUGF0aDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChhYnNvbHV0ZVBhdGgpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICBzZWdtZW50czogIik7Ci0gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PSAwKSByZXN1bHQuYXBwZW5kKCI8ZW1wdHk+Iik7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgICAgICAgICAiKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICAgcXVlcnk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocXVlcnkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICBmcmFnbWVudDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChmcmFnbWVudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIG1heSByZWZlciBkaXJlY3RseSB0byBhIGxvY2FsbHkgYWNjZXNzaWJsZSBmaWxlLCBhcwotICAgKiBkZXRlcm1pbmVkIGJ5IHtAbGluayAjaXNGaWxlIGlzRmlsZX0sIHtAbGluayBkZWNvZGUgZGVjb2Rlc30gYW5kIGZvcm1hdHMgIAotICAgKiB0aGUgVVJJIGFzIGEgcGF0aG5hbWUgdG8gdGhhdCBmaWxlOyByZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBubyBhdXRob3JpdHksIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgYW4gYXV0aG9yaXR5LCBpdCBpczoKLSAgICogPHByZT4KLSAgICogICAvL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKiAKLSAgICogPHA+SG93ZXZlciwgdGhlIGNoYXJhY3RlciB1c2VkIGFzIGEgc2VwYXJhdG9yIGlzIHN5c3RlbS1kZXBlbmRhbnQgYW5kCi0gICAqIG9idGFpbmVkIGZyb20ge0BsaW5rIGphdmEuaW8uRmlsZSNzZXBhcmF0b3JDaGFyfS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9GaWxlU3RyaW5nKCkKLSAgewotICAgIGlmICghaXNGaWxlKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBjaGFyIHNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0KLSAgICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgIH0KLQotICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLQotICAgIHJldHVybiBkZWNvZGUocmVzdWx0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBvbiB0byB0aGUgZW5kCi0gICAqIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7IHRoaXMgVVJJIHVuY2hhbmdlZCwKLSAgICogb3RoZXJ3aXNlLiAgSWYgdGhpcyBVUkkgaGFzIGFuIGF1dGhvcml0eSBhbmQvb3IgZGV2aWNlLCBidXQgbm8gcGF0aCwKLSAgICogdGhlIHNlZ21lbnQgYmVjb21lcyB0aGUgZmlyc3QgdW5kZXIgdGhlIHJvb3QgaW4gYW4gYWJzb2x1dGUgcGF0aC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnQ8L2NvZGU+Ci0gICAqIGlzIG5vdCBhIHZhbGlkIHNlZ21lbnQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kU2VnbWVudChTdHJpbmcgc2VnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50KHNlZ21lbnQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc2VnbWVudDogIiArIHNlZ21lbnQpOwotICAgIH0KLQotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBhYnNvbHV0ZSBwYXRoIG9yIG5vIHBhdGggLT4gYWJzb2x1dGUgcGF0aAotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gIWhhc1JlbGF0aXZlUGF0aCgpOwotCi0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgbmV3U2VnbWVudHNbbGVuXSA9IHNlZ21lbnQ7Ci0KLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBuZXdBYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBzZWdtZW50cyBvbiB0byB0aGUKLSAgICogZW5kIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7IHRoaXMgVVJJIHVuY2hhbmdlZCwKLSAgICogb3RoZXJ3aXNlLiAgSWYgdGhpcyBVUkkgaGFzIGFuIGF1dGhvcml0eSBhbmQvb3IgZGV2aWNlLCBidXQgbm8gcGF0aCwKLSAgICogdGhlIHNlZ21lbnRzIGFyZSBtYWRlIHRvIGZvcm0gYW4gYWJzb2x1dGUgcGF0aC4KLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgSWYgZGVzaXJlZCwgYSB0cmFpbGluZyBzZXBhcmF0b3Igc2hvdWxkIGJlCi0gICAqIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5LXN0cmluZyBzZWdtZW50IGFzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCi0gICAqIGFycmF5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2VnbWVudHM8L2NvZGU+Ci0gICAqIGlzIG5vdCBhIHZhbGlkIHNlZ21lbnQgYXJyYXkgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50c30uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFNlZ21lbnRzKFN0cmluZ1tdIHNlZ21lbnRzKQotICB7Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnRzKHNlZ21lbnRzKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IHNlZ21lbnRzID09IG51bGwgPyAiaW52YWxpZCBzZWdtZW50czogIiArIHNlZ21lbnRzIDoKLSAgICAgICAgImludmFsaWQgc2VnbWVudDogIiArIGZpcnN0SW52YWxpZFNlZ21lbnQoc2VnbWVudHMpOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gYWJzb2x1dGUgcGF0aCBvciBubyBwYXRoIC0+IGFic29sdXRlIHBhdGgKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9ICFoYXNSZWxhdGl2ZVBhdGgoKTsgCi0KLSAgICBpbnQgbGVuID0gdGhpcy5zZWdtZW50cy5sZW5ndGg7Ci0gICAgaW50IHNlZ21lbnRzQ291bnQgPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbiArIHNlZ21lbnRzQ291bnRdOwotICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5zZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIGxlbiwgc2VnbWVudHNDb3VudCk7Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgbmV3QWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgdHJpbW1pbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VnbWVudHMKLSAgICogKGluY2x1ZGluZyBlbXB0eSBzZWdtZW50cywgc3VjaCBhcyBvbmUgcmVwcmVzZW50aW5nIGEgdHJhaWxpbmcKLSAgICogc2VwYXJhdG9yKSBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhdGggb2YgdGhpcyBVUkksIGlmIGhpZXJhcmNoaWNhbDsKLSAgICogb3RoZXJ3aXNlLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCBpZiBhbGwgc2VnbWVudHMgYXJlIHRyaW1tZWQgZnJvbSBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUKLSAgICogcm9vdCBhYnNvbHV0ZSBwYXRoIHJlbWFpbnMuCi0gICAqIAotICAgKiBAcGFyYW0gaSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRvIGJlIHRyaW1tZWQgaW4gdGhlIHJldHVybmVkIFVSSS4gIElmCi0gICAqIGxlc3MgdGhhbiAxLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQ7IGlmIGVxdWFsIHRvIG9yIGdyZWF0ZXIKLSAgICogdGhhbiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgVVJJJ3MgcGF0aCwgYWxsIHNlZ21lbnRzIGFyZQotICAgKiB0cmltbWVkLiAgCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1TZWdtZW50cyhpbnQgaSkKLSAgewotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSB8fCBpIDwgMSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGggLSBpOwotICAgIGlmIChsZW4gPiAwKQotICAgIHsKLSAgICAgIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHRoYXQgaGFzIGEgcGF0aAotICAgKiB0aGF0IGVuZHMgd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvcjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgc2VnbWVudCBhcyB0aGUKLSAgICogbGFzdCBzZWdtZW50IGluIHRoZSBwYXRoOyBub3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIGRvZXMgPGVtPm5vdDwvZW0+Ci0gICAqIGluY2x1ZGUgdGhlIGxvbmUgc2VwYXJhdG9yIGluIHRoZSByb290IGFic29sdXRlIHBhdGguCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgCi0gICAgICBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2hvc2UgcGF0aCBpbmNsdWRlcyBhIGZpbGUgZXh0ZW5zaW9uLAotICAgKiB0aGF0IGZpbGUgZXh0ZW5zaW9uIGlzIHJldHVybmVkOyBudWxsIG90aGVyd2lzZS4gIFdlIGRlZmluZSBhIGZpbGUKLSAgICogZXh0ZW5zaW9uIGFzIGFueSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0IHBlcmlvZCAoIi4iKSBpbiB0aGUgZmluYWwKLSAgICogcGF0aCBzZWdtZW50LiAgSWYgdGhlcmUgaXMgbm8gcGF0aCwgdGhlIHBhdGggZW5kcyBpbiBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvciwgb3IgdGhlIGZpbmFsIHNlZ21lbnQgY29udGFpbnMgbm8gcGVyaW9kLCB0aGVuIHdlIGNvbnNpZGVyCi0gICAqIHRoZXJlIHRvIGJlIG5vIGZpbGUgZXh0ZW5zaW9uLiAgSWYgdGhlIGZpbmFsIHNlZ21lbnQgZW5kcyBpbiBhIHBlcmlvZCwKLSAgICogdGhlbiB0aGUgZmlsZSBleHRlbnNpb24gaXMgYW4gZW1wdHkgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaWxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGludCBpID0gbGFzdFNlZ21lbnQubGFzdEluZGV4T2YoRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogbGFzdFNlZ21lbnQuc3Vic3RyaW5nKGkgKyAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyBhIHBlcmlvZCAoIi4iKSBmb2xsb3dlZCBieSB0aGUKLSAgICogc3BlY2lmaWVkIGZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBsYXN0IHBhdGggc2VnbWVudCBvZiB0aGlzIFVSSSwgaWYgaXQgaXMKLSAgICogaGllcmFyY2hpY2FsIHdpdGggYSBub24tZW1wdHkgcGF0aCBlbmRpbmcgaW4gYSBub24tZW1wdHkgc2VnbWVudDsKLSAgICogb3RoZXJ3aXNlLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0KLSAgICogPHA+VGhlIGV4dGVuc2lvbiBpcyBhcHBlbmRlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNlZ21lbnQgYWxyZWFkeQotICAgKiBjb250YWlucyBhbiBleHRlbnNpb24uCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5maWxlRXh0ZW5zaW9uPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IChwb3J0aW9uKSBhY2NvcmRpbmcKLSAgICogdG8ge0BsaW5rICN2YWxpZFNlZ21lbnR9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRGaWxlRXh0ZW5zaW9uKFN0cmluZyBmaWxlRXh0ZW5zaW9uKQotICB7Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnQoZmlsZUV4dGVuc2lvbikpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgc2VnbWVudCBwb3J0aW9uOiAiICsgZmlsZUV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gc2VnbWVudHNbbGVuIC0gMV07Ci0gICAgaWYgKFNFR01FTlRfRU1QVFkuZXF1YWxzKGxhc3RTZWdtZW50KSkgcmV0dXJuIHRoaXM7Ci0gICAgU3RyaW5nQnVmZmVyIG5ld0xhc3RTZWdtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcihsYXN0U2VnbWVudCk7Ci0gICAgbmV3TGFzdFNlZ21lbnQuYXBwZW5kKEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUik7Ci0gICAgbmV3TGFzdFNlZ21lbnQuYXBwZW5kKGZpbGVFeHRlbnNpb24pOwotCi0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbiAtIDEpOwotICAgIG5ld1NlZ21lbnRzW2xlbiAtIDFdID0gbmV3TGFzdFNlZ21lbnQudG9TdHJpbmcoKTsKLSAgICAKLSAgICAvLyBub3RlOiBzZWdtZW50cy5sZW5ndGggPiAwIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgbm9uLW51bGwge0BsaW5rICNmaWxlRXh0ZW5zaW9uIGZpbGVFeHRlbnNpb259LAotICAgKiByZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IHJlbW92aW5nIGl0OyB0aGlzIFVSSSB1bmNoYW5nZWQsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbUZpbGVFeHRlbnNpb24oKQotICB7Ci0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gc2VnbWVudHNbbGVuIC0gMV07Ci0gICAgaW50IGkgPSBsYXN0U2VnbWVudC5sYXN0SW5kZXhPZihGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IpOwotICAgIGlmIChpIDwgMCkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbmV3TGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbiAtIDEpOwotICAgIG5ld1NlZ21lbnRzW2xlbiAtIDFdID0gbmV3TGFzdFNlZ21lbnQ7Ci0KLSAgICAvLyBub3RlOiBzZWdtZW50cy5sZW5ndGggPiAwIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IGVuZHMgaW4gYQotICAgKiBzbGFzaDsgdGhhdCBpcywgaXQgaGFzIGEgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3Igb3IgaXMgdGhlIHJvb3QKLSAgICogYWJzb2x1dGUgcGF0aCwgYW5kIGhhcyBubyBxdWVyeSBhbmQgbm8gZnJhZ21lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBpcyByZXR1cm5lZCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gaGllcmFyY2hpY2FsICYmIHF1ZXJ5ID09IG51bGwgJiYgZnJhZ21lbnQgPT0gbnVsbCAmJgotICAgICAgKGhhc1RyYWlsaW5nUGF0aFNlcGFyYXRvcigpIHx8IChhYnNvbHV0ZVBhdGggJiYgc2VnbWVudHMubGVuZ3RoID09IDApKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSByZWZlcmVuY2UgYW5kIDxjb2RlPm9sZFByZWZpeDwvY29kZT4gaXMgYQotICAgKiBwcmVmaXggb2YgaXQsIHRoaXMgcmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSByZXBsYWNpbmcgaXQgYnkKLSAgICogPGNvZGU+bmV3UHJlZml4PC9jb2RlPjsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5JbiBvcmRlciB0byBiZSBhIHByZWZpeCwgdGhlIDxjb2RlPm9sZFByZWZpeDwvY29kZT4ncwotICAgKiB7QGxpbmsgI2lzUHJlZml4IGlzUHJlZml4fSBtdXN0IHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgYW5kIGl0IG11c3QKLSAgICogbWF0Y2ggdGhpcyBVUkkncyBzY2hlbWUsIGF1dGhvcml0eSwgYW5kIGRldmljZS4gIEFsc28sIHRoZSBwYXRocyBtdXN0Ci0gICAqIG1hdGNoLCB1cCB0byBwcmVmaXgncyBlbmQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIKLSAgICogPGNvZGU+b2xkUHJlZml4PC9jb2RlPiBvciA8Y29kZT5uZXdQcmVmaXg8L2NvZGU+IGlzIG5vdCBhIHByZWZpeCBVUkkKLSAgICogYWNjb3JkaW5nIHRvIHtAbGluayAjaXNQcmVmaXh9LgotICAgKi8KLSAgcHVibGljIFVSSSByZXBsYWNlUHJlZml4KFVSSSBvbGRQcmVmaXgsIFVSSSBuZXdQcmVmaXgpCi0gIHsKLSAgICBpZiAoIW9sZFByZWZpeC5pc1ByZWZpeCgpIHx8ICFuZXdQcmVmaXguaXNQcmVmaXgoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgd2hpY2ggPSBvbGRQcmVmaXguaXNQcmVmaXgoKSA/ICJuZXciIDogIm9sZCI7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tcHJlZml4ICIgKyB3aGljaCArICIgdmFsdWUiKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgd2hhdCdzIGxlZnQgb2YgdGhlIHNlZ21lbnRzIGFmdGVyIHRyaW1taW5nIHRoZSBwcmVmaXguCi0gICAgU3RyaW5nW10gdGFpbFNlZ21lbnRzID0gZ2V0VGFpbFNlZ21lbnRzKG9sZFByZWZpeCk7Ci0gICAgaWYgKHRhaWxTZWdtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIC8vIElmIHRoZSBuZXcgcHJlZml4IGhhcyBzZWdtZW50cywgaXQgaXMgbm90IHRoZSByb290IGFic29sdXRlIHBhdGgsCi0gICAgLy8gYW5kIHdlIG5lZWQgdG8gZHJvcCB0aGUgdHJhaWxpbmcgZW1wdHkgc2VnbWVudCBhbmQgYXBwZW5kIHRoZSB0YWlsCi0gICAgLy8gc2VnbWVudHMuCi0gICAgU3RyaW5nW10gbWVyZ2VkU2VnbWVudHMgPSB0YWlsU2VnbWVudHM7Ci0gICAgaWYgKG5ld1ByZWZpeC5zZWdtZW50Q291bnQoKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBzZWdtZW50c1RvS2VlcCA9IG5ld1ByZWZpeC5zZWdtZW50Q291bnQoKSAtIDE7Ci0gICAgICBtZXJnZWRTZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudHNUb0tlZXAgKyB0YWlsU2VnbWVudHMubGVuZ3RoXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3UHJlZml4LnNlZ21lbnRzKCksIDAsIG1lcmdlZFNlZ21lbnRzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c1RvS2VlcCk7Ci0KLSAgICAgIGlmICh0YWlsU2VnbWVudHMubGVuZ3RoICE9IDApCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGFpbFNlZ21lbnRzLCAwLCBtZXJnZWRTZWdtZW50cywgc2VnbWVudHNUb0tlZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFNlZ21lbnRzLmxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG5ld1ByZWZpeC5zY2hlbWUoKSwgbmV3UHJlZml4LmF1dGhvcml0eSgpLAotICAgICAgICAgICAgICAgICAgIG5ld1ByZWZpeC5kZXZpY2UoKSwgbmV3UHJlZml4Lmhhc0Fic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgIG1lcmdlZFNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGFuZCBwcmVmaXggaXMgYSBwcmVmaXggb2YgaXQsCi0gIC8vIHJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggcmVtYWluaW5nIGFmdGVyIHRoYXQgcHJlZml4IGhhcyBiZWVuCi0gIC8vIHRyaW1tZWQ7IG51bGwgb3RoZXJ3aXNlLgotICBwcml2YXRlIFN0cmluZ1tdIGdldFRhaWxTZWdtZW50cyhVUkkgcHJlZml4KQotICB7Ci0gICAgaWYgKCFwcmVmaXguaXNQcmVmaXgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tcHJlZml4IHRyaW0iKTsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBldmVuIGNvbnNpZGVyIGl0IHVubGVzcyB0aGlzIGlzIGhpZXJhcmNoaWNhbCBhbmQgaGFzIHNjaGVtZSwKLSAgICAvLyBhdXRob3JpdHksIGRldmljZSBhbmQgcGF0aCBhYnNvbHV0ZW5lc3MgZXF1YWwgdG8gdGhvc2Ugb2YgdGhlIHByZWZpeC4KLSAgICBpZiAoIWhpZXJhcmNoaWNhbCB8fAotICAgICAgICAhZXF1YWxzKHNjaGVtZSwgcHJlZml4LnNjaGVtZSgpLCB0cnVlKSB8fAotICAgICAgICAhZXF1YWxzKGF1dGhvcml0eSwgcHJlZml4LmF1dGhvcml0eSgpKSB8fAotICAgICAgICAhZXF1YWxzKGRldmljZSwgcHJlZml4LmRldmljZSgpKSB8fAotICAgICAgICBhYnNvbHV0ZVBhdGggIT0gcHJlZml4Lmhhc0Fic29sdXRlUGF0aCgpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBwcmVmaXggaGFzIG5vIHNlZ21lbnRzLCB0aGVuIGl0IGlzIHRoZSByb290IGFic29sdXRlIHBhdGgsIGFuZAotICAgIC8vIHdlIGtub3cgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoLCB0b28uCi0gICAgaWYgKHByZWZpeC5zZWdtZW50Q291bnQoKSA9PSAwKSByZXR1cm4gc2VnbWVudHM7Ci0KLSAgICAvLyBUaGlzIG11c3QgaGF2ZSBubyBmZXdlciBzZWdtZW50cyB0aGFuIHRoZSBwcmVmaXguICBTaW5jZSB0aGUgcHJlZml4Ci0gICAgLy8gaXMgbm90IHRoZSByb290IGFic29sdXRlIHBhdGgsIGl0cyBsYXN0IHNlZ21lbnQgaXMgZW1wdHk7IGFsbCBvdGhlcnMKLSAgICAvLyBtdXN0IG1hdGNoLgotICAgIGludCBpID0gMDsKLSAgICBpbnQgc2VnbWVudHNUb0NvbXBhcmUgPSBwcmVmaXguc2VnbWVudENvdW50KCkgLSAxOwotICAgIGlmIChzZWdtZW50cy5sZW5ndGggPD0gc2VnbWVudHNUb0NvbXBhcmUpIHJldHVybiBudWxsOwotCi0gICAgZm9yICg7IGkgPCBzZWdtZW50c1RvQ29tcGFyZTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc2VnbWVudHNbaV0uZXF1YWxzKHByZWZpeC5zZWdtZW50KGkpKSkgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gVGhlIHByZWZpeCByZWFsbHkgaXMgYSBwcmVmaXggb2YgdGhpcy4gIElmIHRoaXMgaGFzIGp1c3Qgb25lIG1vcmUsCi0gICAgLy8gZW1wdHkgc2VnbWVudCwgdGhlIHBhdGhzIGFyZSB0aGUgc2FtZS4KLSAgICBpZiAoaSA9PSBzZWdtZW50cy5sZW5ndGggLSAxICYmIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW2ldKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTk9fU0VHTUVOVFM7Ci0gICAgfQotICAgIAotICAgIC8vIE90aGVyd2lzZSwgdGhlIHBhdGggbmVlZHMgb25seSB0aGUgcmVtYWluaW5nIHNlZ21lbnRzLgotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50cy5sZW5ndGggLSBpXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCBpLCBuZXdTZWdtZW50cywgMCwgbmV3U2VnbWVudHMubGVuZ3RoKTsKLSAgICByZXR1cm4gbmV3U2VnbWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgb3BhcXVlIHBhcnQgdmFsdWUsIGFzIGRlZmluZWQKLSAgICogYnkgdGhlIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGlzIDxjb2RlPi88L2NvZGU+IGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVPcGFxdWVQYXJ0KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCk7Ci0gICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDAgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/Ci0gICAgICAiJTJGIiArIHJlc3VsdC5zdWJzdHJpbmcoMSkgOgotICAgICAgcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIGF1dGhvcml0eSwgYXMgZGVmaW5lZCBieSB0aGUKLSAgICogUkZDLiAgQWxsIGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LAotICAgKiBhcmUgZXNjYXBlZCwgYXMgYXJlIDxjb2RlPi88L2NvZGU+IGFuZCA8Y29kZT4/PC9jb2RlPgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIHNlZ21lbnQsIGFzIGRlZmluZWQgYnkgdGhlCi0gICAqIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGFyZSA8Y29kZT4vPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVNlZ21lbnQoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgcXVlcnksIGFzIGRlZmluZWQgYnkgdGhlIFJGQy4KLSAgICogT25seSBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwgYXJlIGVzY2FwZWQuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVRdWVyeShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIGZyYWdtZW50LCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgKiBSRkMuICBPbmx5IGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LCBhcmUKLSAgICogZXNjYXBlZC4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUZyYWdtZW50KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvLyBFbmNvZGVzIGEgY29tcGxldGUgVVJJLCBvcHRpb25hbGx5IGxlYXZpbmcgJSBjaGFyYWN0ZXJzIHVuZXNjYXBlZCB3aGVuCi0gIC8vIGJlZ2lubmluZyBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UuICBXZSBhc3N1bWUgdGhhdCB0aGUKLSAgLy8gbGFzdCAjIGJlZ2lucyB0aGUgZnJhZ21lbnQuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpbnQgaSA9IHVyaS5pbmRleE9mKFNDSEVNRV9TRVBBUkFUT1IpOwotICAgIGlmIChpICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuc3Vic3RyaW5nKDAsIGkpOwotICAgICAgcmVzdWx0LmFwcGVuZChzY2hlbWUpOwotICAgICAgcmVzdWx0LmFwcGVuZChTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGogPSB1cmkubGFzdEluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICBpZiAoaiAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3NwYXJ0ID0gdXJpLnN1YnN0cmluZygrK2ksIGopOwotICAgICAgcmVzdWx0LmFwcGVuZChlbmNvZGUoc3NwYXJ0LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICAgIFN0cmluZyBmcmFnbWVudCA9IHVyaS5zdWJzdHJpbmcoKytqKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKGZyYWdtZW50LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgc3NwYXJ0ID0gdXJpLnN1YnN0cmluZygrK2kpOwotICAgICAgcmVzdWx0LmFwcGVuZChlbmNvZGUoc3NwYXJ0LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIEVuY29kZXMgdGhlIGdpdmVuIHN0cmluZywgcmVwbGFjaW5nIGVhY2ggQVNDSUkgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGluCi0gIC8vIHRoZSBzZXQgc3BlY2lmaWVkIGJ5IHRoZSAxMjgtYml0IGJpdG1hc2sgYW5kIGVhY2ggbm9uLUFTQ0lJIGNoYXJhY3RlcgotICAvLyBiZWxvdyAweEEwIGJ5IGFuIGVzY2FwZSBzZXF1ZW5jZSBvZiAlIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzLiAgSWYKLSAgLy8gJSBpcyBub3QgaW4gdGhlIHNldCBidXQgaWdub3JlRXNjYXBlZCBpcyB0cnVlLCB0aGVuICUgd2lsbCBub3QgYmUgZW5jb2RlZAotICAvLyBpZmYgaXQgYWxyZWFkeSBiZWdpbnMgYSB2YWxpZCBlc2NhcGUgc2VxdWVuY2UuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2ssIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAoIW1hdGNoZXMoYywgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spICYmIGMgPCAxNjAgJiYKLSAgICAgICAgICAoIWlnbm9yZUVzY2FwZWQgfHwgIWlzRXNjYXBlZCh2YWx1ZSwgaSkpKQotICAgICAgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBwZW5kRXNjYXBlZChyZXN1bHQsIChieXRlKWMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBUZXN0cyB3aGV0aGVyIGFuIGVzY2FwZSBvY2N1cnMgaW4gdGhlIGdpdmVuIHN0cmluZywgc3RhcnRpbmcgYXQgaW5kZXggaS4KLSAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlIGlzIGEgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VzY2FwZWQoU3RyaW5nIHMsIGludCBpKQotICB7Ci0gICAgcmV0dXJuIHMuY2hhckF0KGkpID09IEVTQ0FQRSAmJiBzLmxlbmd0aCgpID4gaSArIDIgJiYKLSAgICAgIG1hdGNoZXMocy5jaGFyQXQoaSArIDEpLCBIRVhfSEksIEhFWF9MTykgJiYKLSAgICAgIG1hdGNoZXMocy5jaGFyQXQoaSArIDIpLCBIRVhfSEksIEhFWF9MTyk7Ci0gIH0KLQotICAvLyBDb21wdXRlcyBhIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UgZm9yIHRoZSBieXRlLCBhcHBlbmRpbmcKLSAgLy8gaXQgdG8gdGhlIFN0cmluZ0J1ZmZlci4gIE9ubHkgY2hhcmFjdGVycyB1cCB0byAweEZGIHNob3VsZCBiZSBlc2NhcGVkOwotICAvLyBhbGwgYnV0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIHdpbGwgYmUgaWdub3JlZC4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkKFN0cmluZ0J1ZmZlciByZXN1bHQsIGJ5dGUgYikKLSAgewotICAgIHJlc3VsdC5hcHBlbmQoRVNDQVBFKTsKLQotICAgIC8vIFRoZSBieXRlIGlzIGF1dG9tYXRpY2FsbHkgd2lkZW5lZCBpbnRvIGFuIGludCwgd2l0aCBzaWduIGV4dGVuc2lvbiwKLSAgICAvLyBmb3Igc2hpZnRpbmcuICBUaGlzIGNhbiBpbnRyb2R1Y2UgMSdzIHRvIHRoZSBsZWZ0IG9mIHRoZSBieXRlLCB3aGljaAotICAgIC8vIG11c3QgYmUgY2xlYXJlZCBieSBtYXNraW5nIGJlZm9yZSBsb29raW5nIHVwIHRoZSBoZXggZGlnaXQuCi0gICAgLy8KLSAgICByZXN1bHQuYXBwZW5kKEhFWF9ESUdJVFNbKGIgPj4gNCkgJiAweDBGXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChIRVhfRElHSVRTW2IgJiAweDBGXSk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlcyB0aGUgZ2l2ZW4gc3RyaW5nLCByZXBsYWNpbmcgZWFjaCB0aHJlZS1kaWdpdCBlc2NhcGUgc2VxdWVuY2UgYnkKLSAgICogdGhlIGNoYXJhY3RlciB0aGF0IGl0IHJlcHJlc2VudHMuICBJbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCi0gICAqIGlnbm9yZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaXNFc2NhcGVkKHZhbHVlLCBpKSkgCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKHVuZXNjYXBlKHZhbHVlLmNoYXJBdChpICsgMSksIHZhbHVlLmNoYXJBdChpICsgMikpKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUuY2hhckF0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdmFsdWUgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGNoYXJhY3RlciBlbmNvZGVkIGJ5ICUgZm9sbG93ZWQgYnkgdGhlIHR3byBnaXZlbiBoZXggZGlnaXRzLAotICAvLyB3aGljaCBpcyBhbHdheXMgMHhGRiBvciBsZXNzLCBzbyBjYW4gc2FmZWx5IGJlIGNhc3RlZCB0byBhIGJ5dGUuICBJZgotICAvLyBlaXRoZXIgY2hhcmFjdGVyIGlzIG5vdCBhIGhleCBkaWdpdCwgYSBib2d1cyByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciB1bmVzY2FwZShjaGFyIGhpZ2hIZXhEaWdpdCwgY2hhciBsb3dIZXhEaWdpdCkKLSAgewotICAgIHJldHVybiAoY2hhcikoKHZhbHVlT2YoaGlnaEhleERpZ2l0KSA8PCA0KSB8IHZhbHVlT2YobG93SGV4RGlnaXQpKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGludCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gaGV4IGRpZ2l0LgotICBwcml2YXRlIHN0YXRpYyBpbnQgdmFsdWVPZihjaGFyIGhleERpZ2l0KQotICB7Ci0gICAgaWYgKGhleERpZ2l0ID49ICdBJyAmJiBoZXhEaWdpdCA8PSAnRicpCi0gICAgewotICAgICAgcmV0dXJuIGhleERpZ2l0IC0gJ0EnICsgMTA7Ci0gICAgfQotICAgIGlmIChoZXhEaWdpdCA+PSAnYScgJiYgaGV4RGlnaXQgPD0gJ2YnKQotICAgIHsKLSAgICAgIHJldHVybiBoZXhEaWdpdCAtICdhJyArIDEwOwotICAgIH0KLSAgICBpZiAoaGV4RGlnaXQgPj0gJzAnICYmIGhleERpZ2l0IDw9ICc5JykKLSAgICB7Ci0gICAgICByZXR1cm4gaGV4RGlnaXQgLSAnMCc7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB0YWtlcyB0d28gVVJJcywgdGhlIGZpcnN0IG9uZSByZWxhdGl2ZSwgdGhlIHNlY29uZCBhYnNvbHV0ZS4gSXQKLSAgICogdHJpZXMgdG8gcmVzb2x2ZSB0aGUgZmlyc3QgVVJJIChtYWtpbmcgaXQgYWJzb2x1dGUpIGJ5IHVzaW5nIHRoZSBzZWNvbmQgb25lLgotICAgKiBJZiB0aGUgVVJJIGNhbm5vdCBiZSByZXNvbHZlZCwgdGhlIHJlbGF0aXZlIG9uZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHJlbGF0aXZlVVJJCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVVSSQotICAgKiBAcmV0dXJuIHJlbGF0aXZlVVJJIHJlc29sdmVkIChhYnNvbHV0ZSkgb3IgcmVsYXRpdmVVUkkgdW5tb2RpZmllZCBpZiBpdCBjYW5ub3QKLSAgICogYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlUmVsYXRpdmVVUkkoU3RyaW5nIHJlbGF0aXZlVVJJLCBTdHJpbmcgYWJzb2x1dGVVUkkpIHsKLQotCSAgU3RyaW5nIHJlc3VsdCA9IHJlbGF0aXZlVVJJOwotCi0JICB0cnkgewotICAgICAgCVVSSSByZWxhdGl2ZSA9IFVSSS5jcmVhdGVVUkkocmVsYXRpdmVVUkkpOwotICAgICAgIAlVUkkgYWJzb2x1dGUgPSBVUkkuY3JlYXRlVVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAJVVJJIHJlc29sdmVkUmVsYXRpdmUgPSByZWxhdGl2ZS5yZXNvbHZlKGFic29sdXRlKTsKLSAgICAgICAJcmVzdWx0ID0gcmVzb2x2ZWRSZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAKLSAgLyoKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIFVSSSBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVyczsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogVGhpcyB1bnVzZWQgY29kZSBpcyBpbmNsdWRlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLiAKLSAgICovCi0vKgotICBwdWJsaWMgYm9vbGVhbiBpc0lSSSgpCi0gIHsKLSAgICByZXR1cm4gaXJpOyAKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5zIGFueSBub24tQVNDSUkgY2hhcmFjdGVyczsKLSAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTm9uQVNDSUkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKHZhbHVlLmNoYXJBdChpKSA+IDEyNykgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotKi8KLQotICAvKgotICAgKiBJZiB0aGlzIGlzIGFuIHtAbGluayAjaXNJUkkgSVJJfSwgY29udmVydHMgaXQgdG8gYSBzdHJpY3QgQVNDSUkgVVJJLAotICAgKiB1c2luZyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMSBvZiB0aGUKLSAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9pcmktZWRpdC9kcmFmdC1kdWVyc3QtaXJpLTA5LnR4dCI+SVJJCi0gICAqIERyYWZ0IFJGQzwvYT4uICBPdGhlcndpc2UsIHRoaXMgVVJJLCBpdHNlbGYsIGlzIHJldHVybmVkLgotICAgKgotICAgKiBUaGlzIHVudXNlZCBjb2RlIGlzIGluY2x1ZGVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlLi4uCi0gICAqLwotLyoKLSAgcHVibGljIFVSSSB0b0FTQ0lJVVJJKCkKLSAgewotICAgIGlmICghaXJpKSByZXR1cm4gdGhpczsKLQotICAgIGlmIChjYWNoZWRBU0NJSVVSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBlQXV0aG9yaXR5ID0gZW5jb2RlQXNBU0NJSShhdXRob3JpdHkpOwotICAgICAgU3RyaW5nIGVEZXZpY2UgPSBlbmNvZGVBc0FTQ0lJKGRldmljZSk7Ci0gICAgICBTdHJpbmcgZVF1ZXJ5ID0gZW5jb2RlQXNBU0NJSShxdWVyeSk7Ci0gICAgICBTdHJpbmcgZUZyYWdtZW50ID0gZW5jb2RlQXNBU0NJSShmcmFnbWVudCk7Ci0gICAgICBTdHJpbmdbXSBlU2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRzLmxlbmd0aF07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBlU2VnbWVudHNbaV0gPSBlbmNvZGVBc0FTQ0lJKHNlZ21lbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZEFTQ0lJVVJJID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgZUF1dGhvcml0eSwgZURldmljZSwgYWJzb2x1dGVQYXRoLCBlU2VnbWVudHMsIGVRdWVyeSwgZUZyYWdtZW50KTsgCi0KLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZEFTQ0lJVVJJOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHN0cmljdCBBU0NJSSBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gdmFsdWUuICBFYWNoIG5vbi1BU0NJSQotICAvLyBjaGFyYWN0ZXIgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIFVURi04IGVuY29kaW5nLCB3aGljaCBhcmUgdGhlbgotICAvLyByZXByZXNudGVkIHVzaW5nICUgZXNjYXBpbmcuCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kZUFzQVNDSUkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmIChjID49IDEyOCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBieXRlW10gZW5jb2RlZCA9IChuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBjIH0pKS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMCwgZW5jTGVuID0gZW5jb2RlZC5sZW5ndGg7IGogPCBlbmNMZW47IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmRFc2NhcGVkKHJlc3VsdCwgZW5jb2RlZFtqXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdmFsdWUgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWxpZCwgY29uc2VjdXRpdmUsIHRocmVlLWNoYXJhY3RlciBlc2NhcGUKLSAgLy8gc2VxdWVuY2VzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHN0YXJ0aW5nIGF0IGluZGV4IGkuCi0gIHByaXZhdGUgc3RhdGljIGludCBjb3VudEVzY2FwZWQoU3RyaW5nIHMsIGludCBpKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICBmb3IgKGludCBsZW4gPSBzLmxlbmd0aCgpOyBpIDwgbGVuOyBpICs9IDMpCi0gICAgewotICAgICAgaWYgKGlzRXNjYXBlZChzLCBpKSkgcmVzdWx0Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2ZhMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBIFVSSSByZXNvbHZlciBleHRlbnNpb24gZGVzY3JpcHRvciBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGFsbG93cyBmb3IgdGhlCi0gKiBleHRlbnNpb24gcmVzb2x2ZXIgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgdGltZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IKLXsKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVUeXBlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0KLQlwdWJsaWMgTGlzdCBwcm9qZWN0TmF0dXJlSWRzOwotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgaW50IHN0YWdlID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTjsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJpb3JpdHkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlBSSU9SSVRZX01FRElVTTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MgbmFtZS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQgVGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlciBjbGFzcy4KLQkgKiBAcGFyYW0gcHJvamVjdE5hdHVyZUlkcyBUaGUgcHJvamVjdCBuYXR1cmUgSURzIGZvciB3aGljaCB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSB0eXBlIG9mIHJlc291cmNlIGZvciB3aGljaCB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIG9mIHRoZSByZXNvbHZlci4gRWl0aGVyIHByZW5vcm1hbGl6YXRpb24gb3IgcG9zdG5vcm1hbGl6YXRpb24uCi0JICogQHBhcmFtIHByaW9yaXR5IFRoZSByZXNvbHZlcidzIHByaW9yaXR5LiBoaWdoLCBtZWRpdW0sIG9yIGxvdy4KLQkgKi8KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwbHVnaW5JZCwKLQkJCUxpc3QgcHJvamVjdE5hdHVyZUlkcywgU3RyaW5nIHJlc291cmNlVHlwZSwgaW50IHN0YWdlLCBTdHJpbmcgcHJpb3JpdHkpCi0JewotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLnByb2plY3ROYXR1cmVJZHMgPSBwcm9qZWN0TmF0dXJlSWRzOwotCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLQkJdGhpcy5zdGFnZSA9IHN0YWdlOwotCQl0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0JICovCi0JcHVibGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uIGdldFJlc29sdmVyKCkKLQl7Ci0KLQkJaWYgKHJlc29sdmVyID09IG51bGwgJiYgY2xhc3NOYW1lICE9IG51bGwgJiYgIWVycm9yKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQkvLyBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCS8vIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUNsYXNzIHRoZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCXJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJZXJyb3IgPSB0cnVlOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHJlc29sdmVyIHNob3VsZCBydW4gaW4gdGhlIGN1cnJlbnQgc2NlbmFyaW8gZ2l2ZW4KLQkgKiB0aGUgcHJvamVjdCBuYXR1cmUgSUQsIHJlc291cmNlIHR5cGUsIGFuZCBzdGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hdHVyZUlkIFRoZSBwcm9qZWN0IG5hdHVyZSBJRCB0byBjaGVjayBhZ2FpbnN0LgotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUgdG8gY2hlY2sgYWdhaW5zdC4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIHRvIGNoZWNrIGFnYWluc3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcHJvamVjdE5hdHVyZUlkLCBTdHJpbmcgcmVzb3VyY2VUeXBlLCBpbnQgc3RhZ2UpCi0JewotCQlpZiAocHJvamVjdE5hdHVyZUlkcy5jb250YWlucyhwcm9qZWN0TmF0dXJlSWQpKQotCQl7Ci0JCQlyZXR1cm4gbWF0Y2hlcyh0aGlzLnJlc291cmNlVHlwZSwgcmVzb3VyY2VUeXBlKSAmJiB0aGlzLnN0YWdlID09IHN0YWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHN0cmluZyBhIG1hdGNoZXMgc3RyaW5nIGIuCi0JICogVE9ETzogV2h5IGlzIHRoaXMgcmVxdWlyZWQgaW5zdGVhZCBvZiBqdXN0IHVzaW5nIFN0cmluZy5lcXVhbHM/Ci0JICogCi0JICogQHBhcmFtIGEgU3RyaW5nIGZvciBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBiIFN0cmluZyBmb3IgY29tcGFyaXNvbi4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZ3MgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYSwgU3RyaW5nIGIpCi0JewotCQlyZXR1cm4gKGEgIT0gbnVsbCkgPyBhLmVxdWFscyhiKSA6IGEgPT0gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMzA3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIFVSSSByZXNvbHZlciBleHRlbnNpb24gcmVnaXN0cnkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKLSAqIGFsbCBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0JcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUdFX1BSRU5PUk1BTElaQVRJT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBR0VfUE9TVE5PUk1BTElaQVRJT04gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBR0VfUEhZU0lDQUwgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfTE9XID0gImxvdyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9NRURJVU0gPSAibWVkaXVtIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0hJR0ggPSAiaGlnaCI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBOVUxMX1BST0pFQ1RfTkFUVVJFX0lEID0gIiI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgaW5zdGFuY2U7Ci0KLQlwcml2YXRlIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IGdldEludGFuY2UoKQotCXsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCXsKLQkJCWluc3RhbmNlID0gbmV3IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCW5ldyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKGluc3RhbmNlKS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGV4dGVuc2lvbiByZXNvbHZlciB0byB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlciBjbGFzcy4KLQkgKiBAcGFyYW0gcGx1Z2luSWQgVGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlciBjbGFzcy4KLQkgKiBAcGFyYW0gcHJvamVjdE5hdHVyZUlkcyBBIGxpc3Qgb2YgcHJvamVjdCBuYXR1cmVzIElEcyBmb3Igd2hpY2ggdGhlIHJlc29sdmVyIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgdHlwZSBvZiByZXNvdXJlIGZvciB3aGljaCBhbiBleHRlbnNpb24gcmVzb3VyY2Ugc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIHRvIHJ1bi4gRWl0aGVyIHByZW5vcm1hbGl6YXRpb24gb3IgcG9zdG5vcm1hbGl6YXRpb24uCi0JICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgcmVzb2x2ZXIuIFZhbGlkIHZhbHVlcyBhcmUgaGlnaCwgbWVkaXVtLCBhbmQgbG93LgotCSAqLwotCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGx1Z2luSWQsIExpc3QgcHJvamVjdE5hdHVyZUlkcywKLQkJCVN0cmluZyByZXNvdXJjZVR5cGUsIGludCBzdGFnZSwgU3RyaW5nIHByaW9yaXR5KQotCXsKLQkJaWYgKHByb2plY3ROYXR1cmVJZHMgPT0gbnVsbCkKLQkJCXByb2plY3ROYXR1cmVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9qZWN0TmF0dXJlSWRzLmlzRW1wdHkoKSkKLQkJewotCQkJcHJvamVjdE5hdHVyZUlkcy5hZGQoTlVMTF9QUk9KRUNUX05BVFVSRV9JRCk7Ci0JCX0KLQkJVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yIGluZm8gPSBuZXcgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yKAotCQkJCWNsYXNzTmFtZSwgcGx1Z2luSWQsIHByb2plY3ROYXR1cmVJZHMsIHJlc291cmNlVHlwZSwgc3RhZ2UsIHByaW9yaXR5KTsKLQotCQlJdGVyYXRvciBpZHNJdGVyID0gcHJvamVjdE5hdHVyZUlkcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaWRzSXRlci5oYXNOZXh0KCkpCi0JCXsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpZHNJdGVyLm5leHQoKTsKLQotCQkJSGFzaE1hcCBwcmlvcml0eU1hcCA9IChIYXNoTWFwKSBtYXAuZ2V0KGtleSk7Ci0JCQlpZiAocHJpb3JpdHlNYXAgPT0gbnVsbCkKLQkJCXsKLQkJCQlwcmlvcml0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbWFwLnB1dChrZXksIHByaW9yaXR5TWFwKTsKLQkJCQlwcmlvcml0eU1hcC5wdXQoUFJJT1JJVFlfSElHSCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCQlwcmlvcml0eU1hcC5wdXQoUFJJT1JJVFlfTUVESVVNLCBuZXcgQXJyYXlMaXN0KCkpOwotCQkJCXByaW9yaXR5TWFwLnB1dChQUklPUklUWV9MT1csIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQl9Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgcHJpb3JpdHlNYXAuZ2V0KHByaW9yaXR5KTsKLQkJCWxpc3QuYWRkKGluZm8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3Igb2JqZWN0cyB0aGF0IGFwcGx5IHRvIHRoaXMKLQkgKiBwcm9qZWN0LiBUaGUgbGlzdCBpcyBpbiB0aGUgcHJpb3JpdHkgb3JkZXIgaGlnaCwgbWVkaXVtLCBsb3cuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgZm9yIHdoaWNoIHlvdSBhcmUgcmVxdWVzdGluZyByZXNvbHZlcnMuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yIG9iamVjdHMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9uRGVzY3JpcHRvcnMoSVByb2plY3QgcHJvamVjdCkKLQl7Ci0JICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIExpc3QgbG93UHJpb3JpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgTGlzdCBtZWRpdW1Qcmlvcml0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBMaXN0IGhpZ2hQcmlvcml0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAgIAotCSAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkgIHsKLQkgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOwotCSAgICB0cnkKLQkgICAgewotCSAgICAgIGlmIChrZXkgPT0gTlVMTF9QUk9KRUNUX05BVFVSRV9JRCB8fCBwcm9qZWN0ID09IG51bGwgfHwgcHJvamVjdC5oYXNOYXR1cmUoa2V5KSkKLQkgICAgICB7Ci0JICAgICAgICBoaWdoUHJpb3JpdHlMaXN0LmFkZEFsbCgoTGlzdCkgKChIYXNoTWFwKSBtYXAuZ2V0KGtleSkpLmdldChQUklPUklUWV9ISUdIKSk7Ci0JICAgICAgICBtZWRpdW1Qcmlvcml0eUxpc3QuYWRkQWxsKChMaXN0KSAoKEhhc2hNYXApIG1hcC5nZXQoa2V5KSkuZ2V0KFBSSU9SSVRZX01FRElVTSkpOwotCSAgICAgICAgbG93UHJpb3JpdHlMaXN0LmFkZEFsbCgoTGlzdCkgKChIYXNoTWFwKSBtYXAuZ2V0KGtleSkpLmdldChQUklPUklUWV9MT1cpKTsKLQkgICAgICB9Ci0JICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICB9Ci0JICB9Ci0JICByZXN1bHQuYWRkQWxsKGhpZ2hQcmlvcml0eUxpc3QpOwotCSAgcmVzdWx0LmFkZEFsbChtZWRpdW1Qcmlvcml0eUxpc3QpOwotCSAgcmVzdWx0LmFkZEFsbChsb3dQcmlvcml0eUxpc3QpOwotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIFVSSVJlc29sdmVyIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgc3RhZ2UuCi0JICogVE9ETzogVGhpcyBzZWVtcyBsaWtlIGFuIG9kZCBtZXRob2QgdG8gaG91c2UgaGVyZS4gSXQgbWF5IG5lZWQgdG8gYmUgbW92ZWQKLQkgKiAgICAgICBvciByZW1vdmVkIGlmIHRoZSBzdGFnZSBhdHRyaWJ1dGUgZGlzc2FwZWFycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZXJJbmZvTGlzdCBBIGxpc3Qgb2YgcmVzb2x2ZXJzIHRvIHBydW5lLgotCSAqIEBwYXJhbSBzdGFnZSBUaGUgc3RhZ2UgcmVxdWVzdGVkLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIFVSSVJlc29sdmVyIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgc3RhZ2UuCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMoTGlzdCByZXNvbHZlckluZm9MaXN0LCBpbnQgc3RhZ2UpCi0JewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZXJJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCVVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBpbmZvID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcikgaQotCQkJCQkubmV4dCgpOwotCQkJaWYgKGluZm8uc3RhZ2UgPT0gc3RhZ2UpCi0JCQl7Ci0JCQkJT2JqZWN0IHJlc29sdmVyID0gaW5mby5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJcmVzdWx0LmFkZChyZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzNmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiBwb2ludCBhbmQgcmVnaXN0ZXJzIGV4dGVuc2lvbgotICogcmVzb2x2ZXJzIHdpdGggdGhlIFVSSSByZXNvbHZlciByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJyZXNvbHZlckV4dGVuc2lvbnMiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicmVzb2x2ZXJFeHRlbnNpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFJPSkVDVF9OQVRVUkVfSUQgPSAicHJvamVjdE5hdHVyZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZVR5cGUiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TVEFHRSA9ICJzdGFnZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfU1RBR0VfUFJFID0gInByZW5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BPU1QgPSAicG9zdG5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BIWVNJQ0FMID0gInBoeXNpY2FsIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChVUklSZXNvbHZlclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkKLQkJewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0JICogCi0JICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbnRlbnRtb2RlbC51dGlsX2ltcGxlbWVudGF0aW9uIj4KLQkgKiA8dXRpbF9pbXBsZW1lbnRhdGlvbiBjbGFzcyA9Ci0JICogb3JnLmVjbGlwc2Uud3N0LmJhc2V1dGlsLkNNVXRpbEltcGxlbWVudGF0aW9uSW1wbCAvPiA8L2V4dGVuc2lvbj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQkvLyBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQkvLyBTdHJpbmcgcHJvamVjdE5hdHVyZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0pFQ1RfTkFUVVJFX0lEKTsKLQkJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0VfVFlQRSk7Ci0JCQlTdHJpbmcgc3RhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1RBR0UpOwotCQkJU3RyaW5nIHByaW9yaXR5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKTsKLQkJCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5LmVxdWFscygiIikpCi0JCQl7Ci0JCQkJcHJpb3JpdHkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlBSSU9SSVRZX01FRElVTTsKLQkJCX0KLQkJCUxpc3QgcHJvamVjdE5hdHVyZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGlkcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9QUk9KRUNUX05BVFVSRV9JRCk7Ci0JCQlpbnQgbnVtaWRzID0gaWRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtaWRzOyBpKyspCi0JCQl7Ci0JCQkJU3RyaW5nIHRlbXBpZCA9IGlkc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLQotCQkJCWlmICh0ZW1waWQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXByb2plY3ROYXR1cmVJZHMuYWRkKHRlbXBpZCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0KLQkJCQkJaW50IHN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTjsKLQkJCQkJaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BSRSkpCi0JCQkJCXsKLQkJCQkJCXN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QUkVOT1JNQUxJWkFUSU9OOwotCQkJCQl9IGVsc2UgaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BIWVNJQ0FMKSkKLQkJCQkJewotCQkJCQkJc3RhZ2VpbnQgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BIWVNJQ0FMOwotCQkJCQl9Ci0JCQkJCXJlZ2lzdHJ5LnB1dChjbGFzc05hbWUsIHBsdWdpbklkLCBwcm9qZWN0TmF0dXJlSWRzLCByZXNvdXJjZVR5cGUsCi0JCQkJCQkJc3RhZ2VpbnQsIHByaW9yaXR5KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IExvZyBleGNlcHRpb24gYXMgdGhpcyB3aWxsIGNhdXNlIGFuIGV4dGVuc2lvbiByZXNvbHZlcgotCQkJCQkvLyAgICAgICBmcm9tIGxvYWRpbmcuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYTRjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBBIFVSSVJlc29sdmVyIGlzIHVzZWQgdG8gcmVzb2x2ZSBVUkkgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHVyaSAKLQkgKiBAcGFyYW0gcHVibGljSWQgLSBhbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZQotCSAqIEBwYXJhbSBzeXN0ZW1JZCAtIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSSSwgb3IgbnVsbCBpZiBub25lIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgVVJJIHJlcHJlc2VudGlvbiB0aGUgJ2xvZ2ljYWwnIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpIAotICAgICAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0gICAgICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50aW9uIHRoZSAncGh5c2ljYWwnIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgbG9naWNhbExvY2F0aW9uKTsgICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ2MWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQW4gZXh0ZW5zaW9uIHRvIGF1Z21lbnQgdGhlIGJlaGF2aW91ciBvZiBhIFVSSVJlc29sdmVyLiAgRXh0ZW5zaW9ucyBhcmUgcHJvamVjdCBhd2FyZQotICogc28gdGhhdCB0aGV5IGNhbiBhcHBseSBzcGVjaWFsaXplZCBwcm9qZWN0IHNwZWNpZmljIHJlc29sdmluZyBydWxlcy4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCS8qKgotCSAqIEBwYXJhbSBmaWxlIHRoZSBpbi13b3Jrc3BhY2UgYmFzZSByZXNvdXJjZSwgaWYgb25lIGV4aXN0cwotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHVyaQotCSAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0JICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgb3IgbnVsbCBpZiB0aGlzIGV4dGVuc2lvbiBjYW4gbm90IHJlc29sdmUgdGhpcyByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2MzY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuRXh0ZW5zaWJsZVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByb3RlY3RlZCBzdGF0aWMgVVJJUmVzb2x2ZXJQbHVnaW4gaW5zdGFuY2U7CQotCXByb3RlY3RlZCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHhtbFJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyUGx1Z2luIGdldEluc3RhbmNlKCkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIFVSSVJlc29sdmVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQkKLQkKLQkJCQkJCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBjcmVhdGVSZXNvbHZlcigpCi0JewotCQlyZXR1cm4gY3JlYXRlUmVzb2x2ZXIobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgY3JlYXRlUmVzb2x2ZXIoTWFwIHByb3BlcnRpZXMpCi0JewotCQkvLyBUT0RPLi4uIHV0aWxpemUgcHJvcGVydGllcwotCQlyZXR1cm4gbmV3IEV4dGVuc2libGVVUklSZXNvbHZlcigpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzdjOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotCi0vKioKLSAqICBUaGlzIGNsYXNzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBqYXZhLmxhbmcuVVJMRW5jb2Rlci4KLSAqLwotcHVibGljIGNsYXNzIFVSSUVuY29kZXIgCi17Ci0gIHN0YXRpYyBCaXRTZXQgZG9udE5lZWRFbmNvZGluZzsKLSAgc3RhdGljIGZpbmFsIGludCBjYXNlRGlmZiA9ICgnYScgLSAnQScpOwotICBzdGF0aWMgU3RyaW5nIGRmbHRFbmNOYW1lID0gbnVsbDsKLSAgCi0KLSAgc3RhdGljIAotICB7ICAgICAgICAgICAgCi0JICBkb250TmVlZEVuY29kaW5nID0gbmV3IEJpdFNldCgyNTYpOwotCSAgaW50IGk7Ci0JICBmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0JICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0JICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0KLQkgIC8vZG9udE5lZWRFbmNvZGluZy5zZXQoJyAnKTsgLy8gY3MuLiByZW1vdmVkIHNvIHRoYXQgc3BhY2UgY2hhcmFjdGVyIHdpbGwgYmUgcmVwbGFjZWQgYnkgJTIwCi0JICBkb250TmVlZEVuY29kaW5nLnNldCgnLScpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJ18nKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcuJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnKicpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJzonKTsgICAvLyBjcy4uIGFkZGVkIAotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJy8nKTsgICAvLyBjcy4uIGFkZGVkIHNvIHRoYXQgc2xhc2hlcyBkb24ndCBnZXQgZW5jb2RlZCBhcyAlMkYKLQotICAJLy8gZGZsdEVuY05hbWUgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiZmlsZS5lbmNvZGluZyIpKTsKLSAgCS8vIEFzIGRpc2N1c3NlZCB3aXRoIFNhbmR5LCB3ZSBzaG91bGQgZW5jb2RlIFVSSXMgd2l0aCBVVEY4Ci0gICBkZmx0RW5jTmFtZSA9ICJVVEY4IjsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZGZsdEVuY05hbWUgIiArIGRmbHRFbmNOYW1lKTsKLSAgIH0KLQotICAvKioKLSAgICogWW91IGNhbid0IGNhbGwgdGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBVUklFbmNvZGVyKCkgeyB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbGF0ZXMgYSBzdHJpbmcgaW50byA8Y29kZT54LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+Ci0gICAqIGZvcm1hdC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGVuY29kaW5nCi0gICAqIGFzIHRoZSBlbmNvZGluZyBzY2hlbWUgdG8gb2J0YWluIHRoZSBieXRlcyBmb3IgdW5zYWZlIGNoYXJhY3RlcnMuCi0gICAqCi0gICAqIEBwYXJhbSAgIHMgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHRyYW5zbGF0ZWQuCi0gICAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgc3RyaW5nIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0ncwotICAgKiAgICAgICAgICAgICBkZWZhdWx0IGVuY29kaW5nLiBJbnN0ZWFkLCB1c2UgdGhlIGVuY29kZShTdHJpbmcsU3RyaW5nKQotICAgKiAgICAgICAgICAgICBtZXRob2QgdG8gc3BlY2lmeSB0aGUgZW5jb2RpbmcuCi0gICAqIEByZXR1cm4gIHRoZSB0cmFuc2xhdGVkIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIAotICB7Ci0JICBTdHJpbmcgc3RyID0gbnVsbDsKLQkgIHRyeSAKLSAgICB7Ci0JICAgIHN0ciA9IGVuY29kZShzLCBkZmx0RW5jTmFtZSk7Ci0JICB9IAotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIAotICAgIHsKLQkgICAgLy8gVGhlIHN5c3RlbSBzaG91bGQgYWx3YXlzIGhhdmUgdGhlIHBsYXRmb3JtIGRlZmF1bHQKLQkgIH0KLQkgIHJldHVybiBzdHI7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNsYXRlcyBhIHN0cmluZyBpbnRvIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4KLSAgICogZm9ybWF0IHVzaW5nIGEgc3BlY2lmaWMgZW5jb2Rpbmcgc2NoZW1lLiBUaGlzIG1ldGhvZCB1c2VzIHRoZQotICAgKiBzdXBwbGllZCBlbmNvZGluZyBzY2hlbWUgdG8gb2J0YWluIHRoZSBieXRlcyBmb3IgdW5zYWZlCi0gICAqIGNoYXJhY3RlcnMuCi0gICAqIDxwPgotICAgKiA8ZW0+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgPGEgaHJlZj0KLSAgICogImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MC9hcHBlbmRpeC9ub3Rlcy5odG1sI25vbi1hc2NpaS1jaGFycyI+Ci0gICAqIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gUmVjb21tZW5kYXRpb248L2E+IHN0YXRlcyB0aGF0Ci0gICAqIFVURi04IHNob3VsZCBiZSB1c2VkLiBOb3QgZG9pbmcgc28gbWF5IGludHJvZHVjZQotICAgKiBpbmNvbXBhdGliaWxpdGVzLjwvZW0+Ci0gICAqCi0gICAqIEBwYXJhbSAgIHMgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHRyYW5zbGF0ZWQuCi0gICAqIEBwYXJhbSAgIGVuYyAgIFRoZSBuYW1lIG9mIGEgc3VwcG9ydGVkIAotICAgKiAgICA8YSBocmVmPSIuLi9sYW5nL3BhY2thZ2Utc3VtbWFyeS5odG1sI2NoYXJlbmMiPmNoYXJhY3RlcgotICAgKiAgICBlbmNvZGluZzwvYT4uCi0gICAqIEByZXR1cm4gIHRoZSB0cmFuc2xhdGVkIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAqIEBleGNlcHRpb24gIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgdGhlIG5hbWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICogQHNlZSBqYXZhLm5ldC5VUkxEZWNvZGVyI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiAKLSAgewotCSAgYm9vbGVhbiBuZWVkVG9DaGFuZ2UgPSBmYWxzZTsKLQkgIGJvb2xlYW4gd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7IAotCSAgaW50IG1heEJ5dGVzUGVyQ2hhciA9IDEwOyAvLyByYXRoZXIgYXJiaXRyYXJ5IGxpbWl0LCBidXQgc2FmZSBmb3Igbm93Ci0gICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShtYXhCeXRlc1BlckNoYXIpOwotCSAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCBlbmMpKTsKLQotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIAotICAgIHsKLQkgICAgaW50IGMgPSBzLmNoYXJBdChpKTsKLQkgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4YW1pbmluZyBjaGFyYWN0ZXI6ICIgKyBjKTsKLQkgICAgaWYgKGRvbnROZWVkRW5jb2RpbmcuZ2V0KGMpKQotICAgICAgewotCQkgICAvL2lmIChjID09ICcgJykKLSAgICAgICAvL3sKLQkJICAgLy8gIGMgPSAnKyc7Ci0JCSAgIC8vICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotCQkgICAvL30KLQkJICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN0b3Jpbmc6ICIgKyBjKTsKLQkJICAgb3V0LmFwcGVuZCgoY2hhciljKTsKLQkJICAgd3JvdGVVbmVuY29kZWRDaGFyID0gdHJ1ZTsKLQkgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KLQkJICAgIHRyeQotICAgICAgICB7Ci0JCSAgICAgIGlmICh3cm90ZVVuZW5jb2RlZENoYXIpIAotICAgICAgICAgIHsgLy8gRml4IGZvciA0NDA3NjEwCi0JCSAgICAJICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotCQkJICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICAgICAgd3JpdGVyLndyaXRlKGMpOwotCQkgICAgICAgIAotCQkgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhIFVuaWNvZGUKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXIsIHRoZW4gcGFzcyBpbiB0d28gY2hhcmFjdGVycy4gSXQncyBub3QKLQkJICAgICAgLy8gY2xlYXIgd2hhdCBzaG91bGQgYmUgZG9uZSBpZiBhIGJ5dGVzIHJlc2VydmVkIGluIHRoZSAKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXJzIHJhbmdlIG9jY3VycyBvdXRzaWRlIG9mIGEgbGVnYWwKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXIuIEZvciBub3csIGp1c3QgdHJlYXQgaXQgYXMgaWYgaXQgd2VyZSAKLQkJICAgICAgLy8gYW55IG90aGVyIGNoYXJhY3Rlci4KLQkJICAgICAgLy8gCi0JCSAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikgCi0gICAgICAgICAgewotCQkJICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpICsgIiBpcyBoaWdoIHN1cnJvZ2F0ZSIpOwkJCSAgICAgIAotCQkJICAgICAgaWYgKCAoaSsxKSA8IHMubGVuZ3RoKCkpIAotICAgICAgICAgICAgewotCQkJICAgICAgICBpbnQgZCA9IHMuY2hhckF0KGkrMSk7Ci0JCQkgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRFeGFtaW5pbmcgIiArIEludGVnZXIudG9IZXhTdHJpbmcoZCkpOwkJCSAgICAgIAotCQkJICAgICAgICBpZiAoZCA+PSAweERDMDAgJiYgZCA8PSAweERGRkYpIAotICAgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIEludGVnZXIudG9IZXhTdHJpbmcoZCkgKyAiIGlzIGxvdyBzdXJyb2dhdGUiKTsJCQkJCi0JCQkJICAgICAgICB3cml0ZXIud3JpdGUoZCk7Ci0JCQkJICAgICAgICBpKys7Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgIH0KLQkJICAgICAgfQotCQkgICAgICB3cml0ZXIuZmx1c2goKTsKLQkJICAgIH0gCi0gICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpIAotICAgICAgICB7Ci0JCSAgICAgIGJ1Zi5yZXNldCgpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICAgIGJ5dGVbXSBiYSA9IGJ1Zi50b0J5dGVBcnJheSgpOwotCi0JCSAgICBmb3IgKGludCBqID0gMDsgaiA8IGJhLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotCQkgICAgICBvdXQuYXBwZW5kKCclJyk7Ci0JCSAgICAgIGNoYXIgY2ggPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGJhW2pdID4+IDQpICYgMHhGLCAxNik7Ci0JCSAgICAgIC8vIGNvbnZlcnRpbmcgdG8gdXNlIHVwcGVyY2FzZSBsZXR0ZXIgYXMgcGFydCBvZgotCQkgICAgICAvLyB0aGUgaGV4IHZhbHVlIGlmIGNoIGlzIGEgbGV0dGVyLgotCQkgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSkgCi0gICAgICAgICAgewotCQkJICAgICAgY2ggLT0gY2FzZURpZmY7Ci0JCSAgICAgIH0KLQkJICAgICAgb3V0LmFwcGVuZChjaCk7Ci0JCSAgICAgIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGJhW2pdICYgMHhGLCAxNik7Ci0JCSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBjaCAtPSBjYXNlRGlmZjsKLQkJICAgICAgfQotCQkgICAgICBvdXQuYXBwZW5kKGNoKTsKLQkJICAgIH0KLQkJICAgIGJ1Zi5yZXNldCgpOwotCQkgICAgbmVlZFRvQ2hhbmdlID0gdHJ1ZTsKLQkgICAgfQotCSAgfQotCSAgcmV0dXJuIChuZWVkVG9DaGFuZ2U/IG91dC50b1N0cmluZygpIDogcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Njc0MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIDIwMDcxMjA1ICAgMjExMjYyIGVyaWNkcEBjYS5pYm0uY29tIC0gRXJpYyBQZXRlcnMsIENvcHlXU0RMVHJlZUNvbW1hbmQgZmFpbHMgdG8gY29weSA/d3NkbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLQotcHVibGljIGNsYXNzIFVSSUhlbHBlcgoteyAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZToiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfUEFUVEVSTiA9ICI6IjsgCi0gIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5zdXJlVVJJUHJvdG9jb2xGb3JtYXQoU3RyaW5nIHVyaSkgewotCSAgU3RyaW5nIHByb3RvY29sID0gZ2V0UHJvdG9jb2wodXJpKTsKLQkgIGlmIChwcm90b2NvbCAhPSBudWxsKSB7Ci0JCSAgaWYgKHByb3RvY29sLmVxdWFscyhGSUxFX1BST1RPQ09MKSkgewotCQkJICByZXR1cm4gZW5zdXJlRmlsZVVSSVByb3RvY29sRm9ybWF0KHVyaSk7Ci0JCSAgfQotCSAgfQotCSByZXR1cm4gdXJpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHRha2VzIGEgZmlsZSBVUkkgaW4gU3RyaW5nIGZvcm1hdCBhbmQgZW5zdXJlcyB0aGUgcHJvdG9jb2wgaXMgZm9sbG93ZWQgYnkgdGhyZWUgc2xhc2hlcy4KLSAgICogRm9yIGV4YW1wbGUsIGZpbGVzICJmaWxlOkQ6L1hYWCIsICJmaWxlOi9EOi9YWFgiIGFuZCAiZmlsZTovL0Q6L1hYWCIgYXJlIGNvcnJlY3RlZCB0bzoKLSAgICogImZpbGU6Ly8vRDovWFhYIi4KLSAgICogSWYgdGhlIGlucHV0IGlzIG5vdCBhIGZpbGUgVVJJIChkb2VzIG5vdCBzdGFydCB3aXRoICJmaWxlOiIpLCB0aGUgU3RyaW5nIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbnN1cmVGaWxlVVJJUHJvdG9jb2xGb3JtYXQoU3RyaW5nIHVyaSkgewotICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpICYmICF1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MICsgIi8vLyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wgKyAiLy8iKSkgewotICAgICAgCQl1cmkgPSBGSUxFX1BST1RPQ09MICsgIi8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCX0gZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCArICIvIikpIHsKLSAgICAgIAkJdXJpID0gRklMRV9QUk9UT0NPTCArICIvLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAJfSBlbHNlIHsKLSAgICAgIAkJdXJpID0gRklMRV9QUk9UT0NPTCArICIvLy8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCX0KLSAgICAgIH0KLSAgICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IGdldFByb3RvY29sKHVyaSk7Ci0gICAgICBTdHJpbmcgZmlsZSA9IHVyaTsKLSAgICAgICAgICAgCi0gICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgICAKLSAgICAgICAgICAvLyAKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkpOyAKLSAgICAgICAgICAvLyB3ZSB1c2UgYSAnUGF0aCcgb24gdGhlICdmaWxlJyBwYXJ0IG9mIHRoZSB1cmwgaW4gb3JkZXIgdG8gbm9ybWFsaXplIHRoZSAnLicgYW5kICcuLicgc2VnbWVudHMKLSAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJsLmdldEZpbGUoKSk7IAotICAgICAgICAgIFVSTCB1cmwyID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgcGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICB1cmkgPSB1cmwyLnRvU3RyaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgeyAgCi0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUpOwotICAgICAgICB1cmkgPSBwYXRoLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1cmk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBhICdudWxsJyByb290TG9jYXRpb24gYXJndW1lbnQgd2lsbCBjYXVzZXMgdXJpIHRoYXQgYmVnaW5zIHdpdGggYSAnLycgdG8gYmUgdHJlYXRlZCBhcyBhIHdvcmtzcGFjZSByZWxhdGl2ZSByZXNvdXJjZQotICAgKiAoaS5lLiB0aGUgc3RyaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UiIGlzIHByZXBlbmRlZCBhbmQgdGhlIHVyaSBpcyByZXNvbHZlZCB2aWEgdGhlIFBsYXRmb3JtIG9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHJvb3RMb2NhdGlvbikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBpcyB0aGUgdXJpIGEgdXJsCi0gICAgICBpZiAoaGFzUHJvdG9jb2wodXJpKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSByZXNvbHZlUGxhdGZvcm1VcmwodXJpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB1cmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgIAotICAgICAgLy8gaXMgdXJpIGFic29sdXRlCi0gICAgICAvLwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICBpZiAodXJpLmluZGV4T2YoIjoiKSAhPSAtMSB8fCB1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJlc3VsdCA9IHVyaTsKLSAgICAgICAgfQotICAgICAgfQotICAKLSAgICAgIC8vIGlmIHVyaSBpcyByZWxhdGl2ZSB0byB0aGUgcmVzb3VyY2VMb2NhdGlvbgotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiByZXNvdXJjZUxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICBpZiAocmVzb3VyY2VMb2NhdGlvbi5lbmRzV2l0aCgiLyIpKQotICAgICAgICB7Ci0JCQkgICAgcmVzdWx0ID0gcmVzb3VyY2VMb2NhdGlvbiArIHVyaTsKLSAgICAgICAgfQotCQkgICAgZWxzZQotICAgICAgICB7Ci0JCQkgICAgcmVzdWx0ID0gcmVzb3VyY2VMb2NhdGlvbiArICIvLi4vIiArIHVyaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHVyaTsKLSAgICAgIH0KLSAgCi0gICAgICByZXN1bHQgPSBub3JtYWxpemUocmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibm9ybWFsaXplKCIgKyB1cmkgKyAiLCAiICsgcmVzb3VyY2VMb2NhdGlvbiArICIsICIgKyByb290TG9jYXRpb24gKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VSTChTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHVyaS5pbmRleE9mKCI6LyIpID4gMjsgLy8gdGVzdCB0aGF0IHRoZSBpbmRleCBpcyA+IDIgc28gdGhhdCBDOi8gaXMgbm90IGNvbnNpZGVyZWQgYSBwcm90b2NvbAotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYXN0U2VnbWVudChTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHVyaTsKLSAgICBpbnQgaW5kZXggPSBNYXRoLm1heCh1cmkubGFzdEluZGV4T2YoIi8iKSwgdXJpLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgZG90SW5kZXggPSBnZXRFeHRlbnNpb25Eb3RJbmRleCh1cmkpOwotICAgICAgICAgICAgICAgCi0gICAgaWYgKGRvdEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGaWxlRXh0ZW5zaW9uKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgZG90SW5kZXggPSBnZXRFeHRlbnNpb25Eb3RJbmRleCh1cmkpOwotCi0gICAgaWYgKGRvdEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLSAgICAgICAgICAgICAKLQotICAvLyBoZXJlIHdlIHVzZSB0aGUgUGxhdGZvcm0gdG8gcmVzb2x2ZSBhIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIHRvIGFuIGFjdHVhbCB1cmwKLSAgLy8KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVBsYXRmb3JtVXJsKFN0cmluZyB1cmxzcGVjKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdXJsc3BlYyA9IHVybHNwZWMucmVwbGFjZSgnXFwnLCAnLycpOyAKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybHNwZWMpOwotICAgICAgVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotICAgICAgcmVzdWx0ID0gcmVzb2x2ZWRVUkwudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0RXh0ZW5zaW9uRG90SW5kZXgoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCByZXN1bHQgPSAtMTsKLSAgICBpbnQgZG90SW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsKLSAgICBpbnQgc2xhc2hJbmRleCA9IE1hdGgubWF4KHVyaS5sYXN0SW5kZXhPZigiLyIpLCB1cmkubGFzdEluZGV4T2YoIlxcIikpOwotCi0gICAgaWYgKGRvdEluZGV4ICE9IC0xICYmIGRvdEluZGV4ID4gc2xhc2hJbmRleCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkb3RJbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICh1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCkpCi0gICAgewotICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdXJpOwotICB9ICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICh1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpKQotICAgIHsKLSAgICAgIHVyaSA9IFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MICsgdXJpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfSAKLSAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlcGVuZEZpbGVQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpKQotICAgIHsKLSAgICAgIHVyaSA9IEZJTEVfUFJPVE9DT0wgKyB1cmk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdXJpOwotICB9IAotICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihQUk9UT0NPTF9QQVRURVJOKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQgdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhIHByb3RvY29sCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ICE9IC0xIHx8IHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEltcGxpZWRGaWxlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKCFoYXNQcm90b2NvbCh1cmkpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcmVmaXggPSBGSUxFX1BST1RPQ09MOwotICAgICAgcHJlZml4ICs9IHVyaS5zdGFydHNXaXRoKCIvIikgPyAiLy8iIDogIi8vLyI7Ci0gICAgICB1cmkgPSBwcmVmaXggKyB1cmk7Ci0gICAgfQotICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgICAgICAgICAgICAKLSAgLy8gdG9kby4uLiBuZWVkIHRvIHJldmlzaXQgdGhpcyBiZWZvcmUgd2UgcHVibGljaXplIGl0Ci0gIC8vIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihQUk9UT0NPTF9QQVRURVJOKTsKLSAgICAgIGlmIChpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQgdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhIHByb3RvY29sCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXggKyBQUk9UT0NPTF9QQVRURVJOLmxlbmd0aCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHVyaTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihQUk9UT0NPTF9QQVRURVJOKTsKLSAgICAgIGlmIChpbmRleCA+IDIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoaW5kZXggKyBQUk9UT0NPTF9QQVRURVJOLmxlbmd0aCgpKTsgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUHJvdG9jb2xGaWxlT3JOdWxsKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmkpOyAgIAotICAgIHJldHVybiBwcm90b2NvbCA9PSBudWxsIHx8IHByb3RvY29sLmVxdWFscyhGSUxFX1BST1RPQ09MKTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvdG9jb2xGaWxlKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgIHJldHVybiB1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKTsKLSAgfSAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdQcm90b2NvbChTdHJpbmcgdXJpMSwgU3RyaW5nIHVyaTIpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgIAotCi0gICAgU3RyaW5nIHByb3RvY29sMSA9IGdldFByb3RvY29sKHVyaTEpOwotICAgIFN0cmluZyBwcm90b2NvbDIgPSBnZXRQcm90b2NvbCh1cmkyKTsKLQotICAgIGlmIChpc1Byb3RvY29sRmlsZU9yTnVsbChwcm90b2NvbDEpICYmIGlzUHJvdG9jb2xGaWxlT3JOdWxsKHByb3RvY29sMikpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gcHJvdG9jb2wxICE9IG51bGwgJiYgcHJvdG9jb2wyICE9IG51bGwgJiYgcHJvdG9jb2wxLmVxdWFscyhwcm90b2NvbDIpOwotICAgIH0gICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIHdhcm5pbmcuLi4gdGhpcyBtZXRob2Qgbm90IGZ1bGx5IHRlc3RlZCB5ZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlVVJJKFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgCi0gICAgaWYgKGlzTWF0Y2hpbmdQcm90b2NvbCh1cmksIHJlc291cmNlTG9jYXRpb24pKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRSZWxhdGl2ZVVSSShuZXcgUGF0aChyZW1vdmVQcm90b2NvbCh1cmkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKHJlbW92ZVByb3RvY29sKHJlc291cmNlTG9jYXRpb24pKSk7Ci0gICAgfSAgICAgICAgICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiB3YXJuaW5nLi4uIHRoaXMgbWV0aG9kIG5vdCBmdWxseSB0ZXN0ZWQgeWV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVVSSShJUGF0aCB1cmksIElQYXRoIHJlc291cmNlTG9jYXRpb24pCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgbk1hdGNoaW5nU2VnbWVudHMgPSAwOyAgICAgICAKLSAgICByZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbi5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBhID0gdXJpLnNlZ21lbnQobk1hdGNoaW5nU2VnbWVudHMpOyAKLSAgICAgIFN0cmluZyBiID0gcmVzb3VyY2VMb2NhdGlvbi5zZWdtZW50KG5NYXRjaGluZ1NlZ21lbnRzKTsgCi0gICAgICBpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSkKLSAgICAgIHsKLSAgICAgICAgbk1hdGNoaW5nU2VnbWVudHMrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0KLSAgICBpZiAobk1hdGNoaW5nU2VnbWVudHMgPT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkudG9PU1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9ICIiOyAgIAotICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gcmVzb3VyY2VMb2NhdGlvbi5zZWdtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IG5NYXRjaGluZ1NlZ21lbnRzOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ICs9IGlzRmlyc3QgPyAiLi4iIDogIi8uLiI7ICAgICAKLSAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgLy8gCi0gICAgICBzZWdtZW50cyA9IHVyaS5zZWdtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IG5NYXRjaGluZ1NlZ21lbnRzOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgKz0gaXNGaXJzdCA/IHNlZ21lbnRzW2ldIDogKCIvIiArIHNlZ21lbnRzW2ldKTsgICAgIAotICAgICAgICBpZiAoaXNGaXJzdCkKLSAgICAgICAgewotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1VUkkoSVJlc291cmNlIHJlc291cmNlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBmdWxsUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICBpZiAoZnVsbFBhdGguc3RhcnRzV2l0aCgiLyIpKQotICAgIHsKLSAgICAgIGZ1bGxQYXRoID0gZnVsbFBhdGguc3Vic3RyaW5nKDEpOwotICAgIH0KLSAgICByZXR1cm4gUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgKyBmdWxsUGF0aDsKLSAgfQotICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2RzIGlzIHVzZWQgYXMgYSBxdWljayB0ZXN0IHRvIHNlZSBpZiBhIHVyaSBjYW4gYmUgcmVzb2x2ZWQgdG8gYW4gZXhpc3RpbmcgcmVzb3VyY2UuICAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkYWJsZVVSSShTdHJpbmcgdXJpLCBib29sZWFuIHRlc3RSZW1vdGVVUkkpCi0gIHsgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICB0cnkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHVyaSA9IG5vcm1hbGl6ZSh1cmksIG51bGwsIG51bGwpOwotICAgICAgICBpZiAoaXNQcm90b2NvbEZpbGVPck51bGwodXJpKSkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9IHJlbW92ZVByb3RvY29sKHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJLmRlY29kZSh1cmkpKTsKLSAgICAgICAgICByZXN1bHQgPSBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaXNQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIE5vdGUgLSBJZiB3ZSBhcmUgaGVyZSwgdXJpIGhhcyBiZWVuIGZhaWxlZCB0byByZXNvbHZlCi0gICAgICAgICAgLy8gcmVsYXRpdmUgdG8gdGhlIFBsYXRmb3JtLiBTZWUgbm9ybWFsaXplKCkgdG8gZmluZCB3aHkuCi0gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVzdFJlbW90ZVVSSSkKLSAgICAgICAgewotICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgLy8gdGhlIHVyaSBpcyByZWFkYWJsZSBpZiB3ZSByZWFjaCBoZXJlLgotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy8gdXJpIGlzIG51bGwKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLyoqCi0gICAqIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCB1cmkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgdHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB7Ci0gICAgICBuZXcgVVJJKHVyaSk7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIHJldHVybnMgYW4gYWNjZXB0YWJsZSBVUkkgZm9yIGEgZmlsZSBwYXRoCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZVBhdGgpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gYWRkSW1wbGllZEZpbGVQcm90b2NvbChmaWxlUGF0aCk7Ci0gICAgaWYgKCFpc1ZhbGlkVVJJKHJlc3VsdCkpCi0gICAgewotICAgIAl0cnkKLSAgICAJewotICAgICAgICByZXN1bHQgPSBVUklFbmNvZGVyLmVuY29kZShyZXN1bHQsICJVVEY4Iik7Ci0gICAgCX0KLSAgICAJY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCQkvLyBEbyBub3RoaW5nIGFzIGxvbmcgYXMgVVRGOCBpcyB1c2VkLiBUaGlzIGlzIHN1cHBvcnRlZC4KLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE1MzAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotY2FjaGUuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE4OGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkMWEwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jV2VkIE1hciAxNSAxNzoyNzozMyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDI0YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBNYXIgMTUgMTc6Mjc6MzMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlMjdiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJV9QTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkNGY2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGV4c2QvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2V4c2QvY2FjaGVyZXNvdXJjZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDBkZDExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2V4c2QvY2FjaGVyZXNvdXJjZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIiBpZD0iY2FjaGVyZXNvdXJjZSIgbmFtZT0iQ2FjaGUgUmVzb3VyY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVwcmVjYXRlZC4gTm8gbG9uZ2VyIHVzZWQgaW4gV1RQLCBhbmQgd2lsbCBiZSByZW1vdmVkLiAKLQotVGhlIGNhY2hlIHJlc291cmNlIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBzcGVjaWZ5IHJlc291cmNlcyB0aGF0IG1heSBiZSBjYWNoZWQgdGhhdCByZXF1aXJlIGxpY2Vuc2VzIHRvIGJlIGFjY2VwdGVkIHByaW9yIHRvIGNhY2hpbmcuCi0KLURlcHJlY2F0ZWQuIE5vIGxvbmdlciB1c2VkIGluIFdUUCwgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhY2hlcmVzb3VyY2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhY2hlcmVzb3VyY2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gY2FjaGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGljZW5zZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbGljZW5zZSBvZiB0aGUgcmVzb3VyY2UgdG8gY2FjaGUuIFRoZSBsaWNlbnNlIGlzIHNwZWNpZmllZCBhcyBhIFVSTCB0aGF0IHJlc29sdmVzIHRvIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBsaWNlbnNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY2FjaGUgcmVzb3VyY2UgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5jYWNoZXJlc291cmNlJnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhY2hlcmVzb3VyY2UKLSAgICAgICAgICAgIGxpY2Vuc2U9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlLmh0bWwmcXVvdDsKLSAgICAgICAgICAgIHVybD0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY3MmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fUExVR0lOX1BST1ZJREVSICAgICAgICAgICAgICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi1fUExVR0lOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hlIFVSSSBSZXNvbHZlciBQbHVnLWluCi0KLWNhY2hlUmVzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGUgUmVzb3VyY2UKLV9VSV9DQUNIRV9QUkVGRVJFTkNFX1BBR0VfVElUTEUgICAgICAgID0gQ2FjaGUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2FlZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVjYWNoZVJlc291cmNlIiBpZD0iY2FjaGVyZXNvdXJjZSIgc2NoZW1hPSJleHNkL2NhY2hlcmVzb3VyY2UuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlX1VJX0NBQ0hFX1BSRUZFUkVOQ0VfUEFHRV9USVRMRSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ2FjaGVQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ2FjaGVQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5uZXQuTmV0UHJlZmVyZW5jZXMiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPC9pbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyI+Ci0gICAgICA8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSJwaHlzaWNhbCIKLSAgICAgICAgICAgIHByaW9yaXR5PSJsb3ciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24iPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWY0MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGUgY2FjaGUgaG9sZHMgcmVmZXJlbmNlcyB0byByZW1vdGUgcmVzb3VyY2VzLiBUaGUgY2FjaGUgY2FuIHN0b3JlIHJlc291cmNlcywKLSAqIHJldHJpZXZlIHJlc291cmNlcywgYW5kIGRlbGV0ZSByZXNvdXJjZXMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGUgCi17Ci0gIC8qKgotICAgKiBTdHJpbmcgaW5zdGFuY2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJ1cmkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSJsb2NhdGlvbiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWSA9ICJlbnRyeSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRSA9ICJjYWNoZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX01PRElGSUVEID0gImxhc3RNb2RpZmllZCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBJUkFUSU9OX1RJTUUgPSAiZXhwaXJhdGlvblRpbWUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9GSUxFID0gImNhY2hlLnhtbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9FWFRFTlNJT04gPSAiLmNhY2hlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1BSRUZJWCA9ICJ3dHBjYWNoZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVUZGSVggPSBudWxsOwotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdGltZW91dCBmb3IgYSBjYWNoZSBlbnRyeSBpcyAxIGRheS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVCA9IDg2NDAwMDAwOwotCQotICAvKioKLSAgICogVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgY2FjaGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBDYWNoZSBjYWNoZUluc3RhbmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBUaGUgY2FjaGUgaXMgc3RvcmVkIGluIGEgaGFzaHRhYmxlLgotICAgKi8KLSAgcHJpdmF0ZSBIYXNodGFibGUgY2FjaGU7Ci0gIAotICAvKioKLSAgICogQSBzZXQgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLiBUaGUgY2FjaGUgd2FzIG5vdCBhYmxlIHRvIGNhY2hlIHJlc291cmNlcwotICAgKiBpbiB0aGlzIGxpc3QuIFRoaXMgbGlzdCBhbGxvd3MgcXVpY2tseSBza2lwcGluZyBvdmVyIHRoZXNlIHJlc291cmNlcyBpbgotICAgKiBmdXR1cmUgcmVxdWVzdHMuIAotICAgKi8KLSAgcHJpdmF0ZSBTZXQgdW5jYWNoZWQ7Ci0gIAotICAvKioKLSAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjYWNoZQotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGNhY2hlTG9jYXRpb24gPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFByaXZhdGUgY29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2FjaGUoSVBhdGggY2FjaGVMb2NhdGlvbikKLSAgewotCSAgdGhpcy5jYWNoZUxvY2F0aW9uID0gY2FjaGVMb2NhdGlvbi50b0ZpbGUoKTsvL1BsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpKS50b0ZpbGUoKTsKLSAgICBjYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB1bmNhY2hlZCA9IG5ldyBIYXNoU2V0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgY2FjaGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDYWNoZSBnZXRJbnN0YW5jZSgpCi0gIHsKLS8vCSAgaWYoY2FjaGVJbnN0YW5jZSA9PSBudWxsKQotLy8JICB7Ci0vLwkJICBjYWNoZUluc3RhbmNlID0gbmV3IENhY2hlKGNhY2hlTG9jYXRpb24pOwotLy8JCSAgY2FjaGVJbnN0YW5jZS5vcGVuKGNhY2hlTG9jYXRpb24pOwotLy8JICB9Ci0JICByZXR1cm4gY2FjaGVJbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbG9jYWwgcmVzb3VyY2UgZm9yIHRoZSBzcGVjaWZpZWQgdXJpLiBJZiB0aGVyZSBpcyBubyByZXNvdXJjZQotICAgKiB0aGUgY2FjaGUgd2lsbCBhdHRlbXB0IHRvIGRvd25sb2FkIGFuZCBjYWNoZSB0aGUgcmVzb3VyY2UgYmVmb3JlIHJldHVybmluZy4KLSAgICogSWYgYSByZW1vdGUgcmVzb3VyY2UgY2Fubm90IGJlIGNhY2hlZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGZvciB3aGljaCBhIHJlc291cmNlIGlzIHJlcXVlc3RlZC4KLSAgICogQHJldHVybiBUaGUgbG9jYWwgcmVzb3VyY2UgZm9yIHRoZSBzcGVjaWZpZWQgVVJJIG9yIG51bGwgaWYgYSByZW1vdGUgcmVzb3VyY2UgY2Fubm90IGJlIGNhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoU3RyaW5nIHVyaSkKLSAgewotCSAgaWYodXJpID09IG51bGwpIHJldHVybiBudWxsOwotCSAgQ2FjaGVFbnRyeSByZXN1bHQgPSAoQ2FjaGVFbnRyeSljYWNoZS5nZXQodXJpKTsKLQkgIAotCSAgLy8gSWYgbm8gcmVzdWx0IGlzIGluIHRoZSBjYWNoZSBhbmQgdGhlIFVSSSBpcyBvZiBhbiBhbGxvd2VkIHR5cGUKLQkgIC8vIHJldHJpZXZlIGl0IGFuZCBzdG9yZSBpdCBpbiB0aGUgY2FjaGUuCi0JICBpZihyZXN1bHQgPT0gbnVsbCkKLQkgIHsKLSAgICAgIAotICAgICAgICBpZighdW5jYWNoZWQuY29udGFpbnModXJpKSkKLQkgICAgewotICAgICAgICAgIHJlc3VsdCA9IGNhY2hlUmVzb3VyY2UodXJpKTsgCi0gICAgICAgIH0KLQkgIH0KLQkgIC8vIFJldHJlaXZlIGEgZnJlc2ggY29weSBvZiB0aGUgcmVzdWx0IGlmIGl0IGhhcyB0aW1lZCBvdXQuCi0JICBlbHNlIGlmKHJlc3VsdC5oYXNFeHBpcmVkKCkpCi0JICB7Ci0JCXJlc3VsdCA9IHJlZnJlc2hDYWNoZUVudHJ5KHJlc3VsdCk7Ci0JICB9Ci0JICBpZihyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuZ2V0TG9jYWxGaWxlKCkgPT0gbnVsbCkKLQkgIHsKLQkJcmV0dXJuIG51bGw7Ci0JICB9Ci0JICByZXR1cm4gRklMRV9QUk9UT0NPTCArIGNhY2hlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIHJlc3VsdC5nZXRMb2NhbEZpbGUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRVbmNhY2hlZFVSSXMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSl1bmNhY2hlZC50b0FycmF5KG5ldyBTdHJpbmdbdW5jYWNoZWQuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbGVhciB0aGUgbGlzdCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjbGVhclVuY2FjaGVkVVJJcygpCi0gIHsKLSAgICB1bmNhY2hlZC5jbGVhcigpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGFuIHVuY2FjaGVkIHJlc291cmNlIHRvIHRoZSBsaXN0IGFuZCBzdGFydCB0aGUgCi0gICAqIHVuY2FjaGVkIGpvYiBpZiBub3QgYWxyZWFkeSBzdGFydGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVW5jYWNoZWRVUkkoU3RyaW5nIHVyaSkKLSAgewotCUNhY2hlSm9iLnN0YXJ0Sm9iKCk7Ci0gICAgdW5jYWNoZWQuYWRkKHVyaSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYWNoZSB0aGUgc3BlY2lmaWVkIHJlc291cmNlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUKLSAgICogcmVtb3RlIHJlc291cmNlIGFuZCBhZGRzIHRoZSByZXNvdXJjZSByZWZlcmVuY2UgdG8gdGhlIGNhY2hlLiBJZiB0aGUgcmVzb3VyY2UKLSAgICogY2Fubm90IGJlIGFjY2Vzc2VkIGl0IGlzIG5vdCBhZGRlZCBhbmQgbnVsbCBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlbW90ZSBVUkkgdG8gY2FjaGUuCi0gICAqIEByZXR1cm4gQSBuZXcgQ2FjaGVFbnRyeSByZXByZXNlbnRpbmcgdGhlIGNhY2hlZCByZXNvdXJjZSBvciBudWxsIGlmIHRoZSByZW1vdGUKLSAgICogICAgICAgICByZXNvdXJjZSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIENhY2hlRW50cnkgY2FjaGVSZXNvdXJjZShTdHJpbmcgdXJpKQotICB7Ci0JICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSBudWxsOwotCSAgVVJMQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLQkgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JICB0cnkKLQkgIHsKLQkJICBVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJICBjb25uLmNvbm5lY3QoKTsKLQkJICAvLyBEZXRlcm1pbmUgaWYgdGhpcyByZXNvdXJjZSBjYW4gYmUgY2FjaGVkLgotCQkgIGlmKGNvbm4uZ2V0VXNlQ2FjaGVzKCkpCi0JCSAgewotCQkgICAgaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ly91cmwub3BlblN0cmVhbSgpOwotCQkgIAotCQkgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSByYW5kLm5leHRJbnQoKSArIENBQ0hFX0VYVEVOU0lPTjsKLQkJICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNhY2hlTG9jYXRpb24sIGZpbGVOYW1lKTsKLQkJICAgIC8vIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUuCi0JCSAgICB3aGlsZSghZmlsZS5jcmVhdGVOZXdGaWxlKCkpCi0JCSAgICB7Ci0JCQkgIGZpbGVOYW1lID0gcmFuZC5uZXh0SW50KCkgKyBDQUNIRV9FWFRFTlNJT047Ci0JCQkgIGZpbGUgPSBuZXcgRmlsZShjYWNoZUxvY2F0aW9uLGZpbGVOYW1lKTsKLQkJICAgIH0KLQkJICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJICAgIGludCBieXRlbGVuZ3RoOwotCQkgICAgd2hpbGUoKGJ5dGVsZW5ndGggPSBpcy5yZWFkKGJ5dGVzKSkgIT0gLTEpCi0JCSAgICB7Ci0JCQkgIG9zLndyaXRlKGJ5dGVzLCAwLCBieXRlbGVuZ3RoKTsKLQkJICAgIH0KLQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gY29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJICAgIGxvbmcgZXhwaXJhdGlvbiA9IGNvbm4uZ2V0RXhwaXJhdGlvbigpOwotCQkJaWYoZXhwaXJhdGlvbiA9PSAwKQotCQkJewotCQkJICBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOwotCQkJfQotCQkgICAgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KHVyaSwgZmlsZU5hbWUsIGxhc3RNb2RpZmllZCwgZXhwaXJhdGlvbik7Ci0JCSAgICBjYWNoZS5wdXQodXJpLGNhY2hlRW50cnkpOwotCQkgIH0KLQotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIHQpCi0JICB7Ci0JCSAgLy8gUHV0IHRoZSBlbnRyeSBpbiB0aGUgdW5jYWNoZWQgbGlzdCBzbyB0aGUgcmVzb2x1dGlvbiB3b3JrIHdpbGwgbm90IGJlIHBlcmZvcm1lZCBhZ2Fpbi4KLSAgICAgIC8vIFRPRE86IEFkZCBpbiBhIHRpbWVvdXQgZm9yIHRoZSBub24tbG9jYXRlZCB1cmlzLgotICAgICAgYWRkVW5jYWNoZWRVUkkodXJpKTsKLQkgIH0KLQkgIGZpbmFsbHkKLQkgIHsKLQkJICBpZihpcyAhPSBudWxsKQotCQkgIHsKLQkJCSAgdHJ5Ci0JCQkgIHsKLQkJCSAgICBpcy5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCSAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIGNsb3NlZC4KLQkJCSAgfQotCQkgIH0KLQkJICBpZihvcyAhPSBudWxsKQotCQkgIHsKLQkJCSAgdHJ5Ci0JCQkgIHsKLQkJCSAgICBvcy5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCQkvLyBEbyBub3RoaW5nIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIGNsb3NlZC4gCi0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICByZXR1cm4gY2FjaGVFbnRyeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlZnJlc2ggdGhlIGNhY2hlIGVudHJ5IGlmIG5lY2Vzc2FyeS4gVGhlIGNhY2hlIGVudHJ5IHdpbGwgYmUgcmVmcmVzaGVkCi0gICAqIGlmIHRoZSByZW1vdGUgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZSBhbmQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUKLSAgICogcmVtb3RlIHJlc291cmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBjYWNoZWQKLSAgICogcmVzb3VyY2UuCi0gICAqIAotICAgKiBAcGFyYW0gY2FjaGVFbnRyeSBUaGUgY2FjaGUgZW50cnkgdG8gcmVmcmVzaC4KLSAgICogQHJldHVybiBUaGUgcmVmcmVzaGVkIGNhY2hlIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIENhY2hlRW50cnkgcmVmcmVzaENhY2hlRW50cnkoQ2FjaGVFbnRyeSBjYWNoZUVudHJ5KQotICB7Ci0JICBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotCSAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCSAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkgIHRyeQotCSAgewotCQkgIFVSTCB1cmwgPSBuZXcgVVJMKGNhY2hlRW50cnkuZ2V0VVJJKCkpOwotCQkgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJICBjb25uLmNvbm5lY3QoKTsKLQkJICAKLQkJICBsb25nIGxhc3RNb2RpZmllZCA9IGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JICAgICAgaWYobGFzdE1vZGlmaWVkID4gY2FjaGVFbnRyeS5nZXRMYXN0TW9kaWZpZWQoKSkKLQkJICB7Ci0JCQlsb25nIGV4cGlyYXRpb24gPSBjb25uLmdldEV4cGlyYXRpb24oKTsKLQkJICAgIGlmKGV4cGlyYXRpb24gPT0gMCkKLQkJCXsKLQkJCSAgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKLQkJCX0KLQkJCQotCQkgICAgaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkKLQkJCVN0cmluZyBsb2NhbEZpbGUgPSBjYWNoZUVudHJ5LmdldExvY2FsRmlsZSgpOwotICAKLQkJICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKENBQ0hFX1BSRUZJWCwgQ0FDSEVfU1VGRklYKTsKLQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCi0JCSAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkJICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMjRdOwotCQkgICAgaW50IGJ5dGVsZW5ndGg7Ci0JCSAgICB3aGlsZSgoYnl0ZWxlbmd0aCA9IGlzLnJlYWQoYnl0ZXMpKSAhPSAtMSkKLQkJICAgIHsKLQkJCSAgb3Mud3JpdGUoYnl0ZXMsIDAsIGJ5dGVsZW5ndGgpOwotCQkgICAgfQotCQkJaXMuY2xvc2UoKTsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlkZWxldGVGaWxlKGNhY2hlRW50cnkuZ2V0VVJJKCkpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUoY2FjaGVMb2NhdGlvbiwgbG9jYWxGaWxlKTsKLQkJCXRlbXBGaWxlLnJlbmFtZVRvKGYpOwotCQkJY2FjaGVFbnRyeS5zZXRFeHBpcmF0aW9uKGV4cGlyYXRpb24pOwotCQkJY2FjaGVFbnRyeS5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKLQkJICB9Ci0JCSAgLy8gVGhlIGNhY2hlIGVudHJ5IGhhc24ndCBjaGFuZ2VkLiBKdXN0IHVwZGF0ZSB0aGUgZXhwaXJhdGlvbiB0aW1lLgotCSAgICAgIGVsc2UKLQkJICB7Ci0JCQlsb25nIGV4cGlyYXRpb24gPSBjb25uLmdldEV4cGlyYXRpb24oKTsKLQkJCWlmKGV4cGlyYXRpb24gPT0gMCkKLQkJCXsKLQkJCSAgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKLQkJCX0KLQkJCWNhY2hlRW50cnkuc2V0RXhwaXJhdGlvbihleHBpcmF0aW9uKTsKLQkJICB9Ci0KLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotICAgICAgLy8gRG8gbm90aGluZy4KLQkgIH0KLQkgIGZpbmFsbHkKLQkgIHsKLQkJICBpZihpcyAhPSBudWxsKQotCQkgIHsKLQkJCSAgdHJ5Ci0JCQkgIHsKLQkJCSAgICBpcy5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCSAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIGNsb3NlZC4KLQkJCSAgfQotCQkgIH0KLQkJICBpZihvcyAhPSBudWxsKQotCQkgIHsKLQkJCSAgdHJ5Ci0JCQkgIHsKLQkJCSAgICBvcy5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCQkvLyBEbyBub3RoaW5nIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIGNsb3NlZC4gCi0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICByZXR1cm4gY2FjaGVFbnRyeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgY2FjaGVkIFVSSXMuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHRoZSBjYWNoZWQgVVJJcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRDYWNoZWRVUklzKCkKLSAgewotCVNldCBrZXlzZXQgPSBjYWNoZS5rZXlTZXQoKTsKLQlyZXR1cm4gKFN0cmluZ1tdKWtleXNldC50b0FycmF5KG5ldyBTdHJpbmdba2V5c2V0LnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogQ2xvc2UgdGhlIGNhY2hlLiBDbG9zaW5nIHRoZSBjYWNoZSBpbnZvbHZlcyBzZXJpYWxpemluZyB0aGUgZGF0YSB0byBhbiBYTUwgZmlsZQotICAgKiBpbiB0aGUgcGx1Z2luIHN0YXRlIGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKQotICB7Ci0JICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB0cnkgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGNhY2hlZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCQlFbGVtZW50IHJvb3RlbGVtID0gY2FjaGVkb2MuY3JlYXRlRWxlbWVudChDQUNIRSk7Ci0JCWNhY2hlZG9jLmFwcGVuZENoaWxkKHJvb3RlbGVtKTsKLQkJCi0JICBFbnVtZXJhdGlvbiB1cmlzID0gY2FjaGUua2V5cygpOwotCSAgd2hpbGUodXJpcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkgIHsKLQkJICBTdHJpbmcga2V5ID0gKFN0cmluZyl1cmlzLm5leHRFbGVtZW50KCk7Ci0JCSAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gKENhY2hlRW50cnkpY2FjaGUuZ2V0KGtleSk7Ci0JCSAgaWYoY2FjaGVFbnRyeSAhPSBudWxsKQotCQkgIHsKLQkJCSAgRWxlbWVudCBlbnRyeSA9IGNhY2hlZG9jLmNyZWF0ZUVsZW1lbnQoRU5UUlkpOwotCQkJICBlbnRyeS5zZXRBdHRyaWJ1dGUoVVJJLCBrZXkpOwotCQkJICBlbnRyeS5zZXRBdHRyaWJ1dGUoTE9DQVRJT04sIGNhY2hlRW50cnkuZ2V0TG9jYWxGaWxlKCkpOwotCQkJICBlbnRyeS5zZXRBdHRyaWJ1dGUoRVhQSVJBVElPTl9USU1FLCBTdHJpbmcudmFsdWVPZihjYWNoZUVudHJ5LmdldEV4cGlyYXRpb25UaW1lKCkpKTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKExBU1RfTU9ESUZJRUQsIFN0cmluZy52YWx1ZU9mKGNhY2hlRW50cnkuZ2V0TGFzdE1vZGlmaWVkKCkpKTsKLQkJCSAgcm9vdGVsZW0uYXBwZW5kQ2hpbGQoZW50cnkpOwotCQkgIH0KLQkgIH0KLQkgIAotCSAgLy8gV3JpdGUgdGhlIGNhY2hlIGVudHJ5LgotCSAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ICA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgU291cmNlIGlucHV0ID0gbmV3IERPTVNvdXJjZShjYWNoZWRvYyk7Ci0JICBJUGF0aCBzdGF0ZUxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpOwotICAgICAgUmVzdWx0IG91dHB1dCA9IG5ldyBTdHJlYW1SZXN1bHQoc3RhdGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgQ0FDSEVfRklMRSk7Ci0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oaW5wdXQsIG91dHB1dCk7Ci0KLSAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBzdG9yZSBpbnRlcm5ldCBjYWNoZS4iKTsKLQkgIH0KLQkgIGNhY2hlSW5zdGFuY2UgPSBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogT3BlbiB0aGUgY2FjaGUuIE9wZW5pbmcgdGhlIGNhY2hlIGludm9sdmVzIHBhcnNpbmcgdGhlIGNhY2hlIFhNTCBmaWxlIGluCi0gICAqIHRoZSBwbHVnaW4gc3RhdGUgbG9jYXRpb24gaWYgaXQgY2FuIGJlIHJlYWQuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgb3BlbihJUGF0aCBjYWNoZUxvY2F0aW9uKQotICB7Ci0gICAgY2FjaGVJbnN0YW5jZSA9IG5ldyBDYWNoZShjYWNoZUxvY2F0aW9uKTsKLQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIHRyeSB7Ci0JCSAgCi0JCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBjYWNoZUxvY2F0aW9uOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGNhY2hlZG9jID0gYnVpbGRlci5wYXJzZShzdGF0ZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBDQUNIRV9GSUxFKTsKLQkJRWxlbWVudCByb290ZWxlbSA9IGNhY2hlZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBlbnRyaWVzID0gcm9vdGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbnVtRW50cmllcyA9IGVudHJpZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspCi0JCXsKLQkJCU5vZGUgZW50cnkgPSBlbnRyaWVzLml0ZW0oaSk7Ci0JCQlpZihlbnRyeSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQl7Ci0JCQkJRWxlbWVudCBlID0gKEVsZW1lbnQpZW50cnk7Ci0JCQkJaWYoZS5nZXROb2RlTmFtZSgpLmVxdWFscyhFTlRSWSkpCi0JCQkJewotCQkJCQlTdHJpbmcgdXJpID0gZS5nZXRBdHRyaWJ1dGUoVVJJKTsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gZS5nZXRBdHRyaWJ1dGUoTE9DQVRJT04pOwotCQkJCQlTdHJpbmcgbG0gPSBlLmdldEF0dHJpYnV0ZShMQVNUX01PRElGSUVEKTsKLQkJCQkJU3RyaW5nIGV0ID0gZS5nZXRBdHRyaWJ1dGUoRVhQSVJBVElPTl9USU1FKTsKLQkJCQkJbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKLQkJCQkJbG9uZyBleHBpcmF0aW9uVGltZSA9IC0xOwotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJbGFzdE1vZGlmaWVkID0gTG9uZy5wYXJzZUxvbmcobG0pOwotCQkJCQl9Ci0JCQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJZXhwaXJhdGlvblRpbWUgPSBMb25nLnBhcnNlTG9uZyhldCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLQkJCQkJewotCQkJCQl9Ci0JCQkJCWlmKHVyaSAhPSBudWxsICYmIGxvY2F0aW9uICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJICBjYWNoZUluc3RhbmNlLmNhY2hlLnB1dCh1cmksIG5ldyBDYWNoZUVudHJ5KHVyaSwgbG9jYXRpb24sIGxhc3RNb2RpZmllZCwgZXhwaXJhdGlvblRpbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgfQotCSAgY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0JICB7Ci0JCS8vIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24gdGhlcmUgaXMgbm90aGluZyB0byBsb2FkLiBEbyBub3RoaW5nLgotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9hZCBjYWNoZS4iKTsKLQkgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIENsZWFyIGFsbCBvZiB0aGUgZW50cmllcyBmcm9tIHRoZSBjYWNoZS4gVGhpcyBtZXRob2QgYWxzbyBkZWxldGVzIHRoZSBjYWNoZSBmaWxlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgewotCUVudW1lcmF0aW9uIGtleXMgPSBjYWNoZS5rZXlzKCk7Ci0Jd2hpbGUoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLQl7Ci0JICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0JICAKLQkgIGRlbGV0ZUZpbGUoa2V5KTsKLQl9Ci0JY2FjaGUuY2xlYXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIERlbGV0ZSB0aGUgY2FjaGUgZW50cnkgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBVUkkuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBlbnRyeSB0byByZW1vdmUgZnJvbSB0aGUgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlbGV0ZUVudHJ5KFN0cmluZyB1cmkpCi0gIHsKLQkgIGlmKHVyaSA9PSBudWxsKSByZXR1cm47Ci0JICAKLQkgIGRlbGV0ZUZpbGUodXJpKTsKLQkgIGNhY2hlLnJlbW92ZSh1cmkpOwotICB9Ci0gIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHVyaSkKLSAgewotCSAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gKENhY2hlRW50cnkpY2FjaGUuZ2V0KHVyaSk7Ci0JICBpZihjYWNoZUVudHJ5ICE9IG51bGwpCi0JICB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGNhY2hlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGNhY2hlRW50cnkuZ2V0TG9jYWxGaWxlKCk7Ci0JICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkgICAgaWYoIWZpbGUuZGVsZXRlKCkpCi0JICAgIHsKLQkgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBkZWxldGUgZmlsZSAiICsgbG9jYXRpb24gKyAiIGZyb20gY2FjaGUuIik7Ci0JICAgIH0gCi0JICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdlYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLS8qKgotICogQSBjYWNoZSBlbnRyeSBjb250YWlucyBhIFVSSSwgYSBsb2NhbCBmaWxlLCBhbmQgYSB0aW1lb3V0LgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFbnRyeSAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICBwcml2YXRlIFN0cmluZyBsb2NhbEZpbGU7Ci0gIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0gIHByaXZhdGUgbG9uZyBleHBpcmF0aW9uVGltZTsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgY2FjaGUgZW50cnkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSByZW1vdGUgVVJJIG9mIHRoZSBjYWNoZSBlbnRyeS4KLSAgICogQHBhcmFtIGxvY2FsRmlsZSBUaGUgbG9jYWwgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjYWNoZWQgZW50cnkuCi0gICAqIEBwYXJhbSBsYXN0TW9kaWZpZSBUaGUgdGltZSB0aGlzIHJlc291cmNlIHdhcyBsYXN0IG1vZGlmaWVkLgotICAgKiBAcGFyYW0gZXhwaXJhdGlvblRpbWUgVGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZS4KLSAgICovCi0gIHB1YmxpYyBDYWNoZUVudHJ5KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbEZpbGUsIGxvbmcgbGFzdE1vZGlmaWVkLCBsb25nIGV4cGlyYXRpb25UaW1lKQotICB7Ci0JdGhpcy51cmkgPSB1cmk7Ci0JdGhpcy5sb2NhbEZpbGUgPSBsb2NhbEZpbGU7Ci0JdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7Ci0JdGhpcy5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWQgaWYgaXRzIGV4cGlyYXRpb24gdGltZSBpcyBsZXNzIHRoZW4gdGhlCi0gICAqIGN1cnJlbnQgc3lzdGVtIHRpbWUgYW5kIG5vdCBlcXVhbCB0byAtMS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGNhY2hlZCBlbnRyeSBoYXMgZXhwaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXhwaXJlZCgpCi0gIHsKLQkgaWYoZXhwaXJhdGlvblRpbWUgIT0gLTEgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPiBleHBpcmF0aW9uVGltZSkKLQkgewotCSAgIHJldHVybiB0cnVlOwotCSB9Ci0JIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IHRoaXMgY2FjaGUgZW50cnkgd2lsbCBleHBpcmUuCi0gICAqIAotICAgKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IHRoaXMgY2FjaGUgZW50cnkgd2lsbCBleHBpcmUuCi0gICAqICAgICAgICAgICAgICAgIC0xIGluZGljYXRlcyB0aGF0IHRoaXMgZW50cnkgd2lsbCBub3QgZXhwaXJlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvbihsb25nIGV4cGlyYXRpb25UaW1lKQotICB7Ci0JdGhpcy5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgY2FjaGUgZW50cnkgd2lsbCBleHBpcmUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgY2FjaGUgZW50cnkgd2lsbCBleHBpcmUuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRFeHBpcmF0aW9uVGltZSgpCi0gIHsKLQlyZXR1cm4gZXhwaXJhdGlvblRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlbW90ZSBVUkkgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSByZW1vdGUgVVJJIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0JcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbG9jYWwgZmlsZSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxvY2FsIGZpbGUgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsRmlsZSgpCi0gIHsKLQlyZXR1cm4gbG9jYWxGaWxlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsYXN0IHRpbWUgdGhpcyBjYWNoZSBlbnRyeSB3YXMgbW9kaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsYXN0IHRpbWUgdGhpcyBjYWNoZSBlbnRyeSB3YXMgbW9kaWZpZWQuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKQotICB7Ci0JcmV0dXJuIGxhc3RNb2RpZmllZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbGFzdCB0aW1lIHRoaXMgY2FjaGUgZW50cnkgd2FzIG1vZGlmaWVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKQotICB7Ci0JdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjMzk0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci0KLS8qKgotICogQSBjYWNoZSBqb2IgcnVucyBvbmNlIGFuIGhvdXIgdG8gY2FjaGUgYW55IHByZXNwZWNpZmllZCByZXNvdXJjZXMgd2hpY2gKLSAqIHNob3VsZCBiZSBjYWNoZWQgYW5kIGFueSByZXNvdXJjZXMgZm9yIHdoaWNoIGFuIGF0dGVtcHQgd2FzIHByZXZpb3VzbHkgCi0gKiBtYWRlIHRvIGNhY2hlIHRoZW0gYnV0IHRoZXkgd2VyZSB1bmFibGUgdG8gYmUgY2FjaGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVKb2IgZXh0ZW5kcyBKb2IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQ0hFRFVMRV9USU1FID0gMzYwMDAwMDsKLQotICBwcml2YXRlIHN0YXRpYyBDYWNoZUpvYiBqb2IgPSBudWxsOwotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVKb2IoKQotICB7Ci0gICAgc3VwZXIoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfTU9OSVRPUl9OQU1FKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0JYm9vbGVhbiBhbGxTdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICBDYWNoZSBjYWNoZSA9IENhY2hlLmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gdW5jYWNoZWRVUklzID0gY2FjaGUuZ2V0VW5jYWNoZWRVUklzKCk7Ci0gICAgaW50IG51bVVuY2FjaGVkVVJJcyA9IHVuY2FjaGVkVVJJcy5sZW5ndGg7Ci0KLSAgICBjYWNoZS5jbGVhclVuY2FjaGVkVVJJcygpOwotICAgIG1vbml0b3IuYmVnaW5UYXNrKENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX01PTklUT1JfTkFNRSwgbnVtVW5jYWNoZWRVUklzKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtVW5jYWNoZWRVUklzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvcihpbnQgaiA9IGk7IGogPCBudW1VbmNhY2hlZFVSSXM7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYWNoZS5hZGRVbmNhY2hlZFVSSSh1bmNhY2hlZFVSSXNbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHVyaSA9IHVuY2FjaGVkVVJJc1tpXTsKLSAgICAgICAgbW9uaXRvci5zZXRUYXNrTmFtZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9NT05JVE9SX0NBQ0hJTkcsIG5ldyBPYmplY3RbXXt1cml9KSk7Ci0gICAgICAgCi0gICAgICAgIFN0cmluZyBjYWNoZWRVUkkgPSBjYWNoZS5nZXRSZXNvdXJjZSh1cmkpOwotICAgICAgICBpZihjYWNoZWRVUkkgPT0gbnVsbCkKLSAgICAJewotICAgIAkgIGFsbFN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICAJfQotICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgIH0KLSAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfSAKLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgLy8gSWYgYWxsIHRoZSB1bmNhY2hlZCBVUklzIGNvdWxkIG5vdCBiZSBjYWNoZWQgCi0gICAgICAvLyBzY2hlZHVsZSB0aGUgbmV4dCB0aW1lIHRoZSBqb2Igc2hvdWxkIHJ1bi4KLSAgICAgIGlmKCFhbGxTdWNjZXNzZnVsKQotICAgICAgewotICAgIAkgIHN0YXJ0Sm9iKFNDSEVEVUxFX1RJTUUpOyAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTdGFydCB0aGUgY2FjaGUgam9iLiBUaGUgY2FjaGUgam9iIGNhY2hlcyByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBhYmxlIHRvIGJlIHByZXZpb3VzbHkKLSAgICogZG93bmxvYWRlZC4gT25seSBvbmUgam9iIGlzIHJ1biBhdCBhIHRpbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3RhcnRKb2IoKSAKLSAgewotCWlmKGpvYiA9PSBudWxsKQotCXsKLQkgIHN0YXJ0Sm9iKDApOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIFN0YXJ0IGEgbmV3IGNhY2hlIGpvYiB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsYXkuCi0gICAqIAotICAgKiBAcGFyYW0gZGVsYXkKLSAgICogCQlUaGUgc3RhcnQgZGVsYXkgZm9yIHRoZSBjYWNoZSBqb2IuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0Sm9iKGxvbmcgZGVsYXkpCi0gIHsKLQlqb2IgPSBuZXcgQ2FjaGVKb2IoKTsKLQlqb2Iuc2V0UHJpb3JpdHkoQ2FjaGVKb2IuREVDT1JBVEUpOwotCWpvYi5zY2hlZHVsZShkZWxheSk7IC8vIHN0YXJ0IGFzIHNvb24gYXMgcG9zc2libGUKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoZSBjdXJyZW50IGNhY2hlIGpvYi4gVGhlIGNhY2hlIGpvYiBjYWNoZXMgcmVzb3VyY2VzIHRoYXQgd2VyZSBub3QgYWJsZSB0byBiZSBwcmV2aW91c2x5Ci0gICAqIGRvd25sb2FkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3RvcEpvYigpIAotICB7Ci0JaWYgKGpvYiAhPSBudWxsKSAKLQl7Ci0JICBqb2IuY2FuY2VsKCk7Ci0JfQotCWpvYiA9IG51bGw7Ci0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmVlMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IHRoZSBjYWNoZS4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0NMRUFSX0NBQ0hFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fREVMRVRFX0VOVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX0NBQ0hFX0VOVFJJRVNfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfQ0FDSEVfQ0FDSEVfT1BUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX0NBQ0hFX0FCT1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX1BST01QVF9GT1JfRElTQUdSRUVEX0xJQ0VOU0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9NT05JVE9SX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX01PTklUT1JfQ0FDSElORzsKLQotCS8vIENhY2hlIGxpY2Vuc2UgZGlhbG9nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fSU5URVJOQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fQlJPV1NFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0FHUkVFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0RJU0FHUkVFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MT0FESU5HX0xJQ0VOU0U7Ci0KLQkvLyBDYWNoZSBsb2dnaW5nIG1lc3NhZ2VzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0xPR19JTkZPX1dUUF9OT19VU0VSX0lOVEVSQUNUSU9OOwotCi0JLy8gV1RQIHRlc3Qgbm8gdXNlciBpbnRlcmFjdGlvbiBzeXN0ZW0gcHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUDsgICAKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDYWNoZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRmMGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiAKLXsKLSAgLyoqCi0gICAqIFRoZSBJRCBvZiB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiOwotCi0gIC8qKgotICAgKiBUaGUgc2hhcmVkIGluc3RhbmNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQ2FjaGVQbHVnaW4gcGx1Z2luOwotCi0gIC8qKgotICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVQbHVnaW4oKSAKLSAgewotCXN1cGVyKCk7Ci0JcGx1Z2luID0gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQlzdXBlci5zdGFydChjb250ZXh0KTsKLQlUb0NhY2hlUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5yZWFkUmVnaXN0cnkoKTsKLQlDYWNoZS5vcGVuKFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oZ2V0QnVuZGxlKCkpKTsKLQlpZiAoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5jb250YWlucyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKSAKLQl7Ci0JICBzZXRDYWNoZUVuYWJsZWQoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpOwotCX0gCi0JZWxzZSAKLQl7Ci0JICAvLyBUaGUgY2FjaGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLQkgIHNldENhY2hlRW5hYmxlZChmYWxzZSk7Ci0JfQotCQotCS8vIFJlc3RvcmUgbGljZW5zZSBwcmVmZXJlbmNlcwotCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQlMaWNlbnNlUmVnaXN0cnkgcmVnaXN0cnkgPSBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmdbXSBsaWNlbnNlcyA9IHJlZ2lzdHJ5LmdldExpY2Vuc2VzKCk7Ci0JaW50IG51bUxpY2Vuc2VzID0gbGljZW5zZXMubGVuZ3RoOwotCWZvcihpbnQgaSA9IDA7IGkgPCBudW1MaWNlbnNlczsgaSsrKQotCXsKLQkgIGludCBzdGF0ZSA9IHByZWZzLmdldEludChsaWNlbnNlc1tpXSk7Ci0JICBpZihzdGF0ZSA9PSBMaWNlbnNlUmVnaXN0cnkuTElDRU5TRV9BR1JFRS5pbnRWYWx1ZSgpKQotCSAgewotCQlyZWdpc3RyeS5hZ3JlZUxpY2Vuc2UobGljZW5zZXNbaV0pOwotCSAgfQotCSAgZWxzZSBpZihzdGF0ZSA9PSBMaWNlbnNlUmVnaXN0cnkuTElDRU5TRV9ESVNBR1JFRS5pbnRWYWx1ZSgpKQotCSAgewotCQlyZWdpc3RyeS5kaXNhZ3JlZUxpY2Vuc2UobGljZW5zZXNbaV0pOwotCSAgfQotCX0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0JLy8gU2F2ZSB0aGUgbGljZW5zZSBzdGF0ZSBpbmZvcm1hdGlvbi4KLQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JTGljZW5zZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nW10gbGljZW5zZXMgPSByZWdpc3RyeS5nZXRMaWNlbnNlcygpOwotCWludCBudW1MaWNlbnNlcyA9IGxpY2Vuc2VzLmxlbmd0aDsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtTGljZW5zZXM7IGkrKykKLQl7Ci0JICBJbnRlZ2VyIHN0YXRlID0gcmVnaXN0cnkuZ2V0TGljZW5zZVN0YXRlKGxpY2Vuc2VzW2ldKTsKLSAgICAgIC8vIEZvciBzdGF0ZXMgdGhhdCBoYXZlIGJlZW4gZGlzYWdyZWVkIHRvIHRoaXMgc2Vzc2lvbiBzdG9yZQotCSAgLy8gdGhlbSBhcyBkaXNhZ3JlZS4KLQkgIGlmKHN0YXRlID09IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTikKLQkgIHsKLQkJc3RhdGUgPSBMaWNlbnNlUmVnaXN0cnkuTElDRU5TRV9ESVNBR1JFRTsKLQkgIH0KLQkgIHByZWZzLnNldFZhbHVlKGxpY2Vuc2VzW2ldLCBzdGF0ZS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbG9zZSgpOwotCUNhY2hlSm9iLnN0b3BKb2IoKTsKLQlzdXBlci5zdG9wKGNvbnRleHQpOwotCXBsdWdpbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2hhcmVkIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDYWNoZVBsdWdpbiBnZXREZWZhdWx0KCkgCi0gIHsKLQlyZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0aGUgY2FjaGUgaXMgZW5hYmxlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbmFibGVkIElmIHRydWUgdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGlmIGZhbHNlIGl0IGlzIG5vdCBlbmFibGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2FjaGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgCi0gIHsKLQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCwgZW5hYmxlZCk7Ci0JQ2FjaGVKb2Iuc3RvcEpvYigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlRW5hYmxlZCgpIAotICB7Ci0JaWYgKGdldFBsdWdpblByZWZlcmVuY2VzKCkuY29udGFpbnMoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSkKLQkgIHJldHVybiBnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgZm9yIGxpY2Vuc2VzIHRvIHdoaWNoIHRoZXkgCi0gICAqIGhhdmUgcHJldmlvdXNseSBkaXNhZ3JlZWQuCi0gICAqIAotICAgKiBAcGFyYW0gcHJvbXB0IElmIHRydWUgdGhlIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCwgaWYgZmFsc2UgdGhlIHVzZXIgc2hvdWxkIG5vdCBiZSBwcm9tcHRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb21wdERpc2FncmVlZExpY2Vuc2VzKGJvb2xlYW4gcHJvbXB0KSAKLSAgewotCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTLCBwcm9tcHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGZvciBsaWNlbnNlcyB0byB3aGljaCB0aGV5Ci0gICAqIGhhdmUgcHJldmlvdXNseSBkaXNhZ3JlZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFByb21wdCgpIAotICB7Ci0JaWYgKGdldFBsdWdpblByZWZlcmVuY2VzKCkuY29udGFpbnMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTKSkKLQkgIHJldHVybiBnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM4ODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDYWNoZSBwcmVmZXJlbmNlIHBhZ2Ugc3RyaW5ncy4KLV9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19USVRMRSAgICAgICAgICAgICA9IFJlbW92ZSBBbGw/Ci1fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfTUVTU0FHRSAgICAgICAgICAgPSBSZW1vdmUgYWxsIGNhY2hlIGVudHJpZXM/Ci1fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX1RJVExFICAgICAgPSBSZW1vdmUgRW50cmllcz8KLV9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfTUVTU0FHRSAgICA9IFJlbW92ZSBhbGwgc2VsZWN0ZWQgY2FjaGUgZW50cmllcz8KLV9VSV9CVVRUT05fQ0xFQVJfQ0FDSEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlbW92ZSAmQWxsCi1fVUlfQlVUVE9OX0RFTEVURV9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1fVUlfUFJFRl9DQUNIRV9FTlRSSUVTX1RJVExFICAgICAgICAgICAgICAgICAgICAgPSAmQ2FjaGUgZW50cmllczoKLV9VSV9QUkVGX0NBQ0hFX0NBQ0hFX09QVElPTiAgICAgICAgICAgICAgICAgICAgICA9ICZEaXNhYmxlIGNhY2hpbmcKLV9VSV9QUkVGX0NBQ0hFX0FCT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE1hbmFnZSB0aGUgY2FjaGUgb2YgcmVtb3RlIHJlc291cmNlcywgc3VjaCBhcyB0aG9zZSBkb3dubG9hZGVkIGZyb20gdGhlIGludGVybmV0LgotX1VJX1BSRUZfUFJPTVBUX0ZPUl9ESVNBR1JFRURfTElDRU5TRVMgICAgICAgICAgID0gJlByb21wdCBtZSBmb3IgYWdyZWVtZW50IGZvciBsaWNlbnNlcyBmb3Igd2hvc2UgdGVybXMgSSBoYXZlIGFscmVhZHkgZGlzYWdyZWVkCi0KLSMgQ2FjaGUgbW9uaXRvciBzdHJpbmdzLgotX1VJX0NBQ0hFX01PTklUT1JfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGluZyBSZW1vdGUgUmVzb3VyY2VzCi1fVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoaW5nIHswfQotCi0jIENhY2hlIGxpY2Vuc2UgZGlhbG9nCi1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMSAgICAgICAgICAgICAgPSBBIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSB0byBjYWNoZSB0aGUgcmVzb3VyY2U6Ci1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMiAgICAgICAgICAgICAgPSBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2UgYmVsb3c6Ci1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTCAgPSBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2Ugd2hpY2ggaGFzIGJlZW4gb3BlbmVkIGluIHlvdXIgYnJvd3Nlci4KLV9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0JST1dTRVIgICA9IFRoZSBsaWNlbnNlIGNhbm5vdCBiZSBkaXNwbGF5ZWQgaW4gdGhpcyBkaWFsb2cuIEluIG9yZGVyIHRvIGNhY2hlIHRoZSByZXNvdXJjZSB5b3UgbXVzdCBhZ3JlZSB0byB0aGUgbGljZW5zZSBsb2NhdGVkIGF0IHswfS4KLV9VSV9DQUNIRV9ESUFMT0dfQUdSRUVfQlVUVE9OICAgICAgICAgICAgICAgICAgICA9IEkgQWdyZWUKLV9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OICAgICAgICAgICAgICAgICA9IEkgRGlzYWdyZWUKLV9VSV9DQUNIRV9ESUFMT0dfVElUTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExpY2Vuc2UgQWdyZWVtZW50Ci1fVUlfTE9BRElOR19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMb2FkaW5nIGxpY2Vuc2UKLQotIyBDYWNoZSBsb2dnaW5nIG1lc3NhZ2VzCi1fTE9HX0lORk9fV1RQX05PX1VTRVJfSU5URVJBQ1RJT04gICAgICAgICAgICAgICAgPSB7MH0gaXMgc2V0LiBMaWNlbnNlcyBkaWFsb2dzIHdpbGwgbm90IGJlIGRpc3BsYXllZC4KLQotIyBXVFAgdGVzdCBubyB1c2VyIGludGVyYWN0aW9uIHN5c3RlbSBwcm9wZXJ0eQotIyBUaGlzIHByb3BlcnR5IGlzIGNoZWNrZWQgYnkgdGhlIGNhY2hlLiBUaGlzIHN0aW5nIGlzIG5vdCBzaG93biB0byB0aGUgdXNlci4KLVdUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QICAgICAgICAgICAgICA9IHd0cC5hdXRvdGVzdC5ub25pbnRlcmFjdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTE4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotCi0vKioKLSAqIEEgY2FjaGUgVVJJIHJlc29sdmVyLiBUaGlzIHJlc29sdmVyIHdpbGwgY2FjaGUgcmVtb3RlIHJlc291cmNlcyBhbmQgcmV0dXJuCi0gKiB0aGUgbG9jYWwgY29weSBpZiB0aGV5IGNhbiBiZSBjYWNoZWQuIElmIGEgcmVzb3VyY2UgY2Fubm90IGJlIGNhY2hlZCB0aGUKLSAqIHJlc291cmNlIHJldHVybnMgbnVsbC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbiAKLXsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb24jcmVzb2x2ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JeyAKLSAgICAgIGlmKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5pc0NhY2hlRW5hYmxlZCgpKQotICAgICAgewotCQkgIFN0cmluZyByZXNvdXJjZSA9IG51bGw7Ci0JCSAgaWYoc3lzdGVtSWQgIT0gbnVsbCkKLQkJICB7Ci0JCSAgICByZXNvdXJjZSA9IFVSSUhlbHBlci5ub3JtYWxpemUoc3lzdGVtSWQsIGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCSAgfSAKLQkJICAKLQkJICBpZihyZXNvdXJjZSAhPSBudWxsICYmIChyZXNvdXJjZS5zdGFydHNXaXRoKCJodHRwOiIpIHx8IHJlc291cmNlLnN0YXJ0c1dpdGgoImZ0cDoiKSkpCi0JCSAgewotCQkgICAgLy8gSGFuZGxlIHJlc291cmNlcyBwcmVzcGVjaWZpZWQgdG8gY2FjaGUuCi0JCSAgICBUb0NhY2hlUmVzb3VyY2UgdG9DYWNoZVJlc291cmNlID0gVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VUb0NhY2hlKHJlc291cmNlKTsKLQkJICAgIGlmKHRvQ2FjaGVSZXNvdXJjZSA9PSBudWxsIHx8IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmhhc0xpY2Vuc2VCZWVuQWNjZXB0ZWQocmVzb3VyY2UsIHRvQ2FjaGVSZXNvdXJjZS5nZXRMaWNlbnNlKCkpKQotCQkgICAgeyAJCi0JCSAgICAgIHJldHVybiBDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJICAgIH0KLQkJICB9Ci0gICAgICB9Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmMzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBkaWFsb2cgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGFjY2VwdCBhIGxpY2Vuc2UgYWdyZWVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyAKLXsKLSAgLyoqCi0gICAqIEhvbGRzIGFsbCB0aGUgZGlhbG9ncyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGtleWVkIGJ5IHRoZSBsaWNlbnNlIFVSTC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBkaWFsb2dzSW5Vc2UgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KLSAgLyoqCi0gICAqIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsaWNlbnNlVVJMOwotICAKLSAgLyoqCi0gICAqIFRoZSBhZ3JlZSBidXR0b24gZm9yIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcml2YXRlIEJ1dHRvbiBhZ3JlZUJ1dHRvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyBkaWFsb2cuCi0gICAqIEBwYXJhbSB1cmwgVGhlIGxpY2Vuc2UgVVJMLgotICAgKi8KLSAgcHJvdGVjdGVkIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2VVUkwpIAotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmxpY2Vuc2VVUkwgPSBsaWNlbnNlVVJMOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIAotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX1RJVExFKTsKLSAgICBzaGVsbC5zZXRJbWFnZShudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLQlDb21wb3NpdGUgYnV0dG9uQmFyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAwOwotCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCWJ1dHRvbkJhci5zZXRMYXlvdXQobGF5b3V0KTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JYnV0dG9uQmFyLnNldExheW91dERhdGEoZ2QpOwotCQotCS8vIENyZWF0ZSB0aGUgYWdyZWUgYnV0dG9uLgotCWFncmVlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkJhciwgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuT0ssIAotCQkJQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0FHUkVFX0JVVFRPTiwgZmFsc2UpOwotCWFncmVlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQotCS8vIENyZWF0ZSB0aGUgZGlzYWdyZWUgYnV0dG9uLgotCWNyZWF0ZUJ1dHRvbihidXR0b25CYXIsIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLkNBTkNFTCwgCi0JCQlDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OLCBmYWxzZSk7Ci0JCi0JcmV0dXJuIGJ1dHRvbkJhcjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMKTsKLQlnZC53aWR0aEhpbnQgPSA1MDA7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JLy8gRGlzcGxheSBhIHN0YXRlbWVudCBhYm91dCB0aGUgbGljZW5zZS4KLQlMYWJlbCBsaWNlbnNlVGV4dDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGljZW5zZVRleHQxLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMSk7Ci0JTGFiZWwgdXJsVGV4dCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpOwotCXVybFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0JbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOyAvLyBTcGFjaW5nIGxhYmVsLgotCUxhYmVsIGxpY2Vuc2VUZXh0MiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpOwotCWxpY2Vuc2VUZXh0Mi5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkvLyBEaXNwbGF5IHRoZSBsaWNlbnNlIGluIGEgYnJvd3Nlci4KLQl0cnkKLQl7Ci0JICBmaW5hbCBDb21wb3NpdGUgbGljZW5zZVRleHRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCSAgZmluYWwgU3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLnNldExheW91dChzdGFja0xheW91dCk7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCSAgZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCSAgLy8gQ3JlYXRlIHRoZSBsb2FkaW5nIHByb2dyZXNzIG1vbml0b3IgY29tcG9zaXRlIGFuZCBwYXJ0LgotCSAgQ29tcG9zaXRlIG1vbml0b3JDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpY2Vuc2VUZXh0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JICBtb25pdG9yQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICBnZC5oZWlnaHRIaW50ID0gNDAwOwotCSAgbW9uaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIGZpbmFsIFByb2dyZXNzTW9uaXRvclBhcnQgbW9uaXRvciA9IG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KG1vbml0b3JDb21wb3NpdGUsIG5ldyBHcmlkTGF5b3V0KCkpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CT1RUT00sIHRydWUsIHRydWUpOwotCSAgbW9uaXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIG1vbml0b3IuYmVnaW5UYXNrKENhY2hlTWVzc2FnZXMuX1VJX0xPQURJTkdfTElDRU5TRSwgMTAwKTsKLQkgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBtb25pdG9yQ29tcG9zaXRlOwotCSAgLy8gQ3JlYXRlIHRoZSBicm93c2VyLgotCSAgZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIobGljZW5zZVRleHRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgIC8vZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIAotCSAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbGljZW5zZSBVUkwgaXMgc2V0IGV2ZW4gaWYgd2UgcmVhZCAKLQkgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgbGljZW5zZSBmaWxlIG91cnNlbHZlcyAoc2VlIGJlbG93KSBhcwotCSAgLy8gb3RoZXJ3aXNlIHRoZSBwcm9ncmVzcyBtb25pdG9yIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBjZXJ0YWluCi0JICAvLyBsaW51eCBzeXN0ZW1zIHdpdGggY2VydGFpbiBicm93c2Vycy4KLQkgIGJyb3dzZXIuc2V0VXJsKGxpY2Vuc2VVUkwpOwotCSAgCi0JICAvLyBUaGUgYnJvd3NlciB3aWRnZXQgaGFzIHByb2JsZW1zIGxvYWRpbmcgZmlsZXMgc3RvcmVkIGluIGphcnMKLQkgIC8vIHNvIHdlIHJlYWQgZnJvbSB0aGUgamFyIGFuZCBzZXQgdGhlIGJyb3dzZXIgdGV4dCBvdXJzZWx2ZXMuCi0JICAvLyBTZWUgYnVnIDE1NDcyMS4KLQkgIGlmKGxpY2Vuc2VVUkwuc3RhcnRzV2l0aCgiamFyOiIpKQotCSAgewotCQkgIElucHV0U3RyZWFtIGxpY2Vuc2VTdHJlYW0gPSBudWxsOwotCQkgIElucHV0U3RyZWFtUmVhZGVyIGlzcmVhZGVyID0gbnVsbDsKLQkJICBCdWZmZXJlZFJlYWRlciBicmVhZGVyID0gbnVsbDsKLQkJICB0cnkKLQkJICB7Ci0JCSAgVVJMIGJyb3dzZXJVUkwgPSBuZXcgVVJMKGxpY2Vuc2VVUkwpOwotCQkgIGxpY2Vuc2VTdHJlYW0gPSBicm93c2VyVVJMLm9wZW5TdHJlYW0oKTsKLQkJICBpc3JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihsaWNlbnNlU3RyZWFtKTsKLQkJICBicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcmVhZGVyKTsKLQkJICBTdHJpbmcgc3RyOwotCQkgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJICB3aGlsZSgoc3RyID0gYnJlYWRlci5yZWFkTGluZSgpKSE9bnVsbCl7Ci0JCSAgICAgIHNiLmFwcGVuZChzdHIpOwotCQkgIH0KLQkJICBicm93c2VyLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0JCSAgfQotCQkgIGZpbmFsbHkKLQkJICB7Ci0JCQkgIGlmKGxpY2Vuc2VTdHJlYW0gIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgbGljZW5zZVN0cmVhbS5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGlmKGlzcmVhZGVyICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGlzcmVhZGVyLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgaWYoYnJlYWRlciAhPSBudWxsKQotCQkJICB7Ci0JCQkJICBicmVhZGVyLmNsb3NlKCk7Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICAKLQkgIGJyb3dzZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKXsKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lciNjaGFuZ2VkKG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIAotCQl7Ci0JCSAgaWYgKGV2ZW50LnRvdGFsICE9IDApCi0JCSAgewotCQkgICAgbW9uaXRvci5pbnRlcm5hbFdvcmtlZChldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWwpOwotCQkgIH0KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyI2NvbXBsZXRlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIAotCQl7Ci0JCSAgbW9uaXRvci5kb25lKCk7Ci0JCQkKLQkJICBzdGFja0xheW91dC50b3BDb250cm9sID0gYnJvd3NlcjsKLQkJICBhZ3JlZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLmxheW91dCgpOwotCQl9Ci0JICB9KTsKLQkgIAotCSAgbGljZW5zZVRleHQyLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMik7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIC8vIFRoZSBicm93c2VyIHRocm93cyBhbiBleGNlcHRpb24gb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgaXQuIAotCSAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGV4dGVybmFsIGJyb3dzZXIuCi0JICB0cnkKLQkgIHsKLQkgICAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCkuZ2V0RXh0ZXJuYWxCcm93c2VyKCkub3BlblVSTChuZXcgVVJMKGxpY2Vuc2VVUkwpKTsKLQkgICAgbGljZW5zZVRleHQyLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTCk7Ci0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZXgpCi0JICB7Ci0JCS8vIEluIHRoaXMgY2FzZSB0aGUgbGljZW5zZSBjYW5ub3QgYmUgZGlzcGxheS4gSW5mb3JtIHRoZSB1c2VyIG9mIHRoaXMgYW5kIGdpdmUgdGhlbSB0aGUgbGljZW5zZSBsb2NhdGlvbi4KLQkJbGljZW5zZVRleHQyLnNldFRleHQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSLCBuZXcgT2JqZWN0W117bGljZW5zZVVSTH0pKTsKLQkgIH0KLQl9Ci0KLQljcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKLQkJCi0JcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgCi0gIHsKLQlyZXR1cm4gZ2V0SW5mb0ltYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlCi0gICAqIGRpYWxvZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgZGlhbG9nLgotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB0aGUgbGljZW5zZSBtdXN0IGJlIGFjY2VwdGVkLgotICAgKiBAcGFyYW0gbGljZW5zZVVSTCBUaGUgbGljZW5zZSBVUkwuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGljZW5zZSBpcyBhY2NlcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdEZvckxpY2Vuc2UoU2hlbGwgcGFyZW50LCBTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlib29sZWFuIGFncmVlZFRvTGljZW5zZSA9IGZhbHNlOwotCWJvb2xlYW4gbmV3RGlhbG9nID0gdHJ1ZTsKLQlMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyBkaWFsb2cgPSBudWxsOwotCS8vIElmIHRoZSBkaWFsb2cgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgZm9yIHRoaXMgbGljZW5zZSB1c2UgaXQgaW5zdGVhZCBvZiAKLQkvLyBkaXNwbGF5aW5nIGFub3RoZXIgZGlhbG9nLgotCWlmKGRpYWxvZ3NJblVzZS5jb250YWluc0tleShsaWNlbnNlVVJMKSkKLQl7Ci0JICBuZXdEaWFsb2cgPSBmYWxzZTsKLQkgIGRpYWxvZyA9IChMaWNlbnNlQWNjZXB0YW5jZURpYWxvZylkaWFsb2dzSW5Vc2UuZ2V0KGxpY2Vuc2VVUkwpOwotCX0KLQllbHNlCi0JewotCSAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCi0JICB0cnkKLQkgIHsKLQkgICAgVVJMIHVybE9iaiA9IG5ldyBVUkwobGljZW5zZVVSTCk7Ci0JICAgIGlzID0gdXJsT2JqLm9wZW5TdHJlYW0oKTsKLQotCSAgICBkaWFsb2cgPSBuZXcgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cocGFyZW50LCB1cmwsIGxpY2Vuc2VVUkwpOwotCSAgICBkaWFsb2dzSW5Vc2UucHV0KGxpY2Vuc2VVUkwsIGRpYWxvZyk7Ci0JICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBsaWNlbnNlIGNhbm5vdCBiZSBvcGVuZWQuIik7Ci0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCWlmKGlzICE9IG51bGwpCi0JCXsKLQkJICB0cnkKLQkJICB7Ci0JCQlpcy5jbG9zZSgpOwotCQkgIH0KLQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkgIHsKLQkJICAgIC8vIERvIG5vdGhpbmcuCi0JCSAgfQotCQl9Ci0JICB9Ci0JfQotCWlmKGRpYWxvZyAhPSBudWxsKQotCXsKLQkgIGRpYWxvZy5vcGVuKCk7Ci0JICAKLQkgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLk9LKSAKLQkgIHsKLQkJYWdyZWVkVG9MaWNlbnNlID0gdHJ1ZTsKLSAgICAgIH0KLQkJCi0JICBpZihuZXdEaWFsb2cpCi0JICB7Ci0gICAgICAgZGlhbG9nc0luVXNlLnJlbW92ZShsaWNlbnNlVVJMKTsKLQkgIH0KLQl9Ci0JIAotCXJldHVybiBhZ3JlZWRUb0xpY2Vuc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2xvc2UoKSAKLSAgewotCWlmKGFncmVlQnV0dG9uICE9IG51bGwpCi0JewotCSAgYWdyZWVCdXR0b24uZGlzcG9zZSgpOwotCSAgYWdyZWVCdXR0b24gPSBudWxsOwotCX0KLQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiMjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoZSBsaWNlbnNlIHJlZ2lzdHJ5IGhvbGRzIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBsaWNlbnNlcyBhbmQgd2hldGhlciBvciBub3QgdGhleQotICogaGF2ZSBiZWVuIGFjY2VwdGVkLgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZVJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9VTlNQRUNJRklFRCA9IG5ldyBJbnRlZ2VyKDApOyAvLyBUaGlzIG5lZWRzIHRvIGJlIDAgZm9yIHRoZSBwbHVnaW4gcHJlZnMuCi0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0FHUkVFID0gbmV3IEludGVnZXIoMSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0RJU0FHUkVFID0gbmV3IEludGVnZXIoMik7Ci0gIC8vIFNpZ25pZmllcyBhIGxpY2Vuc2UgdGhhdCBoYXMgYmVlbiBkaXNhZ3JlZWQgdG8gdGhpcyBzZXNzaW9uLgotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04gPSBuZXcgSW50ZWdlcigzKTsKLSAgCi0gIC8qKgotICAgKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgTGljZW5zZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGRvIG5vdCBwcm9tcHQgZmxhZyB3aWxsIHByZXZlbnQgdXNlciBwcm9tcHRpbmcuIFVzZWQgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIERPX05PVF9QUk9NUFQgPSBmYWxzZTsKLSAgCi0gIC8qKgotICAgKiBUaGUgbGljZW5zZXMgaGFzaHRhYmxlIGNvbnRhaW5zIGxpY2Vuc2VzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGV5J3ZlIGJlZW4gYWNjZXB0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGxpY2Vuc2VzOwotICAKLSAgcHJvdGVjdGVkIExpY2Vuc2VSZWdpc3RyeSgpCi0gIHsKLQlsaWNlbnNlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkKLQkvLyBJZiB0aGUgd3RwIHF1aWV0IHN5c3RlbSBwcm9wZXJ0eSBpcyBzZXQgdGhlIERPX05PVF9QUk9NUFQgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4KLQkvLyBUaGlzIGlzIHVzZWQgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgotCWlmKFN5c3RlbS5nZXRQcm9wZXJ0eShDYWNoZU1lc3NhZ2VzLldUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QLCAiZmFsc2UiKS5lcXVhbHMoInRydWUiKSkKLQl7Ci0JICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBDYWNoZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX0xPR19JTkZPX1dUUF9OT19VU0VSX0lOVEVSQUNUSU9OLCBuZXcgT2JqZWN0W117Q2FjaGVNZXNzYWdlcy5XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUH0pLCBudWxsKSk7Ci0JICBET19OT1RfUFJPTVBUID0gdHJ1ZTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGljZW5zZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotCWlmKGluc3RhbmNlID09IG51bGwpCi0JewotCSAgaW5zdGFuY2UgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5KCk7Ci0JfQotCXJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UgdG8gdGhlIGxpY2Vuc2UgcmVnaXN0cnkuIEEgbGljZW5zZSBjYW4gb25seSBiZSBhZGRlZCB0byB0aGUKLSAgICogcmVnaXN0cnkgb25jZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhZGQgdG8gdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYodXJsICE9IG51bGwgJiYgIWxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9VTlNQRUNJRklFRCk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogQWdyZWUgdG8gdGhlIHNwZWNpZmllZCBsaWNlbnNlLiBUaGUgbGljZW5zZSBpcyBhZ3JlZWQgdG8gb25seSBpZiBpdCBoYXMgYWxyZWFkeQotICAgKiBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpCi0gIHsKLQlpZihsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfQUdSRUUpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIERpc2FncmVlIHRvIHRoZSBzcGVjaWZpZWQgbGljZW5zZS4gVGhlIGxpY2Vuc2UgaXMgZGlzYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRpc2FncmVlTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYobGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX0RJU0FHUkVFKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEaXNhZ3JlZSB0byB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UgZm9yIHRoaXMgc2Vzc2lvbi4gVGhlIGxpY2Vuc2UgaXMgZGlzYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LiAKLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhY2NlcHQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZGlzYWdyZWVMaWNlbnNlVGhpc1Nlc3Npb24oU3RyaW5nIHVybCkKLSAgewotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgbGljZW5zZSBoYXMgYmVlbiBhY2NlcHRlZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgbGljZW5zZQotICAgKiBoYXMgYmVlbiBhY2NlcHRlZCBvciBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeSBhbmQgZmFsc2UgaWYgaXQgaGFzIG5vdCBiZWVuIGFjY2VwdGVkLiAKLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHdlIGFyZSBjaGVja2luZyB0aGUgbGljZW5zZS4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCBoYXMgYmVlbiBhY2NlcHRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsaWNlbnNlIGhhcyBiZWVuIGFjY2VwdGVkIG9yIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNMaWNlbnNlQmVlbkFjY2VwdGVkKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKQotICB7Ci0JaWYoRE9fTk9UX1BST01QVCkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JaWYobGljZW5zZXMuY29udGFpbnNLZXkobGljZW5zZVVSTCkpCi0JewotCSAgSW50ZWdlciBhZ3JlZWQgPSAoSW50ZWdlcilsaWNlbnNlcy5nZXQobGljZW5zZVVSTCk7Ci0JICBpZihhZ3JlZWQgPT0gTElDRU5TRV9BR1JFRSkKLQkgIHsKLQkJcmV0dXJuIHRydWU7Ci0JICB9Ci0JICBlbHNlIGlmKGFncmVlZCA9PSBMSUNFTlNFX0RJU0FHUkVFKQotCSAgewotCQlpZighQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNob3VsZFByb21wdCgpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJbGljZW5zZXMucHV0KGxpY2Vuc2VVUkwsIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKTsKLQkgIH0KLQkgIC8vIFRoZSBsaWNlbnNlIGhhcyBhbHJlYWR5IGJlZW4gZGlzYWdyZWVkIHRvIHRoaXMgc2Vzc2lvbi4gRG8gbm90IHByb21wdC4KLQkgIGVsc2UgaWYoYWdyZWVkID09IExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKQotCSAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICB9Ci0JCSAgCi0JICAKLQkgIC8vIFByb21wdCB0aGUgdXNlciB0byBhY2NlcHQgdGhlIGxpY2Vuc2UuCi0JICBpbnQgbGljZW5zZUFjY2VwdGFuY2UgPSBwcm9tcHRUb0FjY2VwdExpY2Vuc2UodXJsLCBsaWNlbnNlVVJMKTsKLQkgIGlmKGxpY2Vuc2VBY2NlcHRhbmNlID09IEFjY2VwdGVkLkFDQ0VQVEVEKQotCSAgewotCQlhZ3JlZUxpY2Vuc2UobGljZW5zZVVSTCk7Ci0JCXJldHVybiB0cnVlOwotCSAgfQotCSAgZWxzZSBpZihsaWNlbnNlQWNjZXB0YW5jZSA9PSBBY2NlcHRlZC5OT1RfQUNDRVBURUQpCi0JICB7Ci0JICAgIGRpc2FncmVlTGljZW5zZVRoaXNTZXNzaW9uKGxpY2Vuc2VVUkwpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIFRoZSBsaWNlbnNlIGlzIG5vdCByZWdpc3RyZWQgd2l0aCB0aGUgcmVnaXN0cnkuCi0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm9tcHQgdGhlIHVzZXIgdG8gYWNjZXB0IHRoZSBsaWNlbnNlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB0aGUgbGljZW5zZSBuZWVkcyB0byBiZSBhY2NlcHRlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBiZSBhY2NlcHRlZC4gCi0gICAqIEByZXR1cm4gMCBpZiBhY2NlcHRlZCwgMSBpZiBub3QgYWNjZXB0ZWQsIDIgaWYgbm90IGFibGUgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBwcm9tcHRUb0FjY2VwdExpY2Vuc2UoZmluYWwgU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIGxpY2Vuc2VVUkwpIAotICB7Ci0JZmluYWwgQWNjZXB0ZWQgYWNjZXB0ZWQgPSBuZXcgQWNjZXB0ZWQoKTsKLQkgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJICBpZihMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5wcm9tcHRGb3JMaWNlbnNlKG51bGwsIHVybCwgbGljZW5zZVVSTCkpCi0JCQkJICB7Ci0JCQkJCWFjY2VwdGVkLmFjY2VwdGVkID0gQWNjZXB0ZWQuQUNDRVBURUQ7Ci0JCQkJICB9Ci0JCQkJICBlbHNlCi0JCQkJICB7Ci0JCQkJCWFjY2VwdGVkLmFjY2VwdGVkID0gQWNjZXB0ZWQuTk9UX0FDQ0VQVEVEOwotCQkJCSAgfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJICBhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLk5PVF9ERVRFUk1JTkVEOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JcmV0dXJuIGFjY2VwdGVkLmFjY2VwdGVkOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBsaWNlbnNlcyBpbiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIEFzIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBsaWNlbnNlcyBpbiB0aGUgcmVnaXN0cnkuIAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldExpY2Vuc2VzKCkKLSAgewotCXJldHVybiAoU3RyaW5nW10pbGljZW5zZXMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW2xpY2Vuc2VzLmtleVNldCgpLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgbGljZW5zZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZS4KLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgSW50ZWdlciBnZXRMaWNlbnNlU3RhdGUoU3RyaW5nIHVybCkKLSAgewotCXJldHVybiAoSW50ZWdlcilsaWNlbnNlcy5nZXQodXJsKTsKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBBIGNsYXNzIHRvIGhvbGQgYWNjZXB0YW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb21wdCBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEFjY2VwdGVkCi0gIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFUFRFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FDQ0VQVEVEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfREVURVJNSU5FRCA9IDI7Ci0JcHVibGljIGludCBhY2NlcHRlZCA9IE5PVF9BQ0NFUFRFRDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNjViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIFRvQ2FjaGVSZWdpc3RyeVJlYWRlcnMgcmVhZHMgRWNsaXBzZSBleHRlbnNpb25zIHdoaWNoIHNwZWNpZnkKLSAqIHJlc291cmNlcyB0byBjYWNoZS4gQW4gZXh0ZW5zaW9uIHBvaW50IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZy4KLSAqIAotICogIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5jYWNoZXJlc291cmNlIj4KLSAqICAgIDxjYWNoZXJlc291cmNlIHVyaT0iVVJJX1RPX0NBQ0hFIiBsaWNlbnNlPSJVUklfT0ZfTElDRU5TRSIvPgotICogIDwvZXh0ZW5zaW9uPiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjYWNoZXJlc291cmNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSTCA9ICJ1cmwiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTElDRU5TRSA9ICJsaWNlbnNlIjsKLSAKLSAgcHJpdmF0ZSBzdGF0aWMgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlc1RvQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkgcmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYocmVnaXN0cnlSZWFkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWdpc3RyeVJlYWRlciA9IG5ldyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5UmVhZGVyOwotICB9Ci0gIC8qKgotICAgKiBSZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBoYW5kbGUgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgdGhhdCBtYXRjaAotICAgKiB0aGUgc3BlZGlmaWVkIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBUb0NhY2hlUmVzb3VyY2UgdG9DYWNoZVJlc291cmNlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgICBpZih0b0NhY2hlUmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc291cmNlc1RvQ2FjaGUucHV0KHRvQ2FjaGVSZXNvdXJjZS5nZXRVUkwoKSwgdG9DYWNoZVJlc291cmNlKTsKLSAgICAgICAgICBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5hZGRMaWNlbnNlKHRvQ2FjaGVSZXNvdXJjZS5nZXRMaWNlbnNlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGFuZCBkZWFsIHdpdGggdGhlIGV4dGVuc2lvbiBwb2ludHMuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZXh0ZW5zaW9uIHBvaW50IGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgVG9DYWNoZVJlc291cmNlIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0JCi0gICAgaWYoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVYVEVOU0lPTl9QT0lOVF9JRCkpCi0gICAgewotICAgICAgU3RyaW5nIHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9VUkwpOwotICAgICAgaWYodXJsICE9IG51bGwpCi0gICAgICB7Ci0gICAgCVN0cmluZyBsaWNlbnNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xJQ0VOU0UpOwotICAgIAkKLSAgICAJLy8gSWYgdGhlIGxpY2Vuc2UgaXMgcmVsYXRpdmUgcmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAJLy8gcGx1Zy1pbiB0aGF0IGRlY2xhcmVzIGl0LgotICAgIAl0cnkKLSAgICAJewotICAgIAkgIFVSSSBsaWNlbnNlVVJJID0gbmV3IFVSSShsaWNlbnNlKTsKLSAgICAJICBpZighbGljZW5zZVVSSS5pc0Fic29sdXRlKCkpCi0gICAgCSAgewotICAgIAkJQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLSAgICAJCVVSTCBsaWNlbnNlVVJMID0gcGx1Z2luQnVuZGxlLmdldEVudHJ5KGxpY2Vuc2UpOwotICAgIAkJaWYobGljZW5zZVVSTCAhPSBudWxsKQotICAgIAkJewotICAgIAkgICAgICBsaWNlbnNlID0gRmlsZUxvY2F0b3IucmVzb2x2ZShsaWNlbnNlVVJMKS50b0V4dGVybmFsRm9ybSgpOyAgCi0gICAgCQl9Ci0gICAgCSAgfQotICAgIAl9Ci0gICAgCWNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCSAgLy8gVXNlIHRoZSBsaWNlbnNlIGFzIHNwZWNpZmllZC4KLSAgICAJfQotICAgIAljYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCSAgLy8gVXNlIHRoZSBsaWNlbnNlIGFzIHNwZWNpZmllZC4KLSAgICAJfQotICAgIAlyZXR1cm4gbmV3IFRvQ2FjaGVSZXNvdXJjZSh1cmwsIGxpY2Vuc2UpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBVUklzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgY2FjaGluZy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVVJJcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIGNhY2hpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VVJJc1RvQ2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlyZXNvdXJjZXNUb0NhY2hlLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tyZXNvdXJjZXNUb0NhY2hlLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZXNvdXJjZSB0byBjYWNoZSBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBjYWNoZS4KLSAgICogQHJldHVybiBBIFRvQ2FjaGVSZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkwgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBUb0NhY2hlUmVzb3VyY2UgZ2V0UmVzb3VyY2VUb0NhY2hlKFN0cmluZyB1cmwpCi0gIHsKLQlyZXR1cm4gKFRvQ2FjaGVSZXNvdXJjZSlyZXNvdXJjZXNUb0NhY2hlLmdldCh1cmwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2Nzc4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLS8qKgotICogQSByZXNvdXJjZSB0aGF0IGlzIHNwZWNpZmllZCB0byBiZSBjYWNoZWQuIFRoZSByZXNvdXJjZSBoYXMgYSBVUkwgYW5kIGFuIG9wdGlvbmFsCi0gKiBsaWNlbnNlLgotICovCi1wdWJsaWMgY2xhc3MgVG9DYWNoZVJlc291cmNlIAotewotICBwcml2YXRlIFN0cmluZyB1cmw7Ci0gIHByaXZhdGUgU3RyaW5nIGxpY2Vuc2U7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2UgVGhlIFVSTCBvZiB0aGUgb3B0aW9uYWwgbGljZW5zZSBmb3IgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBUb0NhY2hlUmVzb3VyY2UoU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2UpCi0gIHsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmxpY2Vuc2UgPSBsaWNlbnNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0JcmV0dXJuIHVybDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGljZW5zZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpY2Vuc2UgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoKQotICB7Ci0JcmV0dXJuIGxpY2Vuc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DYWNoZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzk2NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DYWNoZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaXMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiBQcmVmZXJlbmNlcyBkaWFsb2cuIFRoaXMgcGFnZSBjb250YWlucyBvcHRpb25zIGZvciB0aGUgY2FjaGUuIFRoZSBjYWNoZSBjYW4KLSAqIGJlIGRpc2FibGVkLCB0aGUgbGlzdCBvZiBlbnRyaWVzIGluIHRoZSBjYWNoZSBjYW4gYmUgdmlld2VkLCBhbmQgaW5kaXZpZHVhbAotICogZW50cmllcyBvciB0aGUgZW50aXJlIGNhY2hlIGNhbiBiZSBkZWxldGVkLgotICovCi0KLXB1YmxpYyBjbGFzcyBDYWNoZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotICBwcm90ZWN0ZWQgQnV0dG9uIGNsZWFyQnV0dG9uOwotCi0gIHByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCi0gIHByb3RlY3RlZCBCdXR0b24gZW5hYmxlZEJ1dHRvbjsKLSAgCi0gIHByb3RlY3RlZCBCdXR0b24gZGlzYWdyZWVkTGljZW5zZXNCdXR0b247Ci0KLSAgcHJvdGVjdGVkIExpc3QgZW50cmllczsKLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZVByZWZlcmVuY2VQYWdlKCkKLSAgewotICAgIHNldFByZWZlcmVuY2VTdG9yZShDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIG5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLSAgICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0gICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgCi0gICAgTGFiZWwgYWJvdXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBhYm91dExhYmVsLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9DQUNIRV9BQk9VVCk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBhYm91dExhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5Ob25lKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGVkIHRoZSBkaXNhYmxlIGNhY2hlIG9wdGlvbi4KLSAgICAgIGVuYWJsZWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZW5hYmxlZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGVuYWJsZWRCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX0NBQ0hFX0NBQ0hFX09QVElPTik7Ci0gICAgICBlbmFibGVkQnV0dG9uLnNldFNlbGVjdGlvbighQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0gICAgICAgICAgLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSk7Ci0gICAgICBlbmFibGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBlbmFibGVkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQoIWRpc2FibGVkKTsKLSAgICAgICAgfQotCi0gICAgICB9KTsKLSAgICAgIAotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfUFJPTVBUX0ZPUl9ESVNBR1JFRURfTElDRU5TRVMpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0U2VsZWN0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotICAgICAgICAgIC5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUykpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBwcm9tcHQgPSBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0UHJvbXB0RGlzYWdyZWVkTGljZW5zZXMocHJvbXB0KTsKLSAgICAgICAgfQotCi0gICAgICB9KTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBlbnRpdGllcyBncm91cC4KLSAgICAgIExhYmVsIGVudHJpZXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgIGVudHJpZXNMYWJlbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRSk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBlbnRyaWVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgIGVudHJpZXMgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlbnRyaWVzLAotICAgICAgICAgIENvbnRleHRJZHMuUFJFRl9FTlRSSUVTKTsKLSAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVkVVJJcygpOwotICAgICAgQXJyYXlzLnNvcnQoY2FjaGVFbnRyaWVzKTsKLSAgICAgIGVudHJpZXMuc2V0SXRlbXMoY2FjaGVFbnRyaWVzKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGVudHJpZXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBlbnRyaWVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBTV1QuVE9QKTsKLSAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIC8vIENyZWF0ZSB0aGUgRGVsZXRlIGJ1dHRvbgotICAgICAgZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlkpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAub3BlbkNvbmZpcm0oCi0gICAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkRW50cmllcyA9IGVudHJpZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgbnVtU2VsZWN0ZWRFbnRyaWVzID0gc2VsZWN0ZWRFbnRyaWVzLmxlbmd0aDsKLQotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZWxlY3RlZEVudHJpZXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlRW50cnkoc2VsZWN0ZWRFbnRyaWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IGNhY2hlLmdldENhY2hlZFVSSXMoKTsKLSAgICAgICAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgQ2xlYXIgQ2FjaGUgYnV0dG9uCi0gICAgICBjbGVhckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICBjbGVhckJ1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0JVVFRPTl9DTEVBUl9DQUNIRSk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBjbGVhckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICBDYWNoZU1lc3NhZ2VzLl9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfTUVTU0FHRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IGNhY2hlLmdldENhY2hlZFVSSXMoKTsKLSAgICAgICAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAgIC8vVE9ETzogTG9nIGVycm9yCi0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHNldFByZWZlcmVuY2VXaWRnZXRzKCk7Ci0gICAgYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcHJlZmVyZW5jZSBwYWdlIHdpZGdldHMuIFRoZXJlIGFyZSBhIGZldyBydWxlcy4gMS4gSWYgZGlzYWJsZWQsIGFsbAotICAgKiBvZiB0aGUgd2lkZ2V0cyBhcmUgZGlhYmxlZCBleGNlcHQgZm9yIHRoZSBkaXNhYmxlZCBjaGVjayBib3guIDIuIElmCi0gICAqIGVuYWJsZWQsIGFsbCB3aWRnZXRzIGFyZSBlbmFibGVkIGV4Y2VwdCBhLiBUaGUgZGVsZXRlIGJ1dHRvbiBpcyBlbmFibGVkCi0gICAqIG9ubHkgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdGhlIGxpc3QuIGIuIFRoZSBjbGVhciBidXR0b24gaXMgZW5hYmxlZAotICAgKiBvbmx5IGlmIHRoZXJlIGFyZSBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VXaWRnZXRzKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCAmJiBjb21wb3NpdGUuZ2V0RW5hYmxlZCgpKQotICAgIHsKLSAgICAgIGlmIChlbnRyaWVzLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbnRyaWVzLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgY2xlYXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNsZWFyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwgQ29udGV4dElkcy5QUkVGKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5Y2FmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIENvbnN0YW50IGlkcyBmb3IgY29udGV4dCBoZWxwLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUYgPSBDYWNoZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmNwcjAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5UUklFUyA9IENhY2hlUGx1Z2luLlBMVUdJTl9JRCArICIuY3ByMDAwMiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxYzRhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHBsdWctaW4gcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VOQUJMRUQgPSAiY2FjaGVFbmFibGVkIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01QVF9ESVNBR1JFRURfTElDRU5TRVMgPSAicHJvbXB0RGlzYWdyZWVkTGljZW5zZXMiOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjRhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgCi17Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSAKLSAgewotCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQsIHRydWUpOwotICAgIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTLCBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjZGRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZhbGlkYXRldWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZmMiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlmOGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1ydW50aW1lCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NzFmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwNmFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMDggMDk6MjQ6NTYgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxZmUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSNUdWUgRmViIDEyIDEyOjMwOjQ2IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPV8KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPV8KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzOGQ2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNUdWUgRmViIDEyIDEyOjMwOjQ2IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNGJlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zd3Q7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmZmZlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gdmFsaWRhdGV1aS8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8sXAotICAgICAgICAgICB2ZjIvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDliMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsX2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmxfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTMzM2ExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmxfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsX2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4OTAwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibF9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzk5YWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5nc19kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNjZkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQxMmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgVmVyc2lvbiAxLjMKLSMKLVZCRl9USVRMRV9QUk9QRVJUSUVTPVZhbGlkYXRpb24KLVZCRl9VSV9QT1BVUF9SVU5WQUxJREFUSU9OPVZhbGlkYXRlCi1WQkZfVElUTEVfUFJFRkVSRU5DRT1WYWxpZGF0aW9uCi0KLUJ1bmRsZS1OYW1lLjAgPSBWYWxpZGF0aW9uIEZyYW1ld29yayBVSQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MDJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBQb3B1cCBDb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBCeSBzYXlpbmcgImFkYXB0YWJsZT10cnVlIiwgdGhpcyBpdGVtIHdpbGwgYXBwZWFyIG9uIGJvdGggSVByb2plY3QgYW5kIElKYXZhUHJvamVjdCAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBpZD0iVmFsaWRhdGlvbk1lbnVBY3Rpb24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVWQkZfVUlfUE9QVVBfUlVOVkFMSURBVElPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5WYWxpZGF0aW9uTWVudUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25BY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAKLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBWYWxpZGF0aW9uIHByZWZlcmVuY2UgcGFnZSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVZCRl9USVRMRV9QUkVGRVJFTkNFIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgVmFsaWRhdGlvbiBwcm9wZXJ0aWVzIHBhZ2UgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQnkgc2F5aW5nICJhZGFwdGFibGU9dHJ1ZSIsIHRoaXMgaXRlbSB3aWxsIGFwcGVhciBvbiBib3RoIElQcm9qZWN0IGFuZCBJSmF2YVByb2plY3QgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVZCRl9USVRMRV9QUk9QRVJUSUVTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0iVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgIDxlbmFibGVkV2hlbj4KLQkgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3ZhbGlkYXRpb251aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS92YWxpZGF0aW9udWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiMTAyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3ZhbGlkYXRpb251aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1TYXZlRmlsZXNEaWFsb2dfc2F2aW5nPVNhdmluZyBSZXNvdXJjZXMKLVNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZT0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKLVNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCi1TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCi0KLVByZWZQYWdlX2Fsd2F5c19zYXZlPSZTYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCi0KLVJ1blZhbGlkYXRpb25EaWFsb2dUaXRsZT1SdW5uaW5nIFZhbGlkYXRpb24KLVVuYWJsZVRvU2F2ZT1VbmFibGUgdG8gc2V0IHNhdmUgYXV0b21hdGljYWxseSBwcmVmZXJlbmNlIGluIHNhdmUgZmlsZXMgZm9yIHZhbGlkYXRpb24gZGlhbG9nOgotVmFsaWRhdGU9VmFsaWRhdGUKLQotVmFsUmVzdWx0cz1WYWxpZGF0aW9uIFJlc3VsdHMKLQotVmFsRXJyb3IxUmVzb3VyY2UxPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCwgb25lIGVycm9yIHdhcyBkaXNjb3ZlcmVkLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MH0uCi1WYWxFcnJvcnNSZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkLCB7MH0gZXJyb3JzIHdlcmUgZGlzY292ZXJlZC4gT25lIHJlc291cmNlIHdhcyB2YWxpZGF0ZWQgaW4gezF9LgotVmFsV2FybjFSZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggb25lIHdhcm5pbmcuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHswfS4KLVZhbFdhcm5SZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IHdhcm5pbmdzLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MX0uCi1WYWxJbmZvMVJlc291cmNlMT1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MH0uCi1WYWxJbmZvUmVzb3VyY2UxPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIHswfSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MX0uCi0KLVZhbEVycm9yMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQsIG9uZSBlcnJvciB3YXMgZGlzY292ZXJlZC4gezB9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7MX0uCi1WYWxFcnJvcnNSZXNvdXJjZXM9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkLCB7MH0gZXJyb3JzIHdlcmUgZGlzY292ZXJlZC4gezF9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7Mn0uCi1WYWxXYXJuMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgd2FybmluZy4gezB9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7MX0uCi1WYWxXYXJuUmVzb3VyY2VzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIHswfSB3YXJuaW5ncy4gezF9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7Mn0uCi1WYWxJbmZvMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlLiB7MH0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsxfS4KLVZhbEluZm9SZXNvdXJjZXM9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuIHsxfSByZXNvdXJjZXMgd2VyZSB2YWxpZGF0ZWQgaW4gezJ9LgotCi1WYWxTdWNjZXNzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9ycyBvciB3YXJuaW5ncy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZGVmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBDb2RlIG9yaWVudGVkIGluc3RydWN0aW9uczoKLSMgICAgICoKLSMgICAgICogSW4gdGhlIHN0cmluZywgeW91IG1heSBzZWUgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHNlcXVlbmNlczoKLSMgICAgICogYSkge259ICB3aGVyZSBuIGlzIGEgbnVtYmVyLiBUaGVzZSBhcmUgcmVwbGFjZWFibGUgcGFyYW1ldGVycy4KLSMgICAgICogYikgJycgIEluIC5wcm9wZXJ0aWVzIGZpbGVzLCBpbiBvcmRlciB0byBzZWUgb25lIGFwb3N0cm9waGUgKCcpIGluIHRoZSBmaW5hbAotIyAgICAgKiAgICBzdHJpbmcsIHNvbWV0aW1lcyB0d28gYXBvc3Ryb3BoZXMgbXVzdCBiZSBlbnRlcmVkIGluIHRoZSBzdHJpbmcuIEluIHRoZSB0cmFuc2xhdGVkCi0jICAgICAqICAgIHN0cmluZywgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHtufSBpbiB0aGUgc3RyaW5nLCB0aGVuIHRvIHNob3cgb25lIGFwb3N0cm9waGUKLSMgICAgICogICAgdG8gdGhlIHVzZXIsIHB1dCB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vIHtufSBpbiB0aGUgc3RyaW5nLAotIyAgICAgKiAgICB0aGVuIHB1dCBvbmUgYXBvc3Ryb3BoZS4KLSMgICAgICogICAgRm9yIGV4YW1wbGUsIHNheSB0aGF0IHlvdSB3YW50IHRoZSB1c2VyIHRvIHJlYWQgIkdlb3JnZSdzIGZpbGUiLiAKLSMgICAgICogICAgICAgIEdFT1JHRT1HZW9yZ2UncyBmaWxlIHdhcyBvbiB0aGUgZGVzay4KLSMgICAgICogICAgICAgIEdFT1JHRTI9R2VvcmdlJydzIGZpbGUgYW5kIHswfSB3ZXJlIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICBHRU9SR0UgdXNlcyBvbmUgYXBvc3Ryb3BoZSBiZWNhdXNlIHRoZXJlIGFyZSBubyB7bn0gYW5kIEdFT1JHRTIKLSMgICAgICogICAgdXNlcyB0d28gYXBvc3Ryb3BoZXMgYmVjYXVzZSB0aGVyZSBpcyBhIHtufS4KLSMgICAgICogYykgJycgdGV4dCAnJyB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgZG91YmxlCi0jICAgICAqICAgIGFwb3N0cm9waGVzIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gCi0jICAgICAqIGQpIDx0ZXh0PiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgYW5nbGUKLSMgICAgICogICAgYnJhY2tldHMgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiBlKSAidGV4dCIgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiAKLSMgICAgICogICAgbWFya3Mgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiAgICAKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogT3RoZXIgaW5zdHJ1Y3Rpb25zCi0jICAgICAqIGEpIERvIG5vdCB0cmFuc2xhdGUgYW55IHRleHQgdGhhdCBpcyBvbiBhIGxpbmUgd2hpY2ggYmVnaW5zIHdpdGggYSBjb21tZW50IAotIyAgICAgKiAgICBzeW1ib2wgKCMpLgotIyAgICAgKiBiKSBEbyBub3QgdHJhbnNsYXRlIHRoZXNlIHdvcmRzOiAKLSMgICAgICogICAgICAgIHNjaGVtYSwgRUpCLCBSREIsIEpBUiwgUk1JLCBCTVAsIENNUCwgT09TUUwKLSMgICAgICogYykgUGxlYXNlIHJldHVybiB0aGUgLnByb3BlcnRpZXMgZmlsZXMgdXNpbmcgdGhlIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSMgICAgICogICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0d28gb2YgdGhlIGZpbGVzIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSMgICAgICoKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQW55IG90aGVyIGNvbW1lbnRzIHRvIHRoZSB0cmFuc2xhdG9ycyBhcmUgb24gbGluZXMgd2hpY2ggc3RhcnQgbGlrZSB0aGlzOiAgIyAyVEM6Ci0jCi0jIFZlcnNpb24gMS4xMgotIwotIwotIyBJRDoKLSMgICAgVkJGIC0gVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yawotIwotCi0jIAotIyBCZWdpbiBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFVJIFN0cmluZ3MKLSMKLSMgSURzOgotIyAgICBWQkZfRVhDPUV4Y2VwdGlvbiBvciBlcnJvciB0ZXh0Ci0jICAgIFZCRl9VST1VSSBsYWJlbAotIwotUFJFRl9CVVRUT05fT1ZFUlJJREU9QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5ncwotUFJFRl9CVVRUT05fRU5BQkxFQUxMPUVuYWJsZSBBbGwKLVBSRUZfQlVUVE9OX0RJU0FCTEVBTEw9RGlzYWJsZSBBbGwKLVBSRUZfVkFMTElTVF9USVRMRT1UaGUgc2VsZWN0ZWQgdmFsaWRhdG9ycyB3aWxsIHJ1biB3aGVuIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkOgotUFJFRl9NTlVfTUFOVUFMPSZNYW51YWwKLVBSRUZfTU5VX0JVSUxEPSZCdWlsZAotUFJFRl9NTlVfU0VUVElOR1M9JlNldHRpbmdzLi4uCi0KLVZCRl9FWENfSU5URVJOQUxfVElUTEU9SW50ZXJuYWwgZXJyb3IKLVZCRl9FWENfSU5URVJOQUxfUEFHRT1BbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkOyBjbGljayBDYW5jZWwgdG8gY2xvc2UgdGhlIHdpemFyZC4KLQotVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSPVZhbGlkYXRvcnMgY2FuIHJ1biBvbmx5IG9uIG9wZW4gcmVzb3VyY2VzLgotUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQ9VGhlIHdvcmtzcGFjZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGRvIG5vdCBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGUgd29ya3NwYWNlIHNldHRpbmdzLiBJbiBvcmRlciB0byBhbGxvdyBwcm9qZWN0IHNldHRpbmdzIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgd29ya3NwYWNlIHNldHRpbmdzIHRvIGFsbG93IHByb2plY3Qgb3ZlcnJpZGVzLiAgCi0gCi1WQkZfVUlfTk9fVkFMSURBVE9SU19JTlNUQUxMRUQ9Tm8gdmFsaWRhdG9ycyBhcmUgaW5zdGFsbGVkLgotCi1ESVNBQkxFX1ZBTElEQVRJT049U3VzcGVuZCBhbGwgdmFsaWRhdG9ycwotCi1EZWxlZ2F0ZXNEaWFsb2dUaXRsZT1WYWxpZGF0b3IgUHJlZmVyZW5jZXMKLURlbGVnYXRlc0NvbWJvTGFiZWw9SW1wbGVtZW50YXRpb246Ci1BRERfVkFMSURBVElPTl9CVUlMREVSPUFkZCBWYWxpZGF0aW9uIEJ1aWxkZXIgdG8gcHJvamVjdAotQ29uZmlnV3NTZXR0aW5ncz1Db25maWd1cmUgV29ya3NwYWNlIFNldHRpbmdzLi4uCi1WQUxJREFUT1I9VmFsaWRhdG9yCi1NQU5VQUw9TWFudWFsCi1CVUlMRD1CdWlsZAotU0VUVElOR1M9U2V0dGluZ3MKLQotU2F2ZUZpbGVzRGlhbG9nX3NhdmluZz1TYXZpbmcgUmVzb3VyY2VzCi1TYXZlRmlsZXNEaWFsb2dfYWx3YXlzX3NhdmU9JkFsd2F5cyBzYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgotCi1QcmVmUGFnZV9hbHdheXNfc2F2ZT0mU2F2ZSBhbGwgbW9kaWZpZWQgcmVzb3VyY2VzIGF1dG9tYXRpY2FsbHkgcHJpb3IgdG8gdmFsaWRhdGluZwotUHJlZlBhZ2VDb25maXJtRGlhbG9nPVNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIHdoZW4gcGVyZm9ybWluZyBtYW51YWwgdmFsaWRhdGlvbnMKLQotUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlPVJ1bm5pbmcgVmFsaWRhdGlvbgotCi1mZFRpdGxlPVZhbGlkYXRpb24gRmlsdGVycyBmb3IgezB9Ci1mZE5vRmlsdGVycz1UaGUgdmFsaWRhdG9yIGRvZXMgbm90IGhhdmUgY3VycmVudGx5IGhhdmUgYW55IGZpbHRlcnMgaW5zdGFsbGVkLgotRXJyQ29uZmlnPUV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGVycm9yLiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgaGFwcGVuZWQsIHRoZSB2YWxpZGF0b3IgezB9IGhhcyBpbmNvcnJlY3RseSBjb25maWd1cmVkIHRoZSB2YWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludC4KLQotRmlsdGVySGVscD1GaWx0ZXIgcnVsZXMgYXJlIGdyb3VwZWQgaW50byBncm91cHMuIEluc2lkZSBvZiBhbnkgb25lIGdyb3VwIHRoZSBydWxlcyBhcmUgb3InZCB0b2dldGhlci4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBncm91cHMgSW5jbHVkZSBhbmQgRXhjbHVkZS4gSWYgYW55IG9mIHRoZSBydWxlcyBpbiB0aGUgRXhjbHVkZSBncm91cCBtYXRjaCwgdGhlIHJlc291cmNlIGlzIG5vdCB2YWxpZGF0ZWQuIElmIHRoZXJlIGFyZSBJbmNsdWRlIGdyb3VwcywgYXQgbGVhc3Qgb25lIHJ1bGUgZnJvbSBlYWNoIGdyb3VwIG11c3QgbWF0Y2ggYmVmb3JlIHRoZSByZXNvdXJjZSBpcyB2YWxpZGF0ZWQuCi1CdXR0b25BZGRHcm91cEluY2x1ZGU9QWRkIEluY2x1ZGUgR3JvdXAuLi4KLUJ1dHRvbkFkZEdyb3VwRXhjbHVkZT1BZGQgRXhjbHVkZSBHcm91cC4uLgotQnV0dG9uQWRkUnVsZT1BZGQgUnVsZS4uLgotQnV0dG9uUmVtb3ZlPVJlbW92ZSAKLQotTGFiZWxFbmFibGVQcm9qZWN0U3BlY2lmaWM9RW5hYmxlIHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MKLQotTGFiZWxFeHRlbnNpb249RmlsZSBleHRlbnNpb24KLUxhYmVsRmlsZT1Gb2xkZXIgb3IgZmlsZSBuYW1lCi1MYWJlbFByb2plY3RzPVByb2plY3QgbmF0dXJlCi1MYWJlbEZhY2V0cz1GYWNldAotTGFiZWxDb250ZW50VHlwZT1Db250ZW50IFR5cGUKLQotIyBOb3RlIHRvIHRyYW5zbGF0b3JzLCBrZWVwIHRoZSA8QT4gYW5kIDwvQT4gdGFncyBleGFjdGx5IGFzIHRoZXkgYXJlCi1Eb05vdFNob3dSZXN1bHRzPURvIG5vdCBzaG93IHRoaXMgZGlhbG9nIGluIHRoZSBmdXR1cmUuCi0KLURlc2NFeHRlbnNpb249RmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlICJodG1sIiBmb3IgSFRNTCBmaWxlcy4KLURlc2NGaWxlPUVpdGhlciBhIGZvbGRlciwgYSByZWxhdGl2ZSBmaWxlLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBmaWxlIG5hbWUuCi1EZXNjUHJvamVjdHM9QSBwcm9qZWN0IG5hdHVyZS4KLURlc2NGYWNldHM9QSBmYWNldC4KLURlc2NDb250ZW50VHlwZT1BIGNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUgdGhlIFhNTCBjb250ZW50IHR5cGUuCi0KLUVycm9yc1dhcm5pbmdzPUVycm9ycy9XYXJuaW5ncwotCi1WYWxpZGF0aW9uPVZhbGlkYXRpb24KLVZhbGlkYXRpb25TdGF0dXM9VmFsaWRhdGlvbiBTdGF0dXMKLQotRXJyU3VtbWFyeT1WYWxpZGF0aW9uIHJlc3VsdHMuIEVycm9ycz17MH0sIFdhcm5pbmdzPXsxfSwgSW5mb3JtYXRpb249ezJ9Ci1WYWxpZGF0aW9uU3VjY2Vzc2Z1bD1WYWxpZGF0aW9uIHdhcyBzdWNjZXNzZnVsCi0KLUZyV2l6YXJkPU5ldyBGaWx0ZXIgUnVsZSBXaXphcmQKLUZyU2VsZWN0RmlsdGVyVHlwZT1TZWxlY3QgRmlsdGVyIFR5cGUKLUZyRmlsZUV4dGVuc2lvbj1GaWxlIEV4dGVuc2lvbgotRnJGaWxlRXh0ZW5zaW9uTGFiZWw9RmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWw6Ci1GckNhc2VTZW5zaXRpdmU9SXMgdGhlIGNvbXBhcmlzb24gY2FzZSBzZW5zaXRpdmU/Ci1GckV4YWN0TWF0Y2g9Q2hlY2sgdGhpcyBpZiB0aGUgY29udGVudCB0eXBlIG5lZWRzIHRvIG1hdGNoIGV4YWN0bHkuIERvIG5vdCBjaGVjayBpdCwgaWYgc3ViIHR5cGVzIG5lZWQgdG8gbWF0Y2ggYXMgd2VsbC4KLUZyRm9sZGVyT3JGaWxlPUZvbGRlciBvciBGaWxlIE5hbWUKLUZyRm9sZGVyT3JGaWxlTGFiZWw9RmlsZSBvciBmb2xkZXI6Ci1GckJyb3dzZUZpbGU9QnJvd3NlIEZpbGUuLi4KLUZyRmlsZUZpbHRlcj1TZWxlY3QgdGhlIGZpbGUgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBmaWx0ZXIKLUZyQnJvd3NlRm9sZGVyPUJyb3dzZSBGb2xkZXIuLi4KLUZyRm9sZGVyRmlsdGVyPVNlbGVjdCB0aGUgZm9sZGVyIHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgZmlsdGVyCi1GclByb2plY3ROYXR1cmU9UHJvamVjdCBOYXR1cmUKLUZyUHJvamVjdE5hdHVyZUxhYmVsPVByb2plY3QgbmF0dXJlOgotRnJGYWNpdD1GYWNldAotRnJGYWNpdExhYmVsPUZhY2V0IGlkOgotRnJDb250ZW50VHlwZT1Db250ZW50IFR5cGUKLUZyQ29udGVudFR5cGVMYWJlbD1Db250ZW50IFR5cGU6Ci1Gck1zZ1Nldj1TZWxlY3QgdGhlIHNldmVyaXR5IGxldmVsIGZvciB0aGUgZm9sbG93aW5nIHByb2JsZW1zCi0KLSMKLSMgRW5kIFZhbGlkYXRpb24gQnVpbGRlciBGcmFtZXdvcmsgVUkgU3RyaW5ncwotIwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjZTQ4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBXVFBVSVBsdWdpbi5QTFVHSU5fSUQ7Ci0KLQkvLyBjb250ZXh0IGlkcyBmb3IgdGhlIFZhbGlkYXRpb24gUHJvcGVydGllcyBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0UgPSBQUkVGSVggKyAiLmp2cHAwMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX09WRVJSSURFID0gUFJFRklYICsgIi5qdnBwMDAwMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9CVUlMRF9OT1ZBTFNFTEVDVEVEID0gUFJFRklYICsgIi5qdnBwMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX0FVVE9CVUlMRCA9IFBSRUZJWCArICIuanZwcDAwMDQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQVVUT19OT0lOQ1ZBTFNFTEVDVEVEID0gUFJFRklYICsgIi5qdnBwMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX05PSU5DVkFMQ09ORklHID0gUFJFRklYICsgIi5qdnBwMDAwNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9BVVRPX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2cHAwMDIwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2cHAwMDMwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9CT1RIID0gUFJFRklYICsgIi5qdnBwMDAzMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEX0NBTk5PVF9IT05PVVJfQVVUTyA9IFBSRUZJWCArICIuanZwcDAwMzIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfT1ZFUlJJREVfRU5BQkxFRF9DQU5OT1RfSE9OT1VSX01BTlVBTCA9IFBSRUZJWCArICIuanZwcDAwMzMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfUkVCVUlMRF9FTkFCTEVEID0gUFJFRklYICsgIi5qdnBwMDA0MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9NQVhfTUVTU0FHRVMgPSBQUkVGSVggKyAiLmp2cHAwMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UgPSBQUkVGSVggKyAiLmp2Z3AwMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX09WRVJSSURFID0gUFJFRklYICsgIi5qdmdwMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9ESVNBQkxFX0FMTF9FTkFCTEVEID0gUFJFRklYICsgIi5qdmdwMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9SRUJVSUxEX0RJU0FCTEVEID0gUFJFRklYICsKLQkvLyAiLmp2Z3AwMDExIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRU5BQkxFRCA9IFBSRUZJWCArICIuanZncDAwMjAiOyAvLyROT04tTkxTLTEkCi0JLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19ESVNBQkxFRF9BVVRPQlVJTEQgPSBQUkVGSVggKwotCS8vICIuanZncDAwMjEiOyAvLyROT04tTkxTLTEkCi0JLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19ESVNBQkxFRF9OT0lOQ1ZBTFNFTEVDVEVEID0gUFJFRklYCi0JLy8gKyAiLmp2Z3AwMDIyIjsgLy8kTk9OLU5MUy0xJAotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRElTQUJMRURfTk9JTkNWQUxDT05GSUcgPSBQUkVGSVggKwotCS8vICIuanZncDAwMjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfTUFYX01FU1NBR0VTID0gUFJFRklYICsgIi5qdmdwMDAzMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZjI1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKLQotLyoqCi0gKiBEaWFsb2cgdXNlZCB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSB2YWxpZGF0b3IgZGVsZWdhdGUgZnJvbSB0aGUgbGlzdCBvZgotICogcmVnaXN0ZXJlZCBkZWxlZ2F0ZXMgZm9yIGEgZ2l2ZW4gZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIGRlc2NyaXB0b3IuCi0gICAqLwotICBwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yOwotCi0gIC8qKgotICAgKiBUaGUgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlIElELgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZGVsZWdhdGVJRDsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyB0aGUgZGlhbG9nIG9uIHRoZSBnaXZlbiBzaGVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICB0aGUgZGlhbG9nJ3MgcGFyZW50LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgaWQKLSAgICogCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlECi0gICAqICAgICAgICAgIHRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbGlkYXRvciBkZWxlZ2F0ZS4KLSAgICovCi0gIHB1YmxpYyBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIGRlbGVnYXRlSUQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLSAgICBkZWxlZ2F0aW5nVmFsaWRhdG9yRGVzY3JpcHRvciA9IHZtZDsKLSAgICB0aGlzLmRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUlEOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgIGdldFNoZWxsKCkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRlbGVnYXRlc0RpYWxvZ1RpdGxlKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkRGF0YSBsYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBsYWJlbERhdGEud2lkdGhIaW50ID0gMjUwOwotICAgIGxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLSAgICBTdHJpbmcgZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUgPSBkZWxlZ2F0aW5nVmFsaWRhdG9yRGVzY3JpcHRvci5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotICAgIGxhYmVsLnNldFRleHQoZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBzZXBhcmF0b3JEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoc2VwYXJhdG9yRGF0YSk7Ci0KLSAgICBDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotICAgIEdyaWRMYXlvdXQgZ3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGdyb3VwTGF5b3V0KTsKLQotICAgIExhYmVsIGNvbWJvTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICBjb21ib0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgIGNvbWJvTGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRlbGVnYXRlc0NvbWJvTGFiZWwpOwotICAgIAotICAgIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBHcmlkRGF0YSBjb21ib0dyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgY29tYm8uc2V0TGF5b3V0RGF0YShjb21ib0dyaWREYXRhKTsKLQotICAgIGZpbmFsIENvbWJvVmlld2VyIGNvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLSAgICBjb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IERlbGVnYXRlc0NvbnRlbnRQcm92aWRlcigpKTsKLSAgICBjb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWxlZ2F0ZXNMYWJlbFByb3ZpZGVyKCkpOwotICAgIFN0cmluZyB0YXJnZXRJRCA9IGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQotICAgIGNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgewotCi0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBzZXREZWxlZ2F0ZUlEKCgoVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldElkKCkpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgY29tYm9WaWV3ZXIuc2V0SW5wdXQodGFyZ2V0SUQpOwotCi0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIHNlbGVjdGVkID0gVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKHRhcmdldElELCBkZWxlZ2F0ZUlEKTsKLQotICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBzZWxlY3RlZCB9KSk7Ci0gICAgfQotCi0gICAgTGFiZWwgZW5kU2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBlbmRTZXBhcmF0b3JEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7IAotICAgIGVuZFNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGVuZFNlcGFyYXRvckRhdGEpOwotICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGNvbnRlbnRzIGZvciB0aGUgZGVsZWdhdGUgdmFsaWRhdG9ycyBjb21ibyBib3guCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGNsYXNzIERlbGVnYXRlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHRhcmdldElEID0gKFN0cmluZykgaW5wdXRFbGVtZW50OwotICAgICAgTWFwIGRlbGVnYXRlc0J5SUQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlbGVnYXRlRGVzY3JpcHRvcnModGFyZ2V0SUQpOwotICAgICAgCi0gICAgICBpZiAoZGVsZWdhdGVzQnlJRCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgfQotCi0gICAgICByZXR1cm4gZGVsZWdhdGVzQnlJRC52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgbGFiZWxzL2ltYWdlcyBmb3IgdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBjb21ibyBib3gKLSAgICogCi0gICAqIEBhdXRob3IgdmJhY2l1bAotICAgKiAKLSAgICovCi0gIHByaXZhdGUgZmluYWwgY2xhc3MgRGVsZWdhdGVzTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFByb3ZpZGVzIHRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbGlkYXRvciBkZWxlZ2F0ZSBJRC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVsZWdhdGVJRCgpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGVJRDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlIElELgotICAgKiAKLSAgICogQHBhcmFtIGRlbGVnYXRlSUQKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXREZWxlZ2F0ZUlEKFN0cmluZyBkZWxlZ2F0ZUlEKQotICB7Ci0gICAgdGhpcy5kZWxlZ2F0ZUlEID0gZGVsZWdhdGVJRDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjZkMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqIAotICogQSBzcGVjaWFsaXplZCBjb250ZW50IHByb3ZpZGVyIHRvIHNob3cgYSBsaXN0IG9mIGVkaXRvciBwYXJ0cy4KLSAqIFRoaXMgY2xhc3MgaGFzIGJlZW4gY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0Lkxpc3RDb250ZW50UHJvdmlkZXIKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBhIGdlbmVyaWMgc29sdXRpb24gaXMgbWFkZSBhdmFpbGFibGUuCi0gKi8gCi1wdWJsaWMgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQlMaXN0IGZDb250ZW50czsJCi0KLQlwdWJsaWMgTGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQlpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0KQotCQkJcmV0dXJuIGZDb250ZW50cy50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KSAKLQkJCWZDb250ZW50cz0gKExpc3QpbmV3SW5wdXQ7Ci0JCWVsc2UKLQkJCWZDb250ZW50cz0gbnVsbDsKLQkJLy8gd2UgdXNlIGEgZml4ZWQgc2V0LgotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgbykgewotCQlyZXR1cm4gZkNvbnRlbnRzICE9IG51bGwgJiYgIWZDb250ZW50cy5jb250YWlucyhvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDc4MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIC8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW47Ci0KLS8qKgotICogQSBnZW5lcmljIHNhdmUgZmlsZXMgZGlhbG9nLiBUaGUgYnVsayBvZiB0aGUgY29kZQotICogZm9yIHRoaXMgZGlhbG9nIHdhcyB0YWtlbiBmcm9tIHRoZSBKRFQgcmVmYWN0b3JpbmcKLSAqIHN1cHBvcnQgaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU2F2ZUhlbHBlci4KLSAqIFRoaXMgY2xhc3MgaXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IgcmV1c2UgYW1vdW5nIGNvbXBvbmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmlsZXNEaWFsb2cgZXh0ZW5kcyBMaXN0RGlhbG9nIHsKLQkKLQlwdWJsaWMgU2F2ZUZpbGVzRGlhbG9nKFNoZWxsIHBhcmVudCkKLQl7Ci0JICBzdXBlcihwYXJlbnQpOwotCSAgc2V0VGl0bGUoVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcyk7IAotCSAgc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOwotCSAgc2V0TGFiZWxQcm92aWRlcihjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkpOwotCSAgc2V0TWVzc2FnZShWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlKTsgCi0JICBzZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSAKLQl7Ci0JCUNvbXBvc2l0ZSByZXN1bHQ9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQkJYm9vbGVhbiBmQWxsb3dTYXZlQWx3YXlzID0gdHJ1ZTsKLQkJaWYgKGZBbGxvd1NhdmVBbHdheXMpIHsKLQkJCWZpbmFsIEJ1dHRvbiBjaGVjaz0gbmV3IEJ1dHRvbihyZXN1bHQsIFNXVC5DSEVDSyk7Ci0JCQljaGVjay5zZXRUZXh0KFZhbGlkYXRpb25VSU1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZSk7IAotCQkJLy9jaGVjay5zZXRTZWxlY3Rpb24oUmVmYWN0b3JpbmdTYXZlUHJlZmVyZW5jZXMuZ2V0U2F2ZUFsbEVkaXRvcnMoKSk7Ci0JCQljaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJICB0cnkKLQkJCQkgIHsKLQkJCQkgICAgR2xvYmFsQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJCSAgICBjb25maWcuc2V0U2F2ZUF1dG9tYXRpY2FsbHkoY2hlY2suZ2V0U2VsZWN0aW9uKCkpOwotCQkJCSAgICBjb25maWcuc3RvcmUoKTsKLQkJCQkgIH0KLQkJCQkgIGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKQotCQkJCSAgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKFZhbGlkYXRpb25VSVBsdWdpbi5nZXRCdW5kbGVOYW1lKCkpLmxvZyhMZXZlbC5XQVJOSU5HLCAKLQkJCQkJCVZhbGlkYXRpb25VSU1lc3NhZ2VzLlVuYWJsZVRvU2F2ZSArIGV4Yyk7Ci0JCQkJICB9Ci0JCQkJICAKLQkJCQl9Ci0JCQl9KTsKLQkJCWFwcGx5RGlhbG9nRm9udChyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJfQotCQl9OwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTNhZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIC8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgdGhlIHNhdmUgZGlydHkgZmlsZXMgZGlhbG9nLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZpbGVzSGVscGVyIHsKLQotCS8qKgotCSAqIFJldHJlaXZlIGFuIGFycmF5IG9mIElFZGl0b3JQYXJ0cyByZXByZXNlbnRpbmcgYWxsIHRoZSBkaXJ0eQotCSAqIGVkaXRvcnMgb3BlbiBmb3IgdGhlIGZpbGVzIHByb3ZpZGVkIGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqIAkJCUEgbGlzdCBvZiBJRmlsZXMuCi0JICogQHJldHVybgotCSAqIAkJCUFuIGFycmF5IG9mIElFZGl0b3JQYXJ0cyBjb250YWluaW5nIGFsbCB0aGUgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGZpbGVzIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoTGlzdCBmaWxlcykgewotCQlTZXQ8SUVkaXRvcklucHV0PiBpbnB1dHMgPSBuZXcgSGFzaFNldDxJRWRpdG9ySW5wdXQ+KCk7Ci0JCUxpc3Q8SUVkaXRvclBhcnQ+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PElFZGl0b3JQYXJ0PigpOwotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykgewotCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotCQkJCWZvciAoaW50IHogPSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykgewotCQkJCQlJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJCQkJaWYgKGZpbGVzLmNvbnRhaW5zKGZpbGVJbnB1dC5nZXRGaWxlKCkpKSB7Ci0JCQkJCQkJaWYgKCFpbnB1dHMuY29udGFpbnMoaW5wdXQpKSB7Ci0JCQkJCQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQkJCQkJCQlyZXN1bHQuYWRkKGVwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBJRWRpdG9yUGFydFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0NTI3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCXByb3RlY3RlZCBWYWxpZGF0aW9uTWVudUFjdGlvbiBkZWxlZ2F0ZTsKLQotCXB1YmxpYyBWYWxpZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsaWRhdGUpOwotCQlkZWxlZ2F0ZSA9IG5ldyBWYWxpZGF0aW9uTWVudUFjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRvIHJlYWN0IHRvIHNlbGVjdGlvbiBjaGFuZ2VzOyBob3dldmVyLCBpZiB0aGUKLQkgKiBzdXBlciBtZXRob2QgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBvdmVycmlkaW5nIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgbmV3IHNlbGVjdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbGVjdGlvbik7Ci0KLQkJcmV0dXJuIGlzRW5hYmxlZCgpOyAvLyAiRW5hYmxlZCIgaXMgc2V0IGJ5IHRoZSBkZWxlZ2F0ZS4KLQl9Ci0KLQkvKioKLQkgKiBJZiBhIHN1YmNsYXNzIG9mIFZhbGlkYXRlQWN0aW9uIGVuYWJsZXMgdGhpcyBtZW51IGFjdGlvbiBvbiBhIHR5cGUgdGhhdCBpcyBub3QgYW4gSVJlc291cmNlLAotCSAqIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIElSZXNvdXJjZVtdIHRoYXQgcmVwcmVzZW50IHRoYXQgb2JqZWN0LiBJZiBudWxsIGlzIHJldHVybmVkLCB0aGUKLQkgKiBvYmplY3Qgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgdXNlciB3aWxsIG5vdCBiZSBub3RpZmllZCB0aGF0IHRoZSBvYmplY3Qgd2FzIG5vdCB2YWxpZGF0ZWQuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB1cGRhdGVTZWxlY3Rpb24gYW5kIHJ1biBhcmUgY2FsbGVkLiAoVGhlIHJlc3VsdCBvZiB0aGlzCi0JICogbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIHZhbGlkYXRlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0UmVzb3VyY2UoT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzN2Y2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Kb2IgZXh0ZW5kcyBKb2IgewotCi0KLQlwcml2YXRlIE1hcCBwcm9qZWN0czsKLQlwdWJsaWMgVmFsaWRhdGlvbkpvYihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3RzTWFwKE1hcCBwcm9qZWN0cyl7Ci0JCXRoaXMucHJvamVjdHMgPSBwcm9qZWN0czsKLQl9Ci0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRQcm9qZWN0cygpIHsKLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uTWVudUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25NZW51QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjgwODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25NZW51QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5NYW51YWxWYWxpZGF0aW9uUnVubmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcG9wLXVwIG1lbnUgaXRlbSAiUnVuIFZhbGlkYXRpb24iIFdoZW4gdGhlIGl0ZW0gaXMgc2VsZWN0ZWQsIHRoaXMKLSAqIGFjdGlvbiB0cmlnZ2VycyBhIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QsIHVzaW5nIGFsbCBjb25maWd1cmVkLCBlbmFibGVkIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVudUFjdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVNlbGVjdGlvbiAJCV9jdXJyZW50U2VsZWN0aW9uOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGlzcGxheSAJCV9jdXJyZW50RGlzcGxheTsKLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgX2ZvbGRlclZpc2l0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIF9wcm9qZWN0VmlzaXRvcjsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IF9zZWxlY3RlZFJlc291cmNlczsKLQotCXB1YmxpYyBWYWxpZGF0aW9uTWVudUFjdGlvbigpIHsKLQkJLy8gY2FjaGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoaXMgYWN0aW9uIGlzIGZvcmtlZC4gQWZ0ZXIgdGhlIGFjdGlvbiBpcyBmb3JrZWQsCi0JCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpIHJldHVybnMgbnVsbC4KLQkJX2N1cnJlbnREaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7IAotCQlfc2VsZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiAoX2N1cnJlbnREaXNwbGF5ID09IG51bGwpID8gRGlzcGxheS5nZXRDdXJyZW50KCkgOiBfY3VycmVudERpc3BsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3aXphcmQncyBzaGVsbC4KLQkgKi8KLQlTaGVsbCBnZXRTaGVsbCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwgJiYgZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlTaGVsbFtdIHNoZWxscyA9IGRpc3BsYXkuZ2V0U2hlbGxzKCk7Ci0JCQlpZiAoc2hlbGxzLmxlbmd0aCA+IDApCi0JCQkJc2hlbGwgPSBzaGVsbHNbMF07Ci0JCX0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1hcCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIEVhY2gga2V5IG9mIHRoZSBtYXAgaXMgYW4gSVByb2plY3QsIGFuZCB0aGUgdmFsdWUgaXMgYQotCSAqIFNldCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIGluIHRoYXQgcHJvamVjdC4gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgbm90aGluZyBlbHNlIGluCi0JICogdGhlIHByb2plY3QgaXMgc2VsZWN0ZWQsIGEgZnVsbCB2YWxpZGF0aW9uIChudWxsIHZhbHVlKSB3aWxsIGJlIGRvbmUgb24gdGhlIHByb2plY3QuIElmIGEKLQkgKiBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgc29tZSBmaWxlcy9mb2xkZXJzIGluIHRoZSBwcm9qZWN0IGFyZSBhbHNvIHNlbGVjdGVkLCBvbmx5IHRoZQotCSAqIGZpbGVzL2ZvbGRlcnMgd2lsbCBiZSB2YWxpZGF0ZWQuIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBhbHNvCi0JICogdmFsaWRhdGVkLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBsb2FkU2VsZWN0ZWQoVmFsaWRhdGVBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIEdSSyBwcmV2aW91c2x5IHRoaXMgZGlkIG5vdCBkbyBhIGNsZWFyLCBidXQgSSBjb3VsZG4ndCB1bmRlcnN0YW5kIHdoeSB0aGF0IHdvdWxkIGJlIHNvIEkgYW0gZm9yY2luZyBhIGNsZWFyCi0JCS8vIEdSSyBJbiBteSB0ZXN0aW5nLCBub3QgZG9pbmcgYSBjbGVhciBjYXVzZWQgZHVwbGljYXRlIHZhbGlkYXRpb25zCi0JCV9zZWxlY3RlZFJlc291cmNlcy5jbGVhcigpOwotCQlpZiAoKF9jdXJyZW50U2VsZWN0aW9uID09IG51bGwpIHx8IF9jdXJyZW50U2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAKLQkJCSEoX2N1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpcmV0dXJuIG51bGw7Ci0JCQotCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF9jdXJyZW50U2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbClhZGRTZWxlY3RlZChhY3Rpb24sIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBfc2VsZWN0ZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkKFZhbGlkYXRlQWN0aW9uIGFjdGlvbiwgT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlhZGRWaXNpdG9yKChJUHJvamVjdCkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWFkZFNlbGVjdGVkKChJRmlsZSkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJYWRkVmlzaXRvcigoSUZvbGRlcikgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKGlzVmFsaWRUeXBlKGdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCkpKSB7Ci0JCQlhZGRTZWxlY3RlZChhY3Rpb24sZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBOb3QgYSB2YWxpZCBpbnB1dCB0eXBlLiBNdXN0IGJlIElQcm9qZWN0LCBJSmF2YVByb2plY3QsIG9yIElSZXNvdXJjZS4KLQkJCS8vIElmIHRoaXMgVmFsaWRhdGlvbk1lbnVBY3Rpb24gaXMgYSBkZWxlZ2F0ZSBvZiBWYWxpZGF0ZUFjdGlvbiwgaXMKLQkJCS8vIHRoZSBpbnB1dCB0eXBlIHJlY29nbml6ZWQgYnkgdGhlIFZhbGlkYXRlQWN0aW9uPwotCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gYWN0aW9uLmdldFJlc291cmNlKHNlbGVjdGVkKTsKLQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJYWRkU2VsZWN0ZWQoYWN0aW9uLCByZXNvdXJjZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF2YWxpZCkgewotCQkJCS8vIFN0b3AgcHJvY2Vzc2luZy4gKFRoaXMgYWxsb3dzIHRoZSAiUnVuIFZhbGlkYXRpb24iIG1lbnUgaXRlbQotCQkJCS8vIHRvIGdyYXkgb3V0IG9uY2UgYXQgbGVhc3Qgb25lIG5vbi12YWxpZGF0YWJsZSBlbGVtZW50IGlzIHNlbGVjdGVkLikKLQkJCQlfc2VsZWN0ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRFeHRlbmRlZFR5cGUoT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKTsKLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gc2VsZWN0ZWQgOiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSB8fCBvYmplY3QgaW5zdGFuY2VvZiBJRm9sZGVyOwotCX0KLQotCi0Jdm9pZCBhZGRTZWxlY3RlZChJUmVzb3VyY2Ugc2VsZWN0ZWQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHNlbGVjdGVkLmdldFByb2plY3QoKTsKLQkJYm9vbGVhbiBhZGRlZCA9IF9zZWxlY3RlZFJlc291cmNlcy5jb250YWluc0tleShwcm9qZWN0KTsKLQkJU2V0PElSZXNvdXJjZT4gY2hhbmdlZFJlcyA9IG51bGw7Ci0JCWlmIChhZGRlZCkgewotCQkJLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwsIHRoZSBlbnRpcmUgcHJvamVjdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQgYW55d2F5LgotCQkJY2hhbmdlZFJlcyA9IF9zZWxlY3RlZFJlc291cmNlcy5nZXQocHJvamVjdCk7Ci0JCQlpZiAoY2hhbmdlZFJlcyA9PSBudWxsKXJldHVybjsKLQkJCQotCQl9IGVsc2UgewotCQkJY2hhbmdlZFJlcyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKLQkJfQotCQlpZiAoY2hhbmdlZFJlcy5hZGQoc2VsZWN0ZWQpKSB7Ci0JCQlfc2VsZWN0ZWRSZXNvdXJjZXMucHV0KHByb2plY3QsIGNoYW5nZWRSZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZpc2l0b3IoSUZvbGRlciBzZWxlY3RlZCkgewotCQkvLyBhZGQgdGhlIGZvbGRlciBhbmQgaXRzIGNoaWxkcmVuCi0JCXRyeSB7Ci0JCQlzZWxlY3RlZC5hY2NlcHQoZ2V0Rm9sZGVyVmlzaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCVZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgSVJlc291cmNlVmlzaXRvciBnZXRGb2xkZXJWaXNpdG9yKCkgewotCQlpZiAoX2ZvbGRlclZpc2l0b3IgPT0gbnVsbCkgewotCQkJX2ZvbGRlclZpc2l0b3IgPSBuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzKSB7Ci0JCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQlhZGRTZWxlY3RlZChyZXMpOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbgotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIF9mb2xkZXJWaXNpdG9yOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkVmlzaXRvcihJUHJvamVjdCBzZWxlY3RlZCkgewotCQkvLyBhZGQgdGhlIGZvbGRlciBhbmQgaXRzIGNoaWxkcmVuCi0JCWlmKCFzZWxlY3RlZC5pc0FjY2Vzc2libGUoKSlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlzZWxlY3RlZC5hY2NlcHQoZ2V0UHJvamVjdFZpc2l0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgZ2V0UHJvamVjdFZpc2l0b3IoKSB7Ci0JCWlmIChfcHJvamVjdFZpc2l0b3IgPT0gbnVsbCkgewotCQkJX3Byb2plY3RWaXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgewotCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcilhZGRTZWxlY3RlZChyZXMpOwotCQkJCQkKLQkJCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuCi0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gX3Byb2plY3RWaXNpdG9yOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiBpbnZva2VkLiBUaGlzIG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgd29yay4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICBBY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgcGx1Zy1pbiBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVZhbGlkYXRlQWN0aW9uIHZhY3Rpb24gPSBudWxsOwotCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgVmFsaWRhdGVBY3Rpb24pIHsKLQkJCXZhY3Rpb24gPSAoVmFsaWRhdGVBY3Rpb24pIGFjdGlvbjsKLQkJfQotCQlmaW5hbCBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cyA9IGxvYWRTZWxlY3RlZCh2YWN0aW9uKTsKLQkJaWYgKChwcm9qZWN0cyA9PSBudWxsKSB8fCAocHJvamVjdHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIHRoZSBmaWxlcyBhcmVuJ3Qgc2F2ZWQgZG8gbm90IHJ1biB2YWxpZGF0aW9uLgotCQlpZighaGFuZGxlRmlsZXNUb1NhdmUocHJvamVjdHMpKXJldHVybjsKLQotCQlib29sZWFuIGNvbmZpcm0gPSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpCi0JCQkuZ2V0Q29uZmlybURpYWxvZygpOwotCQlNYW51YWxWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKHByb2plY3RzLCB0cnVlLCBmYWxzZSwgY29uZmlybSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcCBoYXMgY2hhbmdlZC4gUGx1Zy1pbiBwcm92aWRlciBjYW4gdXNlIGl0IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5Ci0JICogb2YgdGhlIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCi0JICogCi0JICogPHA+Ci0JICogQWN0aW9uIGRlbGVnYXRlIGNhbm5vdCBiZSBub3RpZmllZCBhYm91dCBzZWxlY3Rpb24gY2hhbmdlcyBiZWZvcmUgaXQgaXMgbG9hZGVkLiBGb3IgdGhhdAotCSAqIHJlYXNvbiwgY29udHJvbCBvZiBhY3Rpb24ncyBlbmFibGUgc3RhdGUgc2hvdWxkIGFsc28gYmUgcGVyZm9ybWVkIHRocm91Z2ggc2ltcGxlIFhNTCBydWxlcwotCSAqIGRlZmluZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQuIFRoZXNlIHJ1bGVzIGFsbG93IGVuYWJsZSBzdGF0ZSBjb250cm9sIGJlZm9yZSB0aGUgZGVsZWdhdGUKLQkgKiBoYXMgYmVlbiBsb2FkZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIHBsdWctaW4gYWN0aW9uCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGRlc2t0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlfY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJYm9vbGVhbiBlbmFibGVkID0gcXVpY2tDaGVjayhzZWxlY3Rpb24pOwotCQkKLQkJLy8gRG9uJ3QgZm9yY2UgdGhlIHBsdWctaW4gdG8gYmUgYWN0aXZhdGVkIGp1c3QgdG8gY2hlY2sgdGhpcyBzZXR0aW5nLgotCQlpZiAoZW5hYmxlZCAmJiBWYWxpZGF0aW9uUGx1Z2luLmlzQWN0aXZhdGVkKCkgJiYgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmlzQWN0aXZhdGVkKCkpewotCQkJZW5hYmxlZCA9IGhhc01hbnVhbFZhbGlkYXRvcnMoc2VsZWN0aW9uKTsKLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBxdWljayBjaGVjayBvbiB0aGUgc2VsZWN0aW9uLCBzbyBzZWUgaWYgd2Uga25vdyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiBmYWxzZSBpZiB3ZSBhcmUgc3VyZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgaXQuIFJldHVybiB0cnVlIGlmIHdlIGFyZSBzdGlsbCBub3Qgc3VyZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcXVpY2tDaGVjayhJU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybiBmYWxzZTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCU9iamVjdCBzZWwgPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWwgIT0gbnVsbCl7Ci0JCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClzZWw7Ci0JCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIGFueSBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSBtYW51YWwgdmFsaWRhdG9ycyBlbmFibGVkLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWFudWFsVmFsaWRhdG9ycyhJU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCQkJCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbil7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IHNlbCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoc2VsIGluc3RhbmNlb2YgSVJlc291cmNlKXsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlzZWw7Ci0JCQkJCWlmIChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5oYXNWYWxpZGF0b3JzKHJlc291cmNlLCB0cnVlLCBmYWxzZSkpcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQkJCi0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7IAotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYW55IGZpbGVzIHRoYXQgbXVzdCBiZSBzYXZlZCBwcmlvciB0byBydW5uaW5nCi0JICogdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKiAJCQlUaGUgbGlzdCBvZiBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgdmFsaWRhdGVkLgotCSAqIEByZXR1cm4KLQkgKiAJCQlUcnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gc2F2ZWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaWxlc1RvU2F2ZShNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cykKLQl7Ci0JICBMaXN0IGZpbGVMaXN0ID0gZ2V0SUZpbGVzKHByb2plY3RzKTsKLSAgICAgIGZpbmFsIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gU2F2ZUZpbGVzSGVscGVyLmdldERpcnR5RWRpdG9ycyhmaWxlTGlzdCk7Ci0gICAgICBpZihkaXJ0eUVkaXRvcnMgPT0gbnVsbCB8fCBkaXJ0eUVkaXRvcnMubGVuZ3RoID09IDApcmV0dXJuIHRydWU7Ci0gICAgICBib29sZWFuIHNhdmVBdXRvbWF0aWNhbGx5ID0gZmFsc2U7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2F2ZUF1dG9tYXRpY2FsbHkgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpKS5nZXRTYXZlQXV0b21hdGljYWxseSgpOwotICAgICAgfQotICAgICAgY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgIAkvLyBJbiB0aGlzIGNhc2Ugc2ltcGx5IGRlZmF1bHQgdG8gZmFsc2UuCi0gICAgICB9Ci0gICAgICBTYXZlRmlsZXNEaWFsb2cgc2ZEaWFsb2cgPSBudWxsOwotICAgICAgaWYoIXNhdmVBdXRvbWF0aWNhbGx5KQotICAgICAgewotCSAgICBzZkRpYWxvZyA9IG5ldyBTYXZlRmlsZXNEaWFsb2coVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCSAgICBzZkRpYWxvZy5zZXRJbnB1dChBcnJheXMuYXNMaXN0KGRpcnR5RWRpdG9ycykpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZihzYXZlQXV0b21hdGljYWxseSB8fCBzZkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKXsKLSAgICAJICBQcm9ncmVzc01vbml0b3JEaWFsb2cgY3R4ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgICAgICAKLSAgICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7Ci0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAkgIHRyeSB7Ci0gICAgICAgICAgICAJCSAgbW9uaXRvci5iZWdpblRhc2soVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmluZywgZGlydHlFZGl0b3JzLmxlbmd0aCk7Ci0gICAgICAgICAgICAJCSAgaW50IG51bURpcnR5RWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bURpcnR5RWRpdG9yczsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgCSAgZGlydHlFZGl0b3JzW2ldLmRvU2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJICB9IGZpbmFsbHkgewotICAgICAgICAgICAgCQkgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIAotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3R4LnJ1bihmYWxzZSwgdHJ1ZSwgcnVubmFibGUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAJICBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotICAgICAgICAgIH0KLSAgICAgIH0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3Q8SUZpbGU+IGdldElGaWxlcyhNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cykgewotCQlMaXN0PElGaWxlPiBmaWxlTGlzdCA9IG5ldyBMaW5rZWRMaXN0PElGaWxlPigpOwotCQlmb3IoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzLmtleVNldCgpKSB7Ci0JCSAgZm9yKElSZXNvdXJjZSByZXNvdXJjZSA6IHByb2plY3RzLmdldChwcm9qZWN0KSkgewotCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSlmaWxlTGlzdC5hZGQoKElGaWxlKXJlc291cmNlKTsKLQkJICB9Ci0JCX0KLQkJcmV0dXJuIGZpbGVMaXN0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTYzYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogLwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgVmFsaWRhdGlvbiBVSS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkudmFsaWRhdGlvbnVpIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZlBhZ2VfYWx3YXlzX3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuYWJsZVRvU2F2ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxSZXN1bHRzOwotCi0JLy8gcmVzdWx0cyB2YWxpZGF0aW5nIG9uZSByZXNvdXJjZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEVycm9yMVJlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxFcnJvcnNSZXNvdXJjZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsV2FybjFSZXNvdXJjZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsV2FyblJlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxJbmZvMVJlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxJbmZvUmVzb3VyY2UxOwotCi0JLy8gcmVzdWx0cyB2YWxpZGF0aW5nIG11bHRpcGxlIHJlc291cmNlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEVycm9yMVJlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxFcnJvcnNSZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsV2FybjFSZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsV2FyblJlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxJbmZvMVJlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxJbmZvUmVzb3VyY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsU3VjY2VzczsKLQkKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBWYWxpZGF0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3BsdWdpbi9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4YWNiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIHRvIHRoZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgY2xhc3MgbmVlZHMgdG8gYmUKLSAqIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBvcGVyYXRpb24gZnJvbSBhIElSdW5uYWJsZUNvbnRleHQuCi0gKiAKLSAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dAotICogQHNlZSBWYWxpZGF0aW9uVUlQbHVnaW4jZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MgQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjg6NDUgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCXByaXZhdGUgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgaGVhZGxlc3NSdW5uYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBudWxsOwotCXByaXZhdGUgVmFsaWRhdGlvbk9wZXJhdGlvbiB2YWxpZGF0aW9uT3BlcmF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlCi0JICogICAgICAgICAgICAgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElXb3Jrc3BhY2VSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXNldEhlYWRsZXNzUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSVdvcmtzcGFjZVJ1bm5hYmxlIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXNldFdvcmtzcGFjZVJ1bm5hYmxlKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKFZhbGlkYXRpb25PcGVyYXRpb24gb3ApIHsKLQkJc2V0VmFsaWRhdGlvbk9wZXJhdGlvbihvcCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgZ2V0V29ya3NwYWNlUnVubmFibGUoKQotCSAqLwotCXByb3RlY3RlZCBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRIZWFkbGVzc1J1bm5hYmxlKCkgewotCQlyZXR1cm4gaGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZVJ1bm5hYmxlIGdldFdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQlyZXR1cm4gd29ya3NwYWNlUnVubmFibGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGdldEhlYWRsZXNzUnVubmFibGUoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0SGVhZGxlc3NSdW5uYWJsZSgpLnJ1bihtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gKGdldFdvcmtzcGFjZVJ1bm5hYmxlKCkgPT0gbnVsbCkgPyB2YWxpZGF0aW9uT3BlcmF0aW9uIDogZ2V0V29ya3NwYWNlUnVubmFibGUoKTsKLQkJCQlpZiAocnVubmFibGUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIHNldFdvcmtzcGFjZVJ1bm5hYmxlKElXb3Jrc3BhY2VSdW5uYWJsZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRIZWFkbGVzc1J1bm5hYmxlKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG5ld0hlYWRsZXNzUnVubmFibGUpIHsKLQkJaGVhZGxlc3NSdW5uYWJsZSA9IG5ld0hlYWRsZXNzUnVubmFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V29ya3NwYWNlUnVubmFibGUoSVdvcmtzcGFjZVJ1bm5hYmxlIG5ld1dvcmtzcGFjZVJ1bm5hYmxlKSB7Ci0JCXdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3V29ya3NwYWNlUnVubmFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsaWRhdGlvbk9wZXJhdGlvbihWYWxpZGF0aW9uT3BlcmF0aW9uIG9wKSB7Ci0JCXZhbGlkYXRpb25PcGVyYXRpb24gPSBvcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1ZhbGlkYXRpb25VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3BsdWdpbi9WYWxpZGF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMzU0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1ZhbGlkYXRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblVJUGx1Z2luIGV4dGVuZHMgV1RQVUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25VSVBsdWdpbiBfcGx1Z2luID0gbnVsbDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fUFJPUF9GSUxFX05BTUUgPSAidmFsaWRhdGVfdWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zIn07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBWYWxpZGF0aW9uVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChfcGx1Z2luID09IG51bGwpIHsKLQkJCV9wbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIFZBTElEQVRJT05fUFJPUF9GSUxFX05BTUU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uVUlQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gX3BsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGVkIFN0cmluZyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhQbGF0Zm9ybS5nZXRCdW5kbGUoVkFMSURBVElPTl9QTFVHSU5fSUQpLCBrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHlvdSBuZWVkIHRvIHJ1biBvbmUgb2Ygb3VyIGhlYWRsZXNzIG9wZXJhdGlvbnMgaW4gdGhlCi0JICogVUkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoSVdvcmtzcGFjZVJ1bm5hYmxlIGFXb3Jrc3BhY2VSdW5uYWJsZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihhV29ya3NwYWNlUnVubmFibGUpOwotCX0KLQotLy8JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLS8vCQlyZXR1cm4gbmV3IFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyk7Ci0vLwl9Ci0KLQkvLyBOZWVkIGEgdGhpcmQsIFZhbGlkYXRpb25PcGVyYXRpb24gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCwgYmVjYXVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uCi0JLy8gaXMgYm90aCBhbiBJV29ya3NwYWNlUnVubmFibGUgYW5kIGFuIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzLiBUaGlzIG1ldGhvZCB3aWxsCi0JLy8gZXhpc3Qgb25seSB3aGlsZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBleGlzdHMuCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihvcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlci5zZXRSZXNvdXJjZVV0aWxDbGFzcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLnVpLlVJUmVzb3VyY2VVdGlsLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJVVJMIGdpZkltYWdlVVJMID0gZ2V0SW1hZ2VVUkwoa2V5KTsKLQkJaWYgKGdpZkltYWdlVVJMICE9IG51bGwpCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChnaWZJbWFnZVVSTCk7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gVmFsaWRhdGlvblVJUGx1Z2luLmdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcga2V5LCBCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBnaWYgPSAiLyIgKyBrZXkgKyAiLmdpZiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBJQ09OX0RJUlMubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGggPSBuZXcgUGF0aChJQ09OX0RJUlNbaV0pLmFwcGVuZChnaWYpOwotCQkJaWYgKFBsYXRmb3JtLmZpbmQoYnVuZGxlLHBhdGgpID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKCBidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOwotCQlnZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFdyaXRlIGEgbWVzc2FnZSBpbnRvIHRoZSBsb2cuIAotCSAqIAotCSAqIFdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiBvZiBtb3ZpbmcgdG8gYSBuZXcgYXBwcm9hY2ggZm9yIGxvY2FsaXplZCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgbmV3IAotCSAqIGFwcHJvYWNoIGZvciBleGNlcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eSBtZXNzYWdlIHNldmVyaXR5LCBzZWUgSVN0YXVzCi0JICogQHBhcmFtIG1lc3NhZ2UgYSBsb2NhbGl6ZWQgbWVzc2FnZQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQlnZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCi0JfQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWViMmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlclJ1bGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzJiYgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgVmFsaWRhdG9yLlYyKXJldHVybiBfdmFsQWRhcHRvcjsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzICYmIGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlckdyb3VwKXJldHVybiBfZmdBZGFwdG9yOwotCQlpZiAoYWRhcHRlclR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgJiYgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyUnVsZSlyZXR1cm4gX3J1bGVBZGFwdG9yOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJV29ya2JlbmNoQWRhcHRlci5jbGFzcyB9OwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX3ZhbEFkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChWYWxpZGF0b3IuVjIpIG8pLmdldEdyb3VwcygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoVmFsaWRhdG9yLlYyKSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBZGFwdGVyIF9mZ0FkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChGaWx0ZXJHcm91cCkgbykuZ2V0UnVsZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCUZpbHRlckdyb3VwIGZnID0gKEZpbHRlckdyb3VwKSBvOwotCQkJcmV0dXJuIGZnLmdldERpc3BsYXlhYmxlVHlwZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX3J1bGVBZGFwdG9yID0gbmV3IElXb3JrYmVuY2hBZGFwdGVyKCkgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlGaWx0ZXJSdWxlIHJ1bGUgPSAoRmlsdGVyUnVsZSkgbzsKLQkJCXJldHVybiBydWxlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSW1hZ2VOYW1lcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSW1hZ2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM1ZGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0ltYWdlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWw7Ci0KLS8qKgotICogTmFtZXMgb2YgdGhlIGltYWdlcy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VOYW1lcyB7Ci0JCi0JU3RyaW5nIG9rVGFibGUgCQk9ICJva190YmwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGZhaWxUYWJsZSAJPSAiZmFpbF90YmwiOyAvLyROT04tTkxTLTEkCQotCVN0cmluZyBzZXR0aW5ncyAJPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGRpc2FibGVkIAk9ICJfZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTZhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvTWFudWFsVmFsaWRhdGlvblJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nLlJlc3VsdHNEaWFsb2c7Ci0KLS8qKgotICogUnVuIGEgbWFudWFsIHZhbGlkYXRpb24uIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIE1hbnVhbFZhbGlkYXRpb25SdW5uZXIgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgewotCQotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gCV9wcm9qZWN0czsKLQlwcml2YXRlIGJvb2xlYW4JX2lzTWFudWFsOwotCXByaXZhdGUgYm9vbGVhbglfaXNCdWlsZDsKLQlwcml2YXRlIGJvb2xlYW4JX3Nob3dSZXN1bHRzOwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzZWxlY3RlZCBwcm9qZWN0cyBhbmQvb3IgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0cwotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkIHByb2plY3RzLiBUaGUga2V5IGlzIGFuIElQcm9qZWN0IGFuZCB0aGUgdmFsdWUgaXMKLQkgKiAgICAgICAgICAgIHRoZSBTZXQgb2YgSVJlc291cmNlcyB0aGF0IHdlcmUgc2VsZWN0ZWQuIE9mdGVuIHRoaXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgZXZlcnkgcmVzb3VyY2UgaW4gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsCi0JICogICAgICAgICAgICBJcyB0aGlzIGEgbWFudWFsIHZhbGlkYXRpb24/Ci0JICogCi0JICogQHBhcmFtIGlzQnVpbGQKLQkgKiAgICAgICAgICAgIElzIHRoaXMgYSBidWlsZCBiYXNlZCB2YWxpZGF0aW9uPwotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVzdWx0cwotCSAqICAgICAgICAgICAgV2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBmaW5pc2hlZCwgc2hvdyB0aGUgcmVzdWx0cyBpbiBhIGRpYWxvZwotCSAqICAgICAgICAgICAgYm94LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cywgYm9vbGVhbiBpc01hbnVhbCwgCi0JCQlib29sZWFuIGlzQnVpbGQsIGJvb2xlYW4gc2hvd1Jlc3VsdHMpewotCQlNYW51YWxWYWxpZGF0aW9uUnVubmVyIG1lID0gbmV3IE1hbnVhbFZhbGlkYXRpb25SdW5uZXIocHJvamVjdHMsIGlzTWFudWFsLCBpc0J1aWxkLCBzaG93UmVzdWx0cyk7Ci0JCW1lLnNjaGVkdWxlKCk7Ci0JfQotCQotCXByaXZhdGUgTWFudWFsVmFsaWRhdGlvblJ1bm5lcihNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cywgYm9vbGVhbiBpc01hbnVhbCwgCi0JCQlib29sZWFuIGlzQnVpbGQsIGJvb2xlYW4gc2hvd1Jlc3VsdHMpewotCQlzdXBlcihWYWxVSU1lc3NhZ2VzLlZhbGlkYXRpb24pOwotCQlfcHJvamVjdHMgPSBwcm9qZWN0czsKLQkJX2lzTWFudWFsID0gaXNNYW51YWw7Ci0JCV9pc0J1aWxkID0gaXNCdWlsZDsKLQkJX3Nob3dSZXN1bHRzID0gc2hvd1Jlc3VsdHM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZpbmFsIFZhbE9wZXJhdGlvbiB2byA9IFZhbGlkYXRpb25SdW5uZXIudmFsaWRhdGUoX3Byb2plY3RzLCBfaXNNYW51YWwsIF9pc0J1aWxkLCBtb25pdG9yKTsKLQkJZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQkJaW50IHJlc291cmNlQ291bnQgPSAwOwotCQlmb3IgKFNldCBzIDogX3Byb2plY3RzLnZhbHVlcygpKXJlc291cmNlQ291bnQgKz0gcy5zaXplKCk7Ci0JCWZpbmFsIGludCBmaW5hbFJlc291cmNlQ291bnQgPSByZXNvdXJjZUNvdW50OwotCQlpZiAodm8uZ2V0UmVzdWx0KCkuaXNDYW5jZWxlZCgpKXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCi0JCWlmIChfc2hvd1Jlc3VsdHMpewotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlSdW5uYWJsZSBydW4gPSBuZXcgUnVubmFibGUoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IHZvLmdldFJlc3VsdCgpOwotCQkJCQlSZXN1bHRzRGlhbG9nIHJkID0gbmV3IFJlc3VsdHNEaWFsb2cobnVsbCwgdnIsIHRpbWUsIGZpbmFsUmVzb3VyY2VDb3VudCk7Ci0JCQkJCXJkLm9wZW4oKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQkJZGlzcGxheS5hc3luY0V4ZWMocnVuKTsJCQkKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9WYWxVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9WYWxVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzUwN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvVmFsVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBWYWxVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1ZBTElEQVRJT05fQlVJTERFUjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX0JVVFRPTl9PVkVSUklERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX1ZBTExJU1RfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9CVVRUT05fRU5BQkxFQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfQlVUVE9OX0RJU0FCTEVBTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9NTlVfTUFOVUFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfTU5VX0JVSUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfTU5VX1NFVFRJTkdTOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1dzU2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG9Ob3RTaG93UmVzdWx0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxlZ2F0ZXNEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxlZ2F0ZXNDb21ib0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yc1dhcm5pbmdzOwotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQkZfRVhDX0lOVEVSTkFMX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZCRl9FWENfSU5URVJOQUxfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQkZfRVhDX0lOVkFMSURfUkVHSVNURVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTQUJMRV9WQUxJREFUSU9OOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BTlVBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVUlMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVRUSU5HUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkJGX1VJX05PX1ZBTElEQVRPUlNfSU5TVEFMTEVEOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX2Fsd2F5c19zYXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmUGFnZV9hbHdheXNfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmUGFnZUNvbmZpcm1EaWFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlOwotCQotCS8qIFZhbGlkYXRvciBGaWx0ZXJzICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmZE5vRmlsdGVyczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckNvbmZpZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJIZWxwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1dHRvbkFkZEdyb3VwSW5jbHVkZTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uQWRkR3JvdXBFeGNsdWRlOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdXR0b25BZGRSdWxlOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdXR0b25SZW1vdmU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxFeHRlbnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsUHJvamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxGYWNldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxDb250ZW50VHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEVuYWJsZVByb2plY3RTcGVjaWZpYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjRXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NQcm9qZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjRmFjZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NDb250ZW50VHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25TdGF0dXM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyU3VtbWFyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uU3VjY2Vzc2Z1bDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGcldpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGclNlbGVjdEZpbHRlclR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGaWxlRXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRmlsZUV4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyQ2FzZVNlbnNpdGl2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckV4YWN0TWF0Y2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGb2xkZXJPckZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGb2xkZXJPckZpbGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckJyb3dzZUZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGaWxlRmlsdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyQnJvd3NlRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRm9sZGVyRmlsdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyUHJvamVjdE5hdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGclByb2plY3ROYXR1cmVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZhY2l0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRmFjaXRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckNvbnRlbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyQ29udGVudFR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGck1zZ1NldjsKLQkKLQkJCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVmFsVUlNZXNzYWdlcy5jbGFzcyk7Ci0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9GaWx0ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9GaWx0ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMjc2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvRmlsdGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlclJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuVmFsaWRhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLlZhbFVJTWVzc2FnZXM7Ci0KLS8qKgotICogRGlzcGxheSBhIGZpbHRlciBkaWFsb2cgZm9yIGEgcGFydGljdWxhciBWYWxpZGF0b3IsIHRoYXQgaXMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsdGVycyB0aGF0IGFyZSBhY3RpdmUgZm9yCi0gKiB0aGUgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkKLQkvKiogCi0JICogSWYgd2UgYXJlIGRvaW5nIHByb2plY3QgbGV2ZWwgZmlsdGVycyB0aGlzIHdpbGwgcG9pbnQgdG8gdGhlIHByb2plY3QuIElmIHRoaXMgaXMgbnVsbCBpZiB3ZSBhcmUgZG9pbmcKLQkgKiB3b3Jrc3BhY2UgbGV2ZWwgZmlsdGVycy4gCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdAlfcHJvamVjdDsKLQkKLQkvKiogCi0JICogQSBkZWVwIGNvcHkgb2YgdGhlIHZhbGlkYXRvciwgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGFzIGEgbW9kZWwgb2JqZWN0LCBhbmQgbm90IHdvcnJ5IGFib3V0IHRoZQotCSAqIHVzZXIgbm90IHNhdmluZyB0aGVpciBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIAlfdmFsaWRhdG9yOwotCQotCS8vIFRoZSBWMiB2ZXJzaW9uIG9mIF92YWxpZGF0b3IuCi0JcHJpdmF0ZSBWYWxpZGF0b3IuVjIJX3YyOwotCXByaXZhdGUgVHJlZVZpZXdlcgkJX3RyZWU7Ci0JcHJpdmF0ZSBDb21ibwkJCV9kZWxlZ2F0aW5nOwotCXByaXZhdGUgSUFkYXB0ZXJGYWN0b3J5IF9hZGFwdG9yRmFjdG9yeSA9IG5ldyBBZGFwdGVyRmFjdG9yeSgpOwotCQotCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBJbmNsdWRlOwotCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBFeGNsdWRlOwotCXByaXZhdGUgQnV0dG9uCQlfYWRkUnVsZTsKLQlwcml2YXRlIEJ1dHRvbgkJX3JlbW92ZTsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIJX25vZGVDaGFuZ2VkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBGaWx0ZXJHcm91cAlfc2VsZWN0ZWRHcm91cDsKLQlwcml2YXRlIEZpbHRlclJ1bGUJX3NlbGVjdGVkUnVsZTsKLQkKLQlwcml2YXRlIENvbWJvW10JCV9tZXNzYWdlU2V2OwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIF9tZXNzYWdlcyA9IG5ldyBTdHJpbmdbXXsKLQkJVmFsTWVzc2FnZXMuU2V2RXJyb3IsIFZhbE1lc3NhZ2VzLlNldldhcm5pbmcsIFZhbE1lc3NhZ2VzLlNldklnbm9yZX07Ci0JCi0JcHJpdmF0ZSBTaGVsbAkJX3NoZWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGRpYWxvZyB0aGF0IGtub3dzIGhvdyB0byBjaGFuZ2UgYSB2YWxpZGF0b3IncyBmaWx0ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHVwZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCB0aGUgZmlsdGVycyBhcmUgYmVpbmcgYWRkZWQgdG8uIElmIHRoZXNlIGFyZSB3b3Jrc3BhY2UKLQkgKiBsZXZlbCBmaWx0ZXJzLCB0aGVuIHRoaXMgbXVzdCBiZSBudWxsLiAKLQkgKi8KLQlwdWJsaWMgRmlsdGVyRGlhbG9nKFNoZWxsIHNoZWxsLCBWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJc3VwZXIoc2hlbGwpOwotCQlfc2hlbGwgPSBzaGVsbDsKLQkJc2V0U2hlbGxTdHlsZShTV1QuQ0xPU0V8U1dULk1JTnxTV1QuTUFYfFNXVC5SRVNJWkUpOwotCQlfdmFsaWRhdG9yID0gdmFsaWRhdG9yLmNvcHkoKTsKLQkJX3YyID0gX3ZhbGlkYXRvci5hc1YyVmFsaWRhdG9yKCk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KE5MUy5iaW5kKFZhbFVJTWVzc2FnZXMuZmRUaXRsZSwgX3ZhbGlkYXRvci5nZXROYW1lKCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWlmIChfdjIgPT0gbnVsbCl7Ci0JCQluZXcgTGFiZWwoYywgU1dULk5PTkUpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5mZE5vRmlsdGVycyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMYWJlbCBibHVyYiA9IG5ldyBMYWJlbChjLCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLQkJCWJsdXJiLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQkJYmx1cmIuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZpbHRlckhlbHApOwotCQkJCi0JCQlfdHJlZSA9IG5ldyBUcmVlVmlld2VyKGMsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJCV90cmVlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCVBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkucmVnaXN0ZXJBZGFwdGVycyhfYWRhcHRvckZhY3RvcnksIFZhbGlkYXRvci5WMi5jbGFzcyk7Ci0JCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJHcm91cC5jbGFzcyk7Ci0JCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJSdWxlLmNsYXNzKTsKLQkJCV90cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJCV90cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0JCQlfdHJlZS5zZXRJbnB1dChfdjIpOwotCQkJX3RyZWUuZXhwYW5kQWxsKCk7Ci0JCQkKLQkJCWFkZEJ1dHRvbnMoYyk7Ci0JCQkKLQkJCVN0cmluZyBkZWxlZ2F0aW5nSWQgPSBfdjIuZ2V0RGVsZWdhdGluZ0lkKCk7Ci0JCQlpZiAoZGVsZWdhdGluZ0lkICE9IG51bGwpewotCQkJCWFkZERlbGVnYXRvclNlbGVjdGlvbihjKTsKLQkJCX0KLQkJCQkKLQkJCV9ub2RlQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCV9zZWxlY3RlZEdyb3VwID0gbnVsbDsKLQkJCQkJX3NlbGVjdGVkUnVsZSA9IG51bGw7Ci0JCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBGaWx0ZXJHcm91cCl7Ci0JCQkJCQkJX3NlbGVjdGVkR3JvdXAgPSAoRmlsdGVyR3JvdXApc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoc2VsLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRmlsdGVyUnVsZSl7Ci0JCQkJCQkJX3NlbGVjdGVkUnVsZSA9IChGaWx0ZXJSdWxlKXNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJCQotCQkJX3RyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKF9ub2RlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQotCQkJYWRkTWVzc2FnZU1hcHBpbmdzKGMpOwotCQl9Ci0JCXJldHVybiBjOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRCdXR0b25zKENvbXBvc2l0ZSBjKSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuVE9QKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIGZhbHNlLCBmYWxzZSwgMSwgMSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJX2FkZEdyb3VwSW5jbHVkZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRklMTCB8IFNXVC5DRU5URVIpOwotCQlfYWRkR3JvdXBJbmNsdWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CdXR0b25BZGRHcm91cEluY2x1ZGUpOwotCQlfYWRkR3JvdXBJbmNsdWRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCQkKLQkJX2FkZEdyb3VwSW5jbHVkZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRHcm91cChmYWxzZSk7CQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkR3JvdXAoZmFsc2UpOwkJCQkJCQotCQkJfQotCQkJCi0JCX0pOwotCQkJCi0JCV9hZGRHcm91cEV4Y2x1ZGUgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZJTEwgfCBTV1QuQ0VOVEVSKTsKLQkJX2FkZEdyb3VwRXhjbHVkZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uQWRkR3JvdXBFeGNsdWRlKTsKLQkJX2FkZEdyb3VwRXhjbHVkZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQkJCi0JCV9hZGRHcm91cEV4Y2x1ZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkR3JvdXAodHJ1ZSk7CQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkR3JvdXAodHJ1ZSk7CQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSk7Ci0KLQkJX2FkZFJ1bGUgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZJTEwgfCBTV1QuQ0VOVEVSKTsKLQkJX2FkZFJ1bGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkJ1dHRvbkFkZFJ1bGUpOwotCQlfYWRkUnVsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQkJX2FkZFJ1bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9JdCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9JdCgpOwotCQkJfQotCQkJCi0JCQlwcml2YXRlIHZvaWQgZG9JdCgpewotCQkJCU5ld0ZpbHRlclJ1bGUgbmZyID0gbmV3IE5ld0ZpbHRlclJ1bGUoX3Byb2plY3QpOwotCQkJCVdpemFyZERpYWxvZyB3ZCA9IG5ldyBXaXphcmREaWFsb2coX3NoZWxsLCBuZnIpOwotCQkJCXdkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWludCByYyA9IHdkLm9wZW4oKTsKLQkJCQlpZiAocmMgPT0gV2l6YXJkRGlhbG9nLkNBTkNFTClyZXR1cm47Ci0JCQkJCi0JCQkJRmlsdGVyUnVsZSBydWxlID0gbmZyLmdldFJ1bGUoKTsKLQkJCQlpZiAocnVsZSAhPSBudWxsKXsKLQkJCQkJX3NlbGVjdGVkR3JvdXAuYWRkKHJ1bGUpOwotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCi0JCV9yZW1vdmUgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZJTEwgfCBTV1QuQ0VOVEVSKTsKLQkJX3JlbW92ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQkJX3JlbW92ZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uUmVtb3ZlKTsKLQkJX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmUoKTsJCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlKCk7CQkJCQkJCi0JCQl9CQkJCQotCQl9KTsKLQkJCi0JCUJ1dHRvbiByZXN0b3JlID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GSUxMIHwgU1dULkNFTlRFUik7Ci0JCXJlc3RvcmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JCVN0cmluZyBkZWZhdWx0cyA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiZGVmYXVsdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN0b3JlLnNldFRleHQoZGVmYXVsdHMpOwotCQlyZXN0b3JlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc3RvcmVEZWZhdWx0cygpOwkJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXN0b3JlRGVmYXVsdHMoKTsJCQkJCQkKLQkJCX0JCQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzdG9yZURlZmF1bHRzKCkgewotCQlpZiAoX3YyICE9IG51bGwpewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaWQgPSBfdjIuZ2V0SWQoKTsKLQkJCQlWYWxpZGF0b3JbXSB2YWxzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0VmFsaWRhdG9ycygpOwotCQkJCWZvciAoVmFsaWRhdG9yIHYgOiB2YWxzKXsKLQkJCQkJaWYgKHYuZ2V0SWQoKS5lcXVhbHMoaWQpKXsKLQkJCQkJCV92YWxpZGF0b3IgPSB2OwotCQkJCQkJX3YyID0gdi5hc1YyVmFsaWRhdG9yKCk7Ci0JCQkJCQlfdHJlZS5zZXRJbnB1dChfdjIpOwotCQkJCQkJX3RyZWUuZXhwYW5kQWxsKCk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCQkKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRNZXNzYWdlTWFwcGluZ3MoQ29tcG9zaXRlIGMpIHsKLQkJaWYgKF92MiA9PSBudWxsKXJldHVybjsKLQkJTWFwPFN0cmluZyxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtYXBwaW5ncyA9IF92YWxpZGF0b3IuZ2V0TWVzc2FnZVNldHRpbmdzKCk7Ci0JCWlmIChtYXBwaW5ncyA9PSBudWxsIHx8IG1hcHBpbmdzLnNpemUoKSA9PSAwKXJldHVybjsKLQkJCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyTXNnU2V2KTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLS8vCQlMYWJlbCBoZWFkaW5nID0gbmV3IExhYmVsKGMsIFNXVC5MRUZUKTsKLS8vCQloZWFkaW5nLnNldFRleHQoVmFsVUlNZXNzYWdlcy5FcnJvcnNXYXJuaW5ncyk7Ci0vLwkJaGVhZGluZy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKSk7Ci0vLwkJaGVhZGluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJCi0JCV9tZXNzYWdlU2V2ID0gbmV3IENvbWJvW21hcHBpbmdzLnNpemUoKV07Ci0JCWludCBpPSAwOwotCQlmb3IgKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgOiBtYXBwaW5ncy52YWx1ZXMoKSl7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJbGFiZWwuc2V0VGV4dCgiICAgIiArIG1zLmdldExhYmVsKCkgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJQ29tYm8gc2V2ID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUklHSFQpOwotCQkJX21lc3NhZ2VTZXZbaSsrXSA9IHNldjsKLQkJCXNldi5zZXRJdGVtcyhfbWVzc2FnZXMpOwotCQkJc2V2LnNlbGVjdChtcy5nZXRDdXJyZW50KCkub3JkaW5hbCgpKTsKLQkJCXNldi5zZXREYXRhKG1zKTsKLQkJCXNldi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdChlKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdChlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJpdmF0ZSB2b2lkIHNlbGVjdChTZWxlY3Rpb25FdmVudCBlKXsKLQkJCQkJQ29tYm8gdyA9IChDb21ibyllLndpZGdldDsKLQkJCQkJTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtcyA9IChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nKXcuZ2V0RGF0YSgpOwotCQkJCQlpbnQgaSA9IHcuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJbXMuc2V0Q3VycmVudChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LnZhbHVlcygpW2ldKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQWRkIGEgY29tYm8gYm94IHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNoYW5nZSB3aGljaCBkZWxlZ2F0aW5nIHZhbGlkYXRvciB0byBjYWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREZWxlZ2F0b3JTZWxlY3Rpb24oQ29tcG9zaXRlIGMpIHsKLQkJTWFwIG1hcCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyhfdjIuZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkpOwotCQlpZiAobWFwID09IG51bGwpcmV0dXJuOwotCQkKLQkJQ29tcG9zaXRlIGxpbmUgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5OT05FKTsKLQkJbGluZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxpbmUsIFNXVC5DRU5URVIpOwotCQlsYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRGVsZWdhdGVzQ29tYm9MYWJlbCk7Ci0KLQkJCQkKLQkJX2RlbGVnYXRpbmcgPSBuZXcgQ29tYm8obGluZSwgU1dULlJFQURfT05MWSk7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1ttYXAuc2l6ZSgpXTsKLQkJZmluYWwgU3RyaW5nIGlkc1tdID0gbmV3IFN0cmluZ1ttYXAuc2l6ZSgpXTsKLQkJU3RyaW5nIHNlbGVjdGVkID0gbnVsbDsKLQkJSXRlcmF0b3IgaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDtpKyspewotCQkJVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIHZkID0gKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcilpdC5uZXh0KCk7Ci0JCQlpdGVtc1tpXSA9IHZkLmdldE5hbWUoKTsKLQkJCWlkc1tpXSA9IHZkLmdldElkKCk7Ci0JCQlpZiAodmQuZ2V0SWQoKS5lcXVhbHMoX3YyLmdldERlbGVnYXRpbmdJZCgpKSl7Ci0JCQkJc2VsZWN0ZWQgPSB2ZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJX2RlbGVnYXRpbmcuc2V0SXRlbXMoaXRlbXMpOwotCQlfZGVsZWdhdGluZy5zZXRUZXh0KHNlbGVjdGVkKTsKLQkJX2RlbGVnYXRpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgc2VsID0gX2RlbGVnYXRpbmcuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlfdjIuc2V0RGVsZWdhdGluZ0lkKGlkc1tzZWxdKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZmlsdGVyIGdyb3VwIHRvIHRoZSB2YWxpZGF0b3IuCi0JICogQHBhcmFtIGV4Y2x1ZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkR3JvdXAoYm9vbGVhbiBleGNsdWRlKXsKLQkJaWYgKF92MiA9PSBudWxsKXJldHVybjsKLQkJX3YyLmFkZChGaWx0ZXJHcm91cC5jcmVhdGUoZXhjbHVkZSkpOwotCQlyZWZyZXNoKCk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpewotCQlfdHJlZS5yZWZyZXNoKCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIHZhbGlkYXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKCl7Ci0JCWlmIChfc2VsZWN0ZWRSdWxlICE9IG51bGwpewotCQkJRmlsdGVyR3JvdXBbXSBncm91cHMgPSBfdjIuZ2V0R3JvdXBzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Z3JvdXBzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiAoZ3JvdXBzW2ldLnJlbW92ZShfc2VsZWN0ZWRSdWxlKSl7Ci0JCQkJCXJlZnJlc2goKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKF9zZWxlY3RlZEdyb3VwICE9IG51bGwpewotCQkJX3YyLnJlbW92ZShfc2VsZWN0ZWRHcm91cCk7Ci0JCQlyZWZyZXNoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCWlmIChfdjIgIT0gbnVsbCl7Ci0JCQlfYWRkR3JvdXBFeGNsdWRlLnNldEVuYWJsZWQoIVZhbGlkYXRvckhlbHBlci5oYXNFeGNsdWRlR3JvdXAoX3YyKSk7Ci0JCX0KLQkJX2FkZFJ1bGUuc2V0RW5hYmxlZChfc2VsZWN0ZWRHcm91cCAhPSBudWxsKTsKLQkJX3JlbW92ZS5zZXRFbmFibGVkKF9zZWxlY3RlZEdyb3VwICE9IG51bGwgfHwgX3NlbGVjdGVkUnVsZSAhPSBudWxsKTsKLQkJaWYgKF9tZXNzYWdlU2V2ICE9IG51bGwpewotCQkJTWFwPFN0cmluZyxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtc2dzID0gX3ZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKLQkJCWlmIChtc2dzICE9IG51bGwgJiYgX21lc3NhZ2VTZXYubGVuZ3RoID09IG1zZ3Muc2l6ZSgpKXsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJZm9yIChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zIDogbXNncy52YWx1ZXMoKSl7Ci0JCQkJCV9tZXNzYWdlU2V2W2krK10uc2VsZWN0KG1zLmdldEN1cnJlbnQoKS5vcmRpbmFsKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCVBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkudW5yZWdpc3RlckFkYXB0ZXJzKF9hZGFwdG9yRmFjdG9yeSk7Ci0JCWlmIChfdHJlZSAhPSBudWxsKV90cmVlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihfbm9kZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoNTUwLCA0NzUpOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvTmV3RmlsdGVyUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL05ld0ZpbHRlclJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyOTM1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvTmV3RmlsdGVyUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLlZhbFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBhZGRzIG5ldyBydWxlcyB0byB2YWxpZGF0b3JzLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld0ZpbHRlclJ1bGUgZXh0ZW5kcyBXaXphcmQgewotCQotCXByaXZhdGUgUGFnZTEgCQkJX3BhZ2UxOwotCXByaXZhdGUgSVdpemFyZFBhZ2UJCV9wYWdlMjsKLQkKLQlwcml2YXRlIElQcm9qZWN0CQlfcHJvamVjdDsKLQkKLQlwcml2YXRlIEZpbHRlclJ1bGUJCV9ydWxlOwotCQotCXB1YmxpYyBOZXdGaWx0ZXJSdWxlKElQcm9qZWN0IHByb2plY3QpewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCXNldFdpbmRvd1RpdGxlKFZhbFVJTWVzc2FnZXMuRnJXaXphcmQpOwotCQlfcGFnZTEgPSBuZXcgUGFnZTEocHJvamVjdCk7Ci0JCWFkZFBhZ2UoX3BhZ2UxKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7CQotCQlpZiAoX3BhZ2UyICE9IG51bGwpcmV0dXJuIF9wYWdlMi5pc1BhZ2VDb21wbGV0ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgRmlsdGVyUnVsZSBnZXRSdWxlKCl7Ci0JCXJldHVybiBfcnVsZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKF9wYWdlMiA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJRmlsdGVyV2l6YXJkUGFnZSBwYWdlID0gKEZpbHRlcldpemFyZFBhZ2UpX3BhZ2UyOwotCQlfcnVsZSA9IHBhZ2UuZ2V0RmlsdGVyUnVsZSgpOwotCQlyZXR1cm4gX3J1bGUgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgPT0gX3BhZ2UxKXsKLQkJCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyhmYWxzZSk7Ci0JCQlfcGFnZTIgPSByZXR1cm5PckJ1aWxkUGFnZShfcGFnZTEuZ2V0U2VsZWN0ZWRGaWx0ZXIoKSk7Ci0JCQlyZXR1cm4gX3BhZ2UyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElXaXphcmRQYWdlIHJldHVybk9yQnVpbGRQYWdlKGludCBzZWxlY3RlZEZpbHRlcikgewotCQkJSVdpemFyZFBhZ2UgcGFnZSA9ICBudWxsOwotCQkJc3dpdGNoIChzZWxlY3RlZEZpbHRlcil7Ci0JCQljYXNlIDA6Ci0JCQkJcGFnZSA9IG5ldyBGaWxlRXh0UGFnZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXBhZ2UgPSBuZXcgRmlsZVBhZ2UoX3Byb2plY3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXBhZ2UgPSBuZXcgUHJvamVjdFBhZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwYWdlID0gbmV3IEZhY2V0UGFnZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXBhZ2UgPSBuZXcgQ29udGVudFR5cGVQYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWFkZFBhZ2UocGFnZSk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFnZTEgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQkJCi0JCXByaXZhdGUgaW50IAkJX3NlbGVjdGVkRmlsdGVyOwotCQlwcml2YXRlIElQcm9qZWN0CV9wcm9qZWN0OwotCi0JCQotCQlwdWJsaWMgUGFnZTEoSVByb2plY3QgcHJvamVjdCl7Ci0JCQlzdXBlcigicGFnZTEiLCBWYWxVSU1lc3NhZ2VzLkZyU2VsZWN0RmlsdGVyVHlwZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTdHJpbmdbXSBsYWJlbHMgPSBudWxsOwotCQkJU3RyaW5nW10gZGVzYyA9IG51bGw7Ci0JCQlpZiAoX3Byb2plY3QgIT0gbnVsbCl7Ci0JCQkJbGFiZWxzID0gbmV3IFN0cmluZ1tde1ZhbFVJTWVzc2FnZXMuTGFiZWxFeHRlbnNpb24sIFZhbFVJTWVzc2FnZXMuTGFiZWxGaWxlLAotCQkJCQkJVmFsVUlNZXNzYWdlcy5MYWJlbENvbnRlbnRUeXBlfTsKLQkJCQkKLQkJCQlkZXNjID0gbmV3IFN0cmluZ1tde1ZhbFVJTWVzc2FnZXMuRGVzY0V4dGVuc2lvbiwgVmFsVUlNZXNzYWdlcy5EZXNjRmlsZSwKLQkJCQkJCVZhbFVJTWVzc2FnZXMuRGVzY0NvbnRlbnRUeXBlfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhYmVscyA9IG5ldyBTdHJpbmdbXXtWYWxVSU1lc3NhZ2VzLkxhYmVsRXh0ZW5zaW9uLCBWYWxVSU1lc3NhZ2VzLkxhYmVsRmlsZSwKLQkJCQkJCVZhbFVJTWVzc2FnZXMuTGFiZWxQcm9qZWN0cywgVmFsVUlNZXNzYWdlcy5MYWJlbEZhY2V0cywKLQkJCQkJCVZhbFVJTWVzc2FnZXMuTGFiZWxDb250ZW50VHlwZX07Ci0JCQkJCi0JCQkJZGVzYyA9IG5ldyBTdHJpbmdbXXtWYWxVSU1lc3NhZ2VzLkRlc2NFeHRlbnNpb24sIFZhbFVJTWVzc2FnZXMuRGVzY0ZpbGUsCi0JCQkJCQlWYWxVSU1lc3NhZ2VzLkRlc2NQcm9qZWN0cywgVmFsVUlNZXNzYWdlcy5EZXNjRmFjZXRzLCAKLQkJCQkJCVZhbFVJTWVzc2FnZXMuRGVzY0NvbnRlbnRUeXBlfTsKLQkJCX0KLQkJCQotCQkJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRvSXQoZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkb0l0KGUpOwotCQkJCX0KLQkJCQkKLQkJCQlwcml2YXRlIHZvaWQgZG9JdChTZWxlY3Rpb25FdmVudCBlKXsKLQkJCQkJaWYgKGUuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBCdXR0b24pewotCQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoYi5nZXREYXRhKCkgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKSBiLmdldERhdGEoKTsKLQkJCQkJCQlzZXRTZWxlY3RlZEZpbHRlcihpbmRleC5pbnRWYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCQlmb3IgKGludCBpPTA7IGk8bGFiZWxzLmxlbmd0aDsgaSsrKXsKLQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotCQkJCWJ1dHRvbi5zZXRUZXh0KGxhYmVsc1tpXSk7Ci0JCQkJYnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoaSkpOwkJCQotCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuV1JBUCkpLnNldFRleHQoZGVzY1tpXSk7Ci0JCQkJaWYgKGkgPT0gMClidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkJCQkKLQkJCX0JCQkKLQkJCXNldENvbnRyb2woY29udHJvbCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkRmlsdGVyKCkgewotCQkJcmV0dXJuIF9zZWxlY3RlZEZpbHRlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRmlsdGVyKGludCBzZWxlY3RlZEZpbHRlcikgewotCQkJX3NlbGVjdGVkRmlsdGVyID0gc2VsZWN0ZWRGaWx0ZXI7Ci0JCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVFeHRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgewotCQkKLQkJcHJpdmF0ZSBUZXh0IAlfcGF0dGVybjsKLQkJcHJpdmF0ZSBCdXR0b24JX2Nhc2U7Ci0JCQotCQlwdWJsaWMgRmlsZUV4dFBhZ2UoKXsKLQkJCXN1cGVyKCJmaWxlZXh0IiwgVmFsVUlNZXNzYWdlcy5GckZpbGVFeHRlbnNpb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNldENvbnRyb2woY29udHJvbCk7Ci0JCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZpbGVFeHRlbnNpb25MYWJlbCk7Ci0JCQlfcGF0dGVybiA9IG5ldyBUZXh0KGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJCV9wYXR0ZXJuLnNldEZvY3VzKCk7Ci0JCQlfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCV9jYXNlID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuQ0hFQ0spOwotCQkJX2Nhc2Uuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyQ2FzZVNlbnNpdGl2ZSk7Ci0JCQlfY2FzZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJX2Nhc2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORyxmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQkJCQotCQl9Ci0KLQkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKLQkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBGaWx0ZXJSdWxlLkZpbGVFeHQuY3JlYXRlRmlsZUV4dChfcGF0dGVybi5nZXRUZXh0KCksIF9jYXNlLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gX3BhdHRlcm4gIT0gbnVsbCAmJiBfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJfQotCQkKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgRmlsdGVyV2l6YXJkUGFnZSB7Ci0JCQotCQlwcml2YXRlIFRleHQgCV9wYXR0ZXJuOwotCQlwcml2YXRlIEJ1dHRvbglfYnJvd3NlRmlsZTsKLQkJcHJpdmF0ZSBCdXR0b24JX2Jyb3dzZUZvbGRlcjsKLQkJcHJpdmF0ZSBCdXR0b24JX2Nhc2U7Ci0JCQotCQlwcml2YXRlIElQcm9qZWN0CV9wcm9qZWN0OwotCQlwcml2YXRlIGludAkJCV90eXBlOwotCQkKLQkJcHVibGljIEZpbGVQYWdlKElQcm9qZWN0IHByb2plY3QpewotCQkJc3VwZXIoImZpbGUiLCBWYWxVSU1lc3NhZ2VzLkZyRm9sZGVyT3JGaWxlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzZXRDb250cm9sKGNvbnRyb2wpOwotCQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpKTsKLQkJCShuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpKS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJGb2xkZXJPckZpbGVMYWJlbCk7Ci0JCQlfcGF0dGVybiA9IG5ldyBUZXh0KGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJCV9wYXR0ZXJuLnNldEZvY3VzKCk7Ci0JCQlfcGF0dGVybi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgzMDAsIDE0KSk7Ci0JCQlfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCV9icm93c2VGaWxlID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUFVTSCk7Ci0JCQlfYnJvd3NlRmlsZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJCcm93c2VGaWxlKTsKLQkJCV9icm93c2VGaWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJYnJvd3NlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlicm93c2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJpdmF0ZSB2b2lkIGJyb3dzZSgpewotCQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coY29udHJvbC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCWZkLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZpbGVGaWx0ZXIpOwotCQkJCQlJUGF0aCBiYXNlID0gX3Byb2plY3QgPT0gbnVsbCA/IAotCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpIDoKLQkJCQkJCV9wcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0JCQkJCVN0cmluZyByb290ID0gbnVsbDsKLQkJCQkJaWYgKGJhc2UgIT0gbnVsbCl7Ci0JCQkJCQlyb290ID0gYmFzZS50b09TU3RyaW5nKCk7Ci0JCQkJCQlmZC5zZXRGaWx0ZXJQYXRoKHJvb3QpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlTdHJpbmcgZmlsZSA9IGZkLm9wZW4oKTsKLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCl7Ci0JCQkJCQlpZiAocm9vdCAhPSBudWxsICYmIGZpbGUuc3RhcnRzV2l0aChyb290KSAmJiBmaWxlLmxlbmd0aCgpID4gcm9vdC5sZW5ndGgoKSl7Ci0JCQkJCQkJZmlsZSA9IGZpbGUuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkrMSk7Ci0JCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUpOwotCQkJCQkJCWlmIChfcHJvamVjdCA9PSBudWxsKXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGaWxlOwotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQocGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGdWxsOwotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfSk7Ci0JCQkKLQkJCV9icm93c2VGb2xkZXIgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5QVVNIKTsKLQkJCV9icm93c2VGb2xkZXIuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyQnJvd3NlRm9sZGVyKTsKLQkJCV9icm93c2VGb2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlicm93c2UoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWJyb3dzZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwcml2YXRlIHZvaWQgYnJvd3NlKCl7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBmZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29udHJvbC5nZXRTaGVsbCgpKTsKLQkJCQkJZmQuc2V0TWVzc2FnZShWYWxVSU1lc3NhZ2VzLkZyRm9sZGVyRmlsdGVyKTsKLQkJCQkJSVBhdGggYmFzZSA9IF9wcm9qZWN0ID09IG51bGwgPyAKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKSA6IF9wcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0JCQkJCVN0cmluZyByb290ID0gbnVsbDsKLQkJCQkJaWYgKGJhc2UgIT0gbnVsbCl7Ci0JCQkJCQlyb290ID0gYmFzZS50b09TU3RyaW5nKCk7Ci0JCQkJCQlmZC5zZXRGaWx0ZXJQYXRoKHJvb3QpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBkaXIgPSBmZC5vcGVuKCk7Ci0JCQkJCWlmIChkaXIgIT0gbnVsbCl7Ci0JCQkJCQlpZiAocm9vdCAhPSBudWxsICYmIGRpci5zdGFydHNXaXRoKHJvb3QpICYmIGRpci5sZW5ndGgoKSA+IHJvb3QubGVuZ3RoKCkpewotCQkJCQkJCWRpciA9IGRpci5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSsxKTsKLQkJCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlyKTsKLQkJCQkJCQlpZiAoX3Byb2plY3QgPT0gbnVsbClwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQkJCV90eXBlID0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRm9sZGVyOwotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQocGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGdWxsOwotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoZGlyKTsJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJX2Nhc2UgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5DSEVDSyk7Ci0JCQlfY2FzZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJDYXNlU2Vuc2l0aXZlKTsKLQkJCV9jYXNlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlfY2FzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQl9Ci0KLQkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKLQkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBGaWx0ZXJSdWxlLmNyZWF0ZUZpbGUoX3BhdHRlcm4uZ2V0VGV4dCgpLCBfY2FzZS5nZXRTZWxlY3Rpb24oKSwgX3R5cGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9qZWN0UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBGaWx0ZXJXaXphcmRQYWdlewotCQkKLQkJcHJpdmF0ZSBDb21ibwkJX25hdHVyZXM7Ci0JCXByaXZhdGUgU3RyaW5nW10JX2lkczsKLQkJCi0JCXB1YmxpYyBQcm9qZWN0UGFnZSgpewotCQkJc3VwZXIoInByb2plY3QiLCBWYWxVSU1lc3NhZ2VzLkZyUHJvamVjdE5hdHVyZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJc2V0Q29udHJvbChjb250cm9sKTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQkobmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyUHJvamVjdE5hdHVyZUxhYmVsKTsKLQkJCQotCQkJSVByb2plY3ROYXR1cmVEZXNjcmlwdG9yW10gcG4gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0TmF0dXJlRGVzY3JpcHRvcnMoKTsKLQkJCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1twbi5sZW5ndGhdOwotCQkJX2lkcyA9IG5ldyBTdHJpbmdbcG4ubGVuZ3RoXTsKLQkJCWZvciAoaW50IGk9MDsgaTxwbi5sZW5ndGg7IGkrKyl7Ci0JCQkJX2lkc1tpXSA9IHBuW2ldLmdldE5hdHVyZUlkKCk7Ci0JCQkJaXRlbXNbaV0gPSBwbltpXS5nZXRMYWJlbCgpICsgIiAtICIgKyBfaWRzW2ldOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlfbmF0dXJlcyA9IG5ldyBDb21ibyhjb250cm9sLCBTV1QuRFJPUF9ET1dOKTsKLQkJCV9uYXR1cmVzLnNldEl0ZW1zKGl0ZW1zKTsKLQkJCV9uYXR1cmVzLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCQkJCi0JCX0KLQotCQlwdWJsaWMgRmlsdGVyUnVsZSBnZXRGaWx0ZXJSdWxlKCkgewotCQkJaWYgKCFpc1BhZ2VDb21wbGV0ZSgpKXJldHVybiBudWxsOwotCQkJaW50IGkgPSBfbmF0dXJlcy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKGkgPT0gLTEpcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXJldHVybiBGaWx0ZXJSdWxlLmNyZWF0ZVByb2plY3QoX2lkc1tpXSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJcmV0dXJuIF9uYXR1cmVzLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQl9Ci0JCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjZXRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgewotCQkKLQkJcHJpdmF0ZSBUZXh0CV9wYXR0ZXJuOwotCQkKLQkJcHVibGljIEZhY2V0UGFnZSgpewotCQkJc3VwZXIoImZhY2V0IiwgVmFsVUlNZXNzYWdlcy5GckZhY2l0LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzZXRDb250cm9sKGNvbnRyb2wpOwotCQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCShuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpKS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJGYWNpdExhYmVsKTsKLQkJCV9wYXR0ZXJuID0gbmV3IFRleHQoY29udHJvbCwgU1dULk5PTkUpOwotCQkJX3BhdHRlcm4uc2V0Rm9jdXMoKTsKLQkJCV9wYXR0ZXJuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDMwMCwgMTQpKTsKLQkJCV9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCi0JCXB1YmxpYyBGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKSB7Ci0JCQlpZiAoIWlzUGFnZUNvbXBsZXRlKCkpcmV0dXJuIG51bGw7Ci0JCQlGaWx0ZXJSdWxlIHJ1bGUgPSBGaWx0ZXJSdWxlLmNyZWF0ZUZhY2V0KF9wYXR0ZXJuLmdldFRleHQoKSk7Ci0JCQlyZXR1cm4gcnVsZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgewotCQlwcml2YXRlIFRleHQJX3BhdHRlcm47Ci0JCXByaXZhdGUgQnV0dG9uCV9leGFjdE1hdGNoOwotCQkKLQkJcHVibGljIENvbnRlbnRUeXBlUGFnZSgpewotCQkJc3VwZXIoImNvbnRlbnRUeXBlIiwgVmFsVUlNZXNzYWdlcy5GckNvbnRlbnRUeXBlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzZXRDb250cm9sKGNvbnRyb2wpOwotCQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCShuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpKS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJDb250ZW50VHlwZUxhYmVsKTsKLQkJCV9wYXR0ZXJuID0gbmV3IFRleHQoY29udHJvbCwgU1dULk5PTkUpOwotCQkJX3BhdHRlcm4uc2V0Rm9jdXMoKTsKLQkJCV9wYXR0ZXJuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDMwMCwgMTQpKTsKLQkJCV9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJX2V4YWN0TWF0Y2ggPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5DSEVDSyk7Ci0JCQlfZXhhY3RNYXRjaC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJFeGFjdE1hdGNoKTsKLQkJCV9leGFjdE1hdGNoLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlfZXhhY3RNYXRjaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCi0JCX0KLQotCQlwdWJsaWMgRmlsdGVyUnVsZSBnZXRGaWx0ZXJSdWxlKCkgewotCQkJaWYgKCFpc1BhZ2VDb21wbGV0ZSgpKXJldHVybiBudWxsOwotCQkJRmlsdGVyUnVsZSBydWxlID0gRmlsdGVyUnVsZS5jcmVhdGVDb250ZW50VHlwZShfcGF0dGVybi5nZXRUZXh0KCksIF9leGFjdE1hdGNoLmdldFNlbGVjdGlvbigpKTsKLQkJCXJldHVybiBydWxlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJfQotCQkKLQl9Ci0JCi0JaW50ZXJmYWNlIEZpbHRlcldpemFyZFBhZ2UgewotCQkvKioKLQkJICogQW5zd2VyIHRoZSBydWxlIHRoYXQgd2FzIGNyZWF0ZWQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHVzZXIgZGlkbid0IGNyZWF0ZSBhIG5ldyBydWxlLgotCQkgKi8KLQkJRmlsdGVyUnVsZSBnZXRGaWx0ZXJSdWxlKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9SZXN1bHRzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvUmVzdWx0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E0ODk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9SZXN1bHRzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLmRpYWxvZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLlZhbGlkYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLlZhbFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQSBkaWFsb2cgZm9yIGRpc3BsYXlpbmcgdGhlIHJlc3VsdHMgb2YgYSBtYW51YWwgdmFsaWRhdGlvbi4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRzRGlhbG9nIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgewotCQotCXByaXZhdGUgVmFsaWRhdGlvblJlc3VsdCAJX3Jlc3VsdDsKLQlwcml2YXRlIGxvbmcJCQkJX3RpbWU7Ci0JcHJpdmF0ZSBpbnQJCQkJCV9yZXNvdXJjZUNvdW50OwotCXByaXZhdGUgQnV0dG9uIF9oaWRlQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIGZvciBkaXNwbGF5aW5nIHZhbGlkYXRpb24gcmVzdWx0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhpcyBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSByZXN1bHRzIHRoZSByZXN1bHRzIG9mIHRoZSB2YWxpZGF0aW9uCi0JICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgdGhhdCB0aGUgdmFsaWRhdGlvbiB0b29rIGluIG1pbGxpc2Vjb25kcwotCSAqIEBwYXJhbSByZXNvdXJjZUNvdW50IHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzdWx0c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdGlvblJlc3VsdCByZXN1bHRzLCBsb25nIHRpbWUsIGludCByZXNvdXJjZUNvdW50KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJX3Jlc3VsdCA9IHJlc3VsdHM7Ci0JCV90aW1lID0gdGltZTsKLQkJX3Jlc291cmNlQ291bnQgPSByZXNvdXJjZUNvdW50OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJaWYoX2hpZGVCdXR0b24hPW51bGwpIHsKLQkJCVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldEdsb2JhbFByZWZlcmVuY2VzKCkuc2V0Q29uZmlybURpYWxvZyghX2hpZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWlmICghRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUpIHsKLQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCX0KLQkJc2V0UmV0dXJuQ29kZShPSyk7Ci0JCXJldHVybiBPSzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCkgPiAwKXJldHVybiBnZXRFcnJvckltYWdlKCk7Ci0JCWlmIChfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpID4gMClyZXR1cm4gZ2V0V2FybmluZ0ltYWdlKCk7Ci0JCXJldHVybiBnZXRJbmZvSW1hZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0JCWNyZWF0ZU1lc3NhZ2VBcmVhKHBhcmVudCk7Ci0JCQkJCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLnNwYW4oMiwgMSkuY3JlYXRlKCkpOwkJCi0JCWFkZEhpZGVDaGVja2JveChwYXJlbnQpOwotCi0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRIaWRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlfaGlkZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5hbGlnbihTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HKS5zcGFuKDIsIDEpLmFwcGx5VG8oX2hpZGVCdXR0b24pOwotCQlfaGlkZUJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRG9Ob3RTaG93UmVzdWx0cyk7Ci0JCWlmIChWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpLmdldENvbmZpcm1EaWFsb2coKSAmJiBfaGlkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJLy8gdGVsbCB0aGUgdXNlciB3aGVyZSB0byByZS1lbmFibGUgaXQ/Ci0JCX0KLQkJX2hpZGVCdXR0b24uc2V0U2VsZWN0aW9uKCFWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpLmdldENvbmZpcm1EaWFsb2coKSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbFJlc3VsdHMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIG9rID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgZmFsc2UpOwotCQlvay5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoKXsKLQkJaWYgKF9yZXNvdXJjZUNvdW50ID4gMSkgewotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID4gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsRXJyb3JzUmVzb3VyY2VzLCBuZXcgT2JqZWN0W117X3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCksIF9yZXNvdXJjZUNvdW50LCBNaXNjLmdldFRpbWVNUyhfdGltZSl9KTsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSA9PSAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxFcnJvcjFSZXNvdXJjZXMsIF9yZXNvdXJjZUNvdW50LCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCi0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSA+IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbFdhcm5SZXNvdXJjZXMsIG5ldyBPYmplY3RbXXtfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpfSk7Ci0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSA9PSAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxXYXJuMVJlc291cmNlcywgX3Jlc291cmNlQ291bnQsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7Ci0KLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpID4gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsSW5mb1Jlc291cmNlcywgbmV3IE9iamVjdFtde19yZXN1bHQuZ2V0U2V2ZXJpdHlJbmZvKCksIF9yZXNvdXJjZUNvdW50LCBNaXNjLmdldFRpbWVNUyhfdGltZSl9KTsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpID09IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm8xUmVzb3VyY2VzLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQkJfQotCQllbHNlIGlmIChfcmVzb3VyY2VDb3VudCA9PSAxKSB7Ci0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCkgPiAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxFcnJvcnNSZXNvdXJjZTEsIF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpLCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID09IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEVycm9yMVJlc291cmNlMSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPiAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxXYXJuUmVzb3VyY2UxLCBfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpLCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPT0gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsV2FybjFSZXNvdXJjZTEsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7Ci0KLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpID4gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsSW5mb1Jlc291cmNlMSwgX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpID09IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm8xUmVzb3VyY2UxLCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCQl9Ci0JCXJldHVybiBWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxTdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmQwNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJHbG9iYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5JbWFnZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLlZhbFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nLkZpbHRlckRpYWxvZzsKLQotLyoqCi0gKiBGcm9tIHRoaXMgcGFnZSB0aGUgdXNlciBjYW4gY29uZmlndXJlIGluZGl2aWR1YWwgdmFsaWRhdG9ycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbmQgaXRzIGlubmVyIGNsYXNzZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YKLSAqIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgSVZhbGlkYXRpb25QYWdlIF9wYWdlSW1wbCA9IG51bGw7Ci0JcHJpdmF0ZSBTaGVsbCBfc2hlbGw7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uUGFnZSB7Ci0JCUNvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JCWJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQkJYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotCQlDb21wb3NpdGUgZ2V0Q29udHJvbCgpOwotCi0JCXZvaWQgZGlzcG9zZSgpOwotCi0JCXZvaWQgbG9zZUZvY3VzKCk7Ci0KLQkJdm9pZCBnYWluRm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgSW52YWxpZFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKLQotCQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCQlwcml2YXRlIEdyaWRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQkJcHJpdmF0ZSBMYWJlbCBtZXNzYWdlTGFiZWwgPSBudWxsOwotCi0JCXB1YmxpYyBJbnZhbGlkUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlwYWdlID0gY3JlYXRlUGFnZShwYXJlbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgcGFnZSBpcyBhZGRlZCB0byB0aGUgUHJvcGVydGllcyBndWlkZSBpZiBzb21lIGludGVybmFsIHByb2JsZW0KLQkJICogb2NjdXJyZWQ7IGZvciBleGFtcGxlLCB0aGUgaGlnaGxpZ2h0ZWQgaXRlbSBpbiB0aGUgd29ya2JlbmNoIGlzIG5vdAotCQkgKiBhbiBJUHJvamVjdCAoYWNjb3JkaW5nIHRvIHRoaXMgcGFnZSdzIHBsdWdpbi54bWwsIHRoaXMgcGFnZSBpcyBvbmx5Ci0JCSAqIHZhbGlkIHdoZW4gYW4gSVByb2plY3QgaXMgc2VsZWN0ZWQpLgotCQkgKi8KLQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIERvbid0IGNyZWF0ZSB0aGUgZGVmYXVsdCBhbmQgYXBwbHkgYnV0dG9ucy4KLQkJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsCVNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjMSwgU1dULk5PTkUpOwotCQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRSk7Ci0KLQkJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSKTsKLQotCQkJY29tcG9zaXRlLnNldFNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2UgdGhpcyBwYWdlIG9jY3VycyB1bmRlciBpbnZhbGlkIGNpcmN1bXN0YW5jZXMsIHRoZXJlIGlzIG5vdGhpbmcKLQkJICogdG8gc2F2ZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJbWVzc2FnZUxhYmVsLmRpc3Bvc2UoKTsKLQkJCS8vIGxheW91dC5kaXNwb3NlKCk7Ci0JCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9zZUZvY3VzKCkgewotCQkJLy8gVGhpcyBwYWdlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgYW55IG90aGVyIHBhZ2UgaW4KLQkJCS8vIHRoZSB3aXphcmQsIHNvIGRvIG5vdGhpbmcuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7Ci0JCQkvLyBUaGlzIHBhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiBhbnkgb3RoZXIgcGFnZSBpbgotCQkJLy8gdGhlIHdpemFyZCwgc28gZG8gbm90aGluZy4KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdG9yTGlzdFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCQlwcml2YXRlIENvbXBvc2l0ZSBfcGFnZTsKLQkJcHJpdmF0ZSBDb21wb3NpdGUgX2NvbXBvc2l0ZTsKLQkJcHJpdmF0ZSBUYWJsZVZpZXdlciBfdmFsaWRhdG9yTGlzdDsKLQkJcHJpdmF0ZSBCdXR0b24gX2VuYWJsZUFsbEJ1dHRvbjsKLQkJcHJpdmF0ZSBCdXR0b24gX2Rpc2FibGVBbGxCdXR0b247Ci0JCXByaXZhdGUgQnV0dG9uIF9vdmVycmlkZTsKLQkJcHJpdmF0ZSBCdXR0b24gX3N1c3BlbmQ7Ci0JCXByaXZhdGUgQnV0dG9uIF9hdXRvU2F2ZTsKLQkJcHJpdmF0ZSBCdXR0b24gX2NvbmZpcm1CdXR0b247Ci0JCXByaXZhdGUgTGFiZWwgX2xpc3RMYWJlbDsKLQkJcHJpdmF0ZSBUYWJsZSBfdmFsaWRhdG9yc1RhYmxlOwotCQlwcml2YXRlIEdsb2JhbFByZWZlcmVuY2VzIAlfZ2xvYmFsUHJlZmVyZW5jZXMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQlwcml2YXRlIEdsb2JhbENvbmZpZ3VyYXRpb24gX2dsb2JhbENvbmZpZzsKLQkJcHJpdmF0ZSBWYWxpZGF0b3JbXSBfdmFsaWRhdG9yczsKLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdGhlIENoZWNrYm94VGFibGVWaWV3ZXIgaW4gdGhlCi0JCSAqIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSRWYWxpZGF0b3JMaXN0UGFnZSBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yW10pIHsKLQkJCQkJcmV0dXJuIChWYWxpZGF0b3JbXSkgaW5wdXRFbGVtZW50OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IKLQkJICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlJ3MgY2hlY2tib3hUYWJsZVZpZXdlciBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbClyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yKQotCQkJCQlyZXR1cm4gKChWYWxpZGF0b3IpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCi0JCQlwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZU5hbWUpIHsKLQkJCQlib29sZWFuIGlzRGlzYWJsZWQgPSAhX3ZhbGlkYXRvcnNUYWJsZS5pc0VuYWJsZWQoKTsKLQkJCQlpZiAoaXNEaXNhYmxlZClpbWFnZU5hbWUgPSBpbWFnZU5hbWUgKyBJbWFnZU5hbWVzLmRpc2FibGVkOwotCi0JCQkJcmV0dXJuIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCVZhbGlkYXRvciB2ID0gKFZhbGlkYXRvcikgZWxlbWVudDsKLQkJCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCQlyZXR1cm4gZ2V0SW1hZ2Uodi5pc01hbnVhbFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZSA6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKLQkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQkJcmV0dXJuIGdldEltYWdlKHYuaXNCdWlsZFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZSA6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKLQkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKLQkJCQkJaWYgKHYuYXNWMlZhbGlkYXRvcigpICE9IG51bGwpcmV0dXJuIGdldEltYWdlKEltYWdlTmFtZXMuc2V0dGluZ3MpOwotCQkJCQlpZiAodi5nZXREZWxlZ2F0aW5nSWQoKSAhPSBudWxsKXJldHVybiBnZXRJbWFnZShJbWFnZU5hbWVzLnNldHRpbmdzKTsKLQkJCQkJcmV0dXJuICBudWxsOwotCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKXJldHVybiAoKFZhbGlkYXRvcikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzb3J0IHRoZSBDaGVja2JveFRhYmxlVmlld2VyIGVsZW1lbnRzLgotCQkgKi8KLQkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25WaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJLy8gQ2FuJ3QgaW5zdGFudGlhdGUgVmlld2VyU29ydGVyIGJlY2F1c2UgaXQncyBhYnN0cmFjdCwgc28gdXNlIHRoaXMKLQkJCQkvLyBpbm5lciBjbGFzcyB0byByZXByZXNlbnQgaXQuCi0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFZhbGlkYXRvckxpc3RQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCV9wYWdlID0gY3JlYXRlUGFnZShwYXJlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldHVwVGFibGVDb2x1bW5zKFRhYmxlIHRhYmxlKSB7Ci0JCQlUYWJsZUNvbHVtbiB2YWxpZGF0b3JDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCXZhbGlkYXRvckNvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuVkFMSURBVE9SKTsKLQkJCXZhbGlkYXRvckNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJdmFsaWRhdG9yQ29sdW1uLnNldFdpZHRoKDMyMCk7Ci0JCQlUYWJsZUNvbHVtbiBtYW51YWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCW1hbnVhbENvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuTUFOVUFMKTsKLQkJCW1hbnVhbENvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJbWFudWFsQ29sdW1uLnNldFdpZHRoKDQwKTsKLQkJCVRhYmxlQ29sdW1uIGJ1aWxkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlidWlsZENvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQlVJTEQpOwotCQkJYnVpbGRDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJCWJ1aWxkQ29sdW1uLnNldFdpZHRoKDQwKTsKLQkJCVRhYmxlQ29sdW1uIHNldHRpbmdzQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlzZXR0aW5nc0NvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuU0VUVElOR1MpOwotCQkJc2V0dGluZ3NDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJCXNldHRpbmdzQ29sdW1uLnNldFdpZHRoKDUwKTsKLQkJfQotCi0JCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUGFnZShDb21wb3NpdGUgcGFyZW50KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlfZ2xvYmFsQ29uZmlnID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSk7Ci0JCQljb3B5VmFsaWRhdG9ycygpOwotCQkJCi0JCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJX2NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7Ci0JCQlzYzEuc2V0Q29udGVudChfY29tcG9zaXRlKTsKLQkJCV9jb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoX2NvbXBvc2l0ZSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLQkJCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUoX2NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCQlHcmlkTGF5b3V0IHZhbGlkYXRvckdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXZhbGlkYXRvckdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJdmFsaWRhdG9yR3JvdXAuc2V0TGF5b3V0KHZhbGlkYXRvckdyb3VwTGF5b3V0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFsaWRhdG9yR3JvdXAsIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UpOwotCi0JCQluZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJYWRkT3ZlcnJpZGUodmFsaWRhdG9yR3JvdXApOwotCQkJYWRkU3VzcGVuZCh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRBdXRvU2F2ZSh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRDb25maXJtKHZhbGlkYXRvckdyb3VwKTsKLQotCQkJX2xpc3RMYWJlbCA9IG5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgbGlzdExhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJbGlzdExhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlfbGlzdExhYmVsLnNldExheW91dERhdGEobGlzdExhYmVsRGF0YSk7Ci0JCQlfbGlzdExhYmVsLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX1ZBTExJU1RfVElUTEUpOwotCi0JCQlfdmFsaWRhdG9yc1RhYmxlID0gbmV3IFRhYmxlKHZhbGlkYXRvckdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE2MCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgdHJ1ZSkpOwotCi0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQkJX3ZhbGlkYXRvckxpc3QgPSBuZXcgVGFibGVWaWV3ZXIoX3ZhbGlkYXRvcnNUYWJsZSk7Ci0JCQlHcmlkRGF0YSB2YWxpZGF0b3JMaXN0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJdmFsaWRhdG9yTGlzdERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKLQkJCV92YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSh2YWxpZGF0b3JMaXN0RGF0YSk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uTGFiZWxQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldFNvcnRlcihuZXcgVmFsaWRhdGlvblZpZXdlclNvcnRlcigpKTsKLQkJCXNldHVwVGFibGVDb2x1bW5zKF92YWxpZGF0b3JzVGFibGUpOwotCi0JCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuYnV0dG9uICE9IDEpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IF92YWxpZGF0b3JzVGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoCi0JCQkJCQkJZS54LCBlLnkpKTsKLQkJCQkJaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IHRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCS8vIGl0ZW0gbm8gbG9uZ2VyIGV4aXN0cwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWludCBjb2x1bW5OdW1iZXI7Ci0JCQkJCWludCBjb2x1bW5zQ291bnQgPSBfdmFsaWRhdG9yc1RhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JCQkJCWlmIChjb2x1bW5zQ291bnQgPT0gMCkgewotCQkJCQkJLy8gSWYgbm8gVGFibGVDb2x1bW4sIFRhYmxlIGFjdHMgYXMgaWYgaXQgaGFzIGEgc2luZ2xlCi0JCQkJCQkvLyBjb2x1bW4gd2hpY2ggdGFrZXMgdGhlIHdob2xlIHdpZHRoLgotCQkJCQkJY29sdW1uTnVtYmVyID0gMDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbHVtbk51bWJlciA9IC0xOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykgewotCQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpOwotCQkJCQkJCWlmIChib3VuZHMuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJCQkJCWNvbHVtbk51bWJlciA9IGk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb2x1bW5OdW1iZXIgPT0gLTEpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQljb2x1bW5DbGlja2VkKGNvbHVtbk51bWJlcik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TWVudShjcmVhdGVDb250ZXh0TWVudSgpKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXN1cGVyLmZvY3VzR2FpbmVkKGUpOwotCQkJCQlpZiAoX3ZhbGlkYXRvcnNUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApIHsKLQkJCQkJCV92YWxpZGF0b3JzVGFibGUuc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCV9lbmFibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9CVVRUT05fRU5BQkxFQUxMKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybUVuYWJsZUFsbCgpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJZGlzcGxheUFuZExvZ0Vycm9yKAotCQkJCQkJCQlWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsCi0JCQkJCQkJCVZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9lbmFibGVBbGxCdXR0b24sIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UpOwotCi0JCQlfZGlzYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcigKLQkJCQkJCQkJVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLAotCQkJCQkJCQlWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChfZGlzYWJsZUFsbEJ1dHRvbiwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLQkJCS8vIEhhdmUgdG8gc2V0IHRoZSB0YWIgb3JkZXIgb3Igb25seSB0aGUgZmlyc3QgY2hlY2tib3ggaW4gYQotCQkJLy8gQ29tcG9zaXRlIGNhbiBiZSB0YWJiZWQgdG8uIChTZWVtcyB0byBhcHBseSBvbmx5IHRvIGNoZWNrYm94ZXMuIEhhdmUgdG8gdXNlIHRoZQotCQkJLy8gYXJyb3cga2V5IHRvIG5hdmlnYXRlIHRoZSBjaGVja2JveGVzLikKLQkJCXZhbGlkYXRvckdyb3VwLnNldFRhYkxpc3QobmV3IENvbnRyb2xbXSB7IF9zdXNwZW5kLCBfYXV0b1NhdmUsCi0JCQkJX3ZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKSwgX2VuYWJsZUFsbEJ1dHRvbiwgX2Rpc2FibGVBbGxCdXR0b24gfSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMoKTsKLQotCQkJYXBwbHlEaWFsb2dGb250KF9jb21wb3NpdGUpOwotCQkJX2NvbXBvc2l0ZS5zZXRTaXplKF9jb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLQkJCXJldHVybiBfY29tcG9zaXRlOwotCQl9Ci0JCQotCQkvKioKLQkJICogTWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdG9ycyBhbmQgc3RvcmUgdGhlIHJlc3VsdHMuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY29weVZhbGlkYXRvcnMoKXsKLQkJCVZhbGlkYXRvcltdIHZhbHMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQlfdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JbdmFscy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaT0wOyBpPHZhbHMubGVuZ3RoOyBpKyspX3ZhbGlkYXRvcnNbaV0gPSB2YWxzW2ldLmNvcHkoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb25maXJtKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgewotCQkJR3JpZERhdGEgZ2Q7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX2NvbmZpcm1CdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJX2NvbmZpcm1CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfY29uZmlybUJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUHJlZlBhZ2VDb25maXJtRGlhbG9nKTsKLQkJCV9jb25maXJtQnV0dG9uLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0Q29uZmlybURpYWxvZygpKTsKLQkJCV9jb25maXJtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJX2dsb2JhbFByZWZlcmVuY2VzLnNldENvbmZpcm1EaWFsb2coX2NvbmZpcm1CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlfY29uZmlybUJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZEF1dG9TYXZlKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgewotCQkJR3JpZERhdGEgZ2Q7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX2F1dG9TYXZlID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKLQkJCV9hdXRvU2F2ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCV9hdXRvU2F2ZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUHJlZlBhZ2VfYWx3YXlzX3NhdmUpOwotCQkJX2F1dG9TYXZlLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0U2F2ZUF1dG9tYXRpY2FsbHkoKSk7Ci0JCQlfYXV0b1NhdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlfZ2xvYmFsUHJlZmVyZW5jZXMuc2V0U2F2ZUF1dG9tYXRpY2FsbHkoX2F1dG9TYXZlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJX2F1dG9TYXZlLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkU3VzcGVuZChDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQotCQkJX3N1c3BlbmQgPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJX3N1c3BlbmQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfc3VzcGVuZC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRElTQUJMRV9WQUxJREFUSU9OKTsKLQkJCV9zdXNwZW5kLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oKSk7Ci0JCQlfc3VzcGVuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCV9zdXNwZW5kLnNldEZvY3VzKCk7Ci0JCQkJCV92YWxpZGF0b3JzVGFibGUuc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlfZW5hYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkT3ZlcnJpZGUoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCi0JCQlfb3ZlcnJpZGUgPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJX292ZXJyaWRlLnNldExheW91dERhdGEoZ2QpOwotCQkJX292ZXJyaWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX0JVVFRPTl9PVkVSUklERSk7Ci0JCQlfb3ZlcnJpZGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCV9vdmVycmlkZS5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLmdldE92ZXJyaWRlKCkpOwotCQkJX292ZXJyaWRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJX2dsb2JhbFByZWZlcmVuY2VzLnNldE92ZXJyaWRlKF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCV9vdmVycmlkZS5zZXRGb2N1cygpOwotCQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXByb3RlY3RlZCBNZW51IGNyZWF0ZUNvbnRleHRNZW51KCkgewotCQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUoX3ZhbGlkYXRvcnNUYWJsZS5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJCWZpbmFsIE1lbnVJdGVtIG1hbnVhbEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJCW1hbnVhbEl0ZW0uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfTU5VX01BTlVBTCk7Ci0JCQlmaW5hbCBNZW51SXRlbSBidWlsZEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJCWJ1aWxkSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfQlVJTEQpOwotCQkJZmluYWwgTWVudUl0ZW0gc2V0dGluZ3NJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJCXNldHRpbmdzSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfU0VUVElOR1MpOwotCi0JCQljbGFzcyBNZW51SXRlbUxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IGluZGV4ID0gbWVudS5pbmRleE9mKG1lbnVJdGVtKSArIDE7Ci0JCQkJCWNvbHVtbkNsaWNrZWQoaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCU1lbnVJdGVtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTWVudUl0ZW1MaXN0ZW5lcigpOwotCQkJbWFudWFsSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlidWlsZEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJc2V0dGluZ3NJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF92YWxpZGF0b3JMaXN0LmdldFNlbGVjdGlvbigpOwotCQkJCQlWYWxpZGF0b3IgdncgPSAoVmFsaWRhdG9yKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCW1hbnVhbEl0ZW0uc2V0U2VsZWN0aW9uKHZ3LmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJCQkJYnVpbGRJdGVtLnNldFNlbGVjdGlvbih2dy5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJcmV0dXJuIG1lbnU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DbGlja2VkKGludCBjb2x1bW5Ub0VkaXQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlWYWxpZGF0b3IgdmFsID0gKFZhbGlkYXRvcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQlzd2l0Y2ggKGNvbHVtblRvRWRpdCkgewotCQkJY2FzZSAxOgotCQkJCXZhbC5zZXRNYW51YWxWYWxpZGF0aW9uKCF2YWwuaXNNYW51YWxWYWxpZGF0aW9uKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXZhbC5zZXRCdWlsZFZhbGlkYXRpb24oIXZhbC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlWYWxpZGF0b3IuVjIgdjIgPSB2YWwuYXNWMlZhbGlkYXRvcigpOwotCQkJCWlmICh2MiAhPSBudWxsKXsKLQkJCQkJRmlsdGVyRGlhbG9nIGZkID0gbmV3IEZpbHRlckRpYWxvZyhfc2hlbGwsIHZhbCwgbnVsbCk7Ci0JCQkJCWlmIChXaW5kb3cuT0sgPT0gZmQub3BlbigpKXsKLQkJCQkJCXZhbC5iZWNvbWUoZmQuZ2V0VmFsaWRhdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQloYW5kbGVPbGREZWxlZ2F0ZSh2YWwpOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVPbGREZWxlZ2F0ZShWYWxpZGF0b3IgdmFsKSB7Ci0JCQlWYWxpZGF0b3IuVjEgdjEgPSB2YWwuYXNWMVZhbGlkYXRvcigpOwotCQkJaWYgKHYxID09IG51bGwpcmV0dXJuOwotCQkJCi0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2MS5nZXRWbWQoKTsKLQkJICAgIGlmICghdm1kLmlzRGVsZWdhdGluZygpKXJldHVybjsKLQkJICAgIAotCQkgICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBfZ2xvYmFsQ29uZmlnLmdldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQpOwotCQkgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkgICAgRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nIGRpYWxvZyA9IAotCQkgICAgCW5ldyBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2coc2hlbGwsIHZtZCwgZGVsZWdhdGVJRCk7Ci0JCQotCQkgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkgICAgZGlhbG9nLmNyZWF0ZSgpOwotCQkKLQkJICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spX2dsb2JhbENvbmZpZy5zZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kLCBkaWFsb2cuZ2V0RGVsZWdhdGVJRCgpKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkvLyBOZWVkIHRvIHVwZGF0ZSBldmVuIHRoZSB3aWRnZXRzIHRoYXQgZG8gbm90IGNoYW5nZSBiYXNlZCBvbiBhbm90aGVyCi0JCQkvLyB3aWRnZXRzIGJlY2F1c2Ugb2YgcGVyZm9ybURlZmF1bHRzKCkuIElmIHBlcmZvcm1EZWZhdWx0cygpIGlzCi0JCQkvLyBzZWxlY3RlZCwgdGhlbiB0aGUgcGFnZVByZWZlcmVuY2VzIHZhbHVlcyBhcmUgcmVzZXQsIGFuZCB0aGVzZSB3aWRnZXRzCi0JCQkvLyBtaWdodCBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJCXVwZGF0ZUFsbFdpZGdldHMoKTsKLQkJCXVwZGF0ZUhlbHAoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVBbGxXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpKTsKLQkJCV9hdXRvU2F2ZS5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLmdldFNhdmVBdXRvbWF0aWNhbGx5KCkpOwotCQkJX2NvbmZpcm1CdXR0b24uc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5nZXRDb25maXJtRGlhbG9nKCkpOwotCQkJX292ZXJyaWRlLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0T3ZlcnJpZGUoKSk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJX3ZhbGlkYXRvckxpc3Quc2V0SW5wdXQoX3ZhbGlkYXRvcnMpOwotCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX2dsb2JhbFByZWZlcmVuY2VzLnNldERpc2FibGVBbGxWYWxpZGF0aW9uKF9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCV9nbG9iYWxQcmVmZXJlbmNlcy5zZXRTYXZlQXV0b21hdGljYWxseShfYXV0b1NhdmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgdnBtID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOwotCQkJdnBtLnNhdmVQcmVmZXJlbmNlcyhfZ2xvYmFsUHJlZmVyZW5jZXMsIF92YWxpZGF0b3JzKTsKLQkJCXNhdmVWMVByZWZlcmVuY2VzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNhdmUgdGhlIFYxIHByZWZlcmVuY2VzLCBzbyB0aGF0IHRoZSBvbGQgdmFsaWRhdG9ycyBjb250aW51ZSB0byB3b3JrLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNhdmVWMVByZWZlcmVuY2VzKCl7Ci0JCQl0cnkgewotCQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2MgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCS8vCQkJZ2Muc2V0Q2FuUHJvamVjdHNPdmVycmlkZShvdmVycmlkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCi0JCQkJaWYgKF9nbG9iYWxQcmVmZXJlbmNlcy5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpKWdjLnNldERpc2FibGVBbGxWYWxpZGF0aW9uKHRydWUpOwotCQkJCS8vcGFnZVByZWZlcmVuY2VzLnNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQkJCQotCQkJCWdjLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKCkpOwkJCQkKLQkJCQlnYy5zZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoKSk7Ci0JCi0JCQkJZ2MucGFzc2l2YXRlKCk7Ci0JCQkJZ2Muc3RvcmUoKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCS8qKgotCQkgKiBBbnN3ZXIgYWxsIHRoZSBWMSB2YWxpZGF0b3JzIHRoYXQgYXJlIG1hbnVhbGx5IGVuYWJsZWQuCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycygpIHsKLQkJCUxpc3Q8VmFsaWRhdG9yTWV0YURhdGE+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJCWZvciAoVmFsaWRhdG9yIHYgOiBfdmFsaWRhdG9ycyl7Ci0JCQkJaWYgKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkpewotCQkJCQlWYWxpZGF0b3IuVjEgdjEgPSB2LmFzVjFWYWxpZGF0b3IoKTsKLQkJCQkJaWYgKHYxICE9IG51bGwpewotCQkJCQkJbGlzdC5hZGQodjEuZ2V0Vm1kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciBhbGwgdGhlIFYxIHZhbGlkYXRvcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgYnVpbGQuCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKCkgewotCQkJTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQkJZm9yIChWYWxpZGF0b3IgdiA6IF92YWxpZGF0b3JzKXsKLQkJCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpKXsKLQkJCQkJVmFsaWRhdG9yLlYxIHYxID0gdi5hc1YxVmFsaWRhdG9yKCk7Ci0JCQkJCWlmICh2MSAhPSBudWxsKWxpc3QuYWRkKHYxLmdldFZtZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlfdmFsaWRhdG9ycyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdFZhbGlkYXRvcnMoKTsKLQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCWdldERlZmF1bHRzQnV0dG9uKCkuc2V0Rm9jdXMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybUVuYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCXNldEFsbFZhbGlkYXRvcnModHJ1ZSk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EaXNhYmxlQWxsKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJc2V0QWxsVmFsaWRhdG9ycyhmYWxzZSk7Ci0JCQlfZGlzYWJsZUFsbEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBzZXRBbGxWYWxpZGF0b3JzKGJvb2xlYW4gYm9vbCl7Ci0JCQlmb3IgKFZhbGlkYXRvciB2IDogX3ZhbGlkYXRvcnMpewotCQkJCXYuc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2wpOwotCQkJCXYuc2V0TWFudWFsVmFsaWRhdGlvbihib29sKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlbHAoKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9zdXNwZW5kLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0RJU0FCTEVfQUxMX0VOQUJMRUQpOwotCQl9Ci0KLQkJLyoKLQkJICogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb250cm9scyBpbnRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCQkgKi8KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gX3BhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJX2F1dG9TYXZlLmRpc3Bvc2UoKTsKLQkJCV9zdXNwZW5kLmRpc3Bvc2UoKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uZGlzcG9zZSgpOwotCQkJX2xpc3RMYWJlbC5kaXNwb3NlKCk7Ci0JCQlfc3VzcGVuZC5kaXNwb3NlKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLmRpc3Bvc2UoKTsKLQkJCV9jb21wb3NpdGUuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9zZUZvY3VzKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZ2FpbkZvY3VzKCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlfc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQkJCV9wYWdlSW1wbCA9IG5ldyBWYWxpZGF0b3JMaXN0UGFnZShwYXJlbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlfcGFnZUltcGwgPSBuZXcgSW52YWxpZFBhZ2UocGFyZW50KTsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQl9Ci0KLQkJcmV0dXJuIF9wYWdlSW1wbC5nZXRDb250cm9sKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHNwZWNpYWwgcHJvY2Vzc2luZyB3aGVuIHRoaXMgcGFnZSdzIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbgotCSAqIHByZXNzZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuCi0JICogdGhlIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSwgYnV0IHNob3VsZAotCSAqIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQl0cnkgewotCQkJX3BhZ2VJbXBsLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgIk9LIiBvciAiQXBwbHkiIGJ1dHRvbiBvbiB0aGUgUHJvcGVydGllcwotCSAqIEd1aWRlL1Byb3BlcnRpZXMgUGFnZSwgcmVzcGVjdGl2ZWx5LCBzb21lIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoaXMKLQkgKiBQcm9wZXJ0eVBhZ2UuIElmIHRoZSBwYWdlIGlzIGZvdW5kLCBhbmQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdHJ1ZSBpcwotCSAqIHJldHVybmVkLiBPdGhlcndpc2UsIGZhbHNlIGlzIHJldHVybmVkLCBhbmQgdGhlIGd1aWRlIGRvZXNuJ3QgZmluaXNoLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBfcGFnZUltcGwucGVyZm9ybU9rKCk7Ci0JCX0gCi0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmNlIHRoZSBwYWdlcyBhcmUgaW5uZXIgY2xhc3NlcyBvZiBhIGNoaWxkIFByZWZlcmVuY2VQYWdlLCBub3QgYQotCSAqIFByZWZlcmVuY2VQYWdlIGl0c2VsZiwgRGlhbG9nUGFnZSdzIGF1dG9tYXRpYyBkaXNwb3NhbCBvZiBpdHMgY2hpbGRyZW4ncwotCSAqIHdpZGdldHMgY2Fubm90IGJlIHVzZWQuIEluc3RlYWQsIGRpc3Bvc2Ugb2YgZWFjaCBpbm5lciBjbGFzcycgd2lkZ2V0cwotCSAqIGV4cGxpY2l0bHkuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJaWYgKF9wYWdlSW1wbCAhPSBudWxsKSB7Ci0JCQkJX3BhZ2VJbXBsLmRpc3Bvc2UoKTsKLQkJCQlfcGFnZUltcGwgPSBudWxsOwotCQkJfQotCi0JCQkvLyBUT0RPIGZpZ3VyZSBvdXQgd2hhdCB0aGlzIHRoaW5nIGRpZAotCQkJLy8gRXh0ZW5zaW9uTWFuZ2VyLmluc3RhbmNlKCkuZ2V0RGVsZWdhdGUoKS5kaXNwb3NlUHJlZmVyZW5jZVBhZ2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4YykgewotCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JfQotCi0JLyoKLQkgKiBwYWNrYWdlIHZpc2liaWxpdHkgYmVjYXVzZSBpZiB0aGlzIG1ldGhvZCBpcyBwcml2YXRlLCB0aGVuIHRoZSBjb21waWxlcgotCSAqIG5lZWRzIHRvIGNyZWF0ZSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBpbnRlcm5hbCBjbGFzc2VzLCBhbmQKLQkgKiB0aGF0IGNhbiBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4KLQkgKi8KLQl2b2lkIGRpc3BsYXlBbmRMb2dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjKSB7Ci0JCWxvZ0Vycm9yKGV4Yyk7Ci0JCWRpc3BsYXlNZXNzYWdlKHRpdGxlLCBtZXNzYWdlLCBvcmcuZWNsaXBzZS5zd3QuU1dULklDT05fRVJST1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5TWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBpbnQgaUljb25UeXBlKSB7Ci0JCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksCi0JCQkJb3JnLmVjbGlwc2Uuc3d0LlNXVC5PSyB8IGlJY29uVHlwZQl8IG9yZy5lY2xpcHNlLnN3dC5TV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQltZXNzYWdlQm94LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCW1lc3NhZ2VCb3guc2V0VGV4dCh0aXRsZSk7Ci0JCW1lc3NhZ2VCb3gub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotCQlpZiAoX3BhZ2VJbXBsID09IG51bGwpcmV0dXJuOwotCQlpZiAodmlzaWJsZSlfcGFnZUltcGwuZ2FpbkZvY3VzKCk7Ci0JCWVsc2UgX3BhZ2VJbXBsLmxvc2VGb2N1cygpOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gZ2V0RGVmYXVsdHNCdXR0b24oKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0c0J1dHRvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiMDBjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxQcmVmTWFuYWdlclByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuUHJvamVjdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLkRlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkltYWdlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2cuRmlsdGVyRGlhbG9nOwotCi0vKioKLSAqIEZyb20gdGhpcyBwYWdlIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzIG9uIGluZGl2aWR1YWwgcHJvamVjdHMuCi0gKiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgIHsKLQotCXByaXZhdGUgSVZhbGlkYXRpb25QYWdlIF9wYWdlSW1wbDsKLQlwcml2YXRlIFNoZWxsIAkJCV9zaGVsbDsKLQotCXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25QYWdlIHsKLQkJQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQkJYm9vbGVhbiBwZXJmb3JtT2soKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotCQlib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JCUNvbXBvc2l0ZSBnZXRDb250cm9sKCk7Ci0KLQkJdm9pZCBkaXNwb3NlKCk7Ci0KLQkJdm9pZCBsb3NlRm9jdXMoKTsKLQotCQl2b2lkIGdhaW5Gb2N1cygpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFnZSBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUGFnZSB7Ci0JCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2UgPSBudWxsOwotCi0JCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0JCXByaXZhdGUgR3JpZExheW91dCBsYXlvdXQgPSBudWxsOwotCQlwcml2YXRlIExhYmVsIG1lc3NhZ2VMYWJlbCA9IG51bGw7Ci0KLQkJcHVibGljIEludmFsaWRQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXBhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBwYWdlIGlzIGFkZGVkIHRvIHRoZSBQcm9wZXJ0aWVzIGd1aWRlIGlmIHNvbWUgaW50ZXJuYWwgcHJvYmxlbQotCQkgKiBvY2N1cnJlZDsgZm9yIGV4YW1wbGUsIHRoZSBoaWdobGlnaHRlZCBpdGVtIGluIHRoZSB3b3JrYmVuY2ggaXMgbm90Ci0JCSAqIGFuIElQcm9qZWN0IChhY2NvcmRpbmcgdG8gdGhpcyBwYWdlJ3MgcGx1Z2luLnhtbCwgdGhpcyBwYWdlIGlzIG9ubHkKLQkJICogdmFsaWQgd2hlbiBhbiBJUHJvamVjdCBpcyBzZWxlY3RlZCkuCi0JCSAqLwotCQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQotCQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7Ci0JCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFKTsKLQotCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVkFMSURfUkVHSVNURVIpOwotCi0JCQljb21wb3NpdGUuc2V0U2l6ZShjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB0aGlzIHBhZ2Ugb2NjdXJzIHVuZGVyIGludmFsaWQgY2lyY3Vtc3RhbmNlcywgdGhlcmUgaXMgbm90aGluZwotCQkgKiB0byBzYXZlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQltZXNzYWdlTGFiZWwuZGlzcG9zZSgpOwotCQkJLy8gbGF5b3V0LmRpc3Bvc2UoKTsKLQkJCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRvckxpc3RQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKLQkJcHJpdmF0ZSBDb21wb3NpdGUgCQlfcGFnZTsKLQotCQlwcml2YXRlIENvbXBvc2l0ZSAJCV9jb21wb3NpdGU7Ci0JCXByaXZhdGUgVGFibGVWaWV3ZXIgCV92YWxpZGF0b3JMaXN0OwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfZW5hYmxlQWxsQnV0dG9uOwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfZGlzYWJsZUFsbEJ1dHRvbjsKLQkJcHJpdmF0ZSBCdXR0b24gCQkJX292ZXJyaWRlOwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfc3VzcGVuZDsKLQkJcHJpdmF0ZSBMaW5rCQkJX2NvbmZpZ0xpbms7Ci0JCXByaXZhdGUgQnV0dG9uCQkJX2FkZFZhbGlkYXRpb25CdWlsZGVyOwotCQlwcml2YXRlIFRhYmxlIAkJCV92YWxpZGF0b3JzVGFibGU7Ci0JCXByaXZhdGUgVmFsaWRhdG9yW10JCV92YWxpZGF0b3JzOwotCi0JCS8qKgotCQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlciBpbiB0aGUKLQkJICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBWYWxpZGF0b3JbXSkgewotCQkJCQlyZXR1cm4gKFZhbGlkYXRvcltdKSBpbnB1dEVsZW1lbnQ7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvcgotCQkgKiBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UncyBjaGVja2JveFRhYmxlVmlld2VyCi0JCSAqIGVsZW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYWxpZGF0b3IpCi0JCQkJCXJldHVybiAoKFZhbGlkYXRvcikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGltYWdlTmFtZSkgewotCQkJCWJvb2xlYW4gaXNEaXNhYmxlZCA9ICFfdmFsaWRhdG9yc1RhYmxlLmlzRW5hYmxlZCgpOwotCQkJCWlmIChpc0Rpc2FibGVkKQotCQkJCQlpbWFnZU5hbWUgPSBpbWFnZU5hbWUgKyBJbWFnZU5hbWVzLmRpc2FibGVkOwotCi0JCQkJcmV0dXJuIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCVZhbGlkYXRvciB2ID0gKFZhbGlkYXRvcikgZWxlbWVudDsKLQkJCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCQlyZXR1cm4gZ2V0SW1hZ2Uodi5pc01hbnVhbFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZQotCQkJCQkJCTogSW1hZ2VOYW1lcy5mYWlsVGFibGUpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJCQlyZXR1cm4gZ2V0SW1hZ2Uodi5pc0J1aWxkVmFsaWRhdGlvbigpID8gSW1hZ2VOYW1lcy5va1RhYmxlCi0JCQkJCQkJOiBJbWFnZU5hbWVzLmZhaWxUYWJsZSk7Ci0JCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKSB7Ci0JCQkJCWlmICh2LmFzVjJWYWxpZGF0b3IoKSAhPSBudWxsKXJldHVybiBnZXRJbWFnZShJbWFnZU5hbWVzLnNldHRpbmdzKTsKLQkJCQkJaWYgKHYuZ2V0RGVsZWdhdGluZ0lkKCkgIT0gbnVsbClyZXR1cm4gZ2V0SW1hZ2UoSW1hZ2VOYW1lcy5zZXR0aW5ncyk7Ci0JCQkJCXJldHVybiAgbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJaWYgKGNvbHVtbkluZGV4ID09IDApcmV0dXJuICgoVmFsaWRhdG9yKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgVmFsaWRhdG9yTGlzdFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3BhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0dXBUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUpIHsKLQkJCVRhYmxlQ29sdW1uIHZhbGlkYXRvckNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJdmFsaWRhdG9yQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5WQUxJREFUT1IpOwotCQkJdmFsaWRhdG9yQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCQl2YWxpZGF0b3JDb2x1bW4uc2V0V2lkdGgoMzIwKTsKLQkJCVRhYmxlQ29sdW1uIG1hbnVhbENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJbWFudWFsQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5NQU5VQUwpOwotCQkJbWFudWFsQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCQltYW51YWxDb2x1bW4uc2V0V2lkdGgoNDApOwotCQkJVGFibGVDb2x1bW4gYnVpbGRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWJ1aWxkQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CVUlMRCk7Ci0JCQlidWlsZENvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJYnVpbGRDb2x1bW4uc2V0V2lkdGgoNDApOwotCQkJVGFibGVDb2x1bW4gc2V0dGluZ3NDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCXNldHRpbmdzQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5TRVRUSU5HUyk7Ci0JCQlzZXR0aW5nc0NvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJc2V0dGluZ3NDb2x1bW4uc2V0V2lkdGgoNTApOwotCQl9Ci0KLQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCWNvcHlWYWxpZGF0b3JzKCk7Ci0JCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJX2NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7Ci0JCQlzYzEuc2V0Q29udGVudChfY29tcG9zaXRlKTsKLQkJCV9jb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoX2NvbXBvc2l0ZSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLQkJCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUoX2NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCQlHcmlkTGF5b3V0IHZhbGlkYXRvckdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXZhbGlkYXRvckdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJdmFsaWRhdG9yR3JvdXAuc2V0TGF5b3V0KHZhbGlkYXRvckdyb3VwTGF5b3V0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFsaWRhdG9yR3JvdXAsIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UpOwotCi0JCQlhZGRPdmVycmlkZSh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRDb25maWdMaW5rKHZhbGlkYXRvckdyb3VwKTsKLQkJCWFkZFN1c3BlbmQodmFsaWRhdG9yR3JvdXApOwotCQkJYWRkVmFsaWRhdGlvbkJ1aWxkZXIodmFsaWRhdG9yR3JvdXApOwotCQkJbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJCUxhYmVsIGxpc3RMYWJlbCA9IG5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgbGlzdExhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJbGlzdExhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsaXN0TGFiZWwuc2V0TGF5b3V0RGF0YShsaXN0TGFiZWxEYXRhKTsKLQkJCWxpc3RMYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9WQUxMSVNUX1RJVExFKTsKLQkJCQotLy8JCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSh2YWxpZGF0b3JHcm91cCwgU1dULlZfU0NST0xMKTsKLS8vCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLS8vCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotLy8JCQlzYy5zZXRMYXlvdXREYXRhKGdkKTsKLS8vCQkJc2Muc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotLy8JCQlDb21wb3NpdGUgdGFibGUgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0vLwkJCXNjLnNldENvbnRlbnQodGFibGUpOwotLy8JCQl0YWJsZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJCV92YWxpZGF0b3JzVGFibGUgPSBuZXcgVGFibGUodmFsaWRhdG9yR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotLy8JCQlzYy5zZXRDb250ZW50KF92YWxpZGF0b3JzVGFibGUpOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE2MCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgdHJ1ZSkpOwotCQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgdHJ1ZSkpOwotCi0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQkJX3ZhbGlkYXRvckxpc3QgPSBuZXcgVGFibGVWaWV3ZXIoX3ZhbGlkYXRvcnNUYWJsZSk7Ci0JCQlHcmlkRGF0YSB2YWxpZGF0b3JMaXN0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJdmFsaWRhdG9yTGlzdERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKLQkJCV92YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSh2YWxpZGF0b3JMaXN0RGF0YSk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uTGFiZWxQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJc2V0dXBUYWJsZUNvbHVtbnMoX3ZhbGlkYXRvcnNUYWJsZSk7Ci0KLQkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQlpZiAoZS5idXR0b24gIT0gMSkKLQkJCQkJCXJldHVybjsKLQotCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gX3ZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtKG5ldyBQb2ludCgKLQkJCQkJCQllLngsIGUueSkpOwotCQkJCQlpZiAodGFibGVJdGVtID09IG51bGwgfHwgdGFibGVJdGVtLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJLy8gaXRlbSBubyBsb25nZXIgZXhpc3RzCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaW50IGNvbHVtbk51bWJlcjsKLQkJCQkJaW50IGNvbHVtbnNDb3VudCA9IF92YWxpZGF0b3JzVGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQkJaWYgKGNvbHVtbnNDb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBJZiBubyBUYWJsZUNvbHVtbiwgVGFibGUgYWN0cyBhcyBpZiBpdCBoYXMgYSBzaW5nbGUgY29sdW1uCi0JCQkJCQkvLyB3aGljaCB0YWtlcyB0aGUgd2hvbGUgd2lkdGguCi0JCQkJCQljb2x1bW5OdW1iZXIgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29sdW1uTnVtYmVyID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQkJCQkJY29sdW1uTnVtYmVyID0gaTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbHVtbk51bWJlciA9PSAtMSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWNvbHVtbkNsaWNrZWQoY29sdW1uTnVtYmVyKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRNZW51KGNyZWF0ZUNvbnRleHRNZW51KCkpOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJc3VwZXIuZm9jdXNHYWluZWQoZSk7Ci0JCQkJCWlmIChfdmFsaWRhdG9yc1RhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkgewotCQkJCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZWxlY3QoMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYWRkQnV0dG9ucyh2YWxpZGF0b3JHcm91cCk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9kaXNhYmxlQWxsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFKTsKLQotCQkJLy8gSGF2ZSB0byBzZXQgdGhlIHRhYiBvcmRlciBvciBvbmx5IHRoZSBmaXJzdCBjaGVja2JveCBpbiBhCi0JCQkvLyBDb21wb3NpdGUgY2FuIGJlIHRhYmJlZCB0by4gKFNlZW1zIHRvIGFwcGx5IG9ubHkgdG8gY2hlY2tib3hlcy4gSGF2ZSB0byB1c2UgdGhlCi0JCQkvLyBhcnJvdyBrZXkgdG8gbmF2aWdhdGUgdGhlIGNoZWNrYm94ZXMuKQotCQkJdmFsaWRhdG9yR3JvdXAuc2V0VGFiTGlzdChuZXcgQ29udHJvbFtdIHsgX292ZXJyaWRlLCBfc3VzcGVuZCwKLQkJCQl9KTsKLQotCQkJdXBkYXRlV2lkZ2V0cygpOwotCi0JCQlhcHBseURpYWxvZ0ZvbnQoX2NvbXBvc2l0ZSk7Ci0JCQlfY29tcG9zaXRlLnNldFNpemUoX2NvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCQkJcmV0dXJuIF9jb21wb3NpdGU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQnV0dG9ucyhDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCQotCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJCQotCQkJX2VuYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9CVVRUT05fRU5BQkxFQUxMKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybUVuYWJsZUFsbCgpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSxWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlfZGlzYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkU3VzcGVuZChDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlfc3VzcGVuZCA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfc3VzcGVuZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCV9zdXNwZW5kLnNldFRleHQoVmFsVUlNZXNzYWdlcy5ESVNBQkxFX1ZBTElEQVRJT04pOwotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldFN1c3BlbmQoKSk7Ci0JCQlfc3VzcGVuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCV9zdXNwZW5kLnNldEZvY3VzKCk7Ci0JCQkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7Ci0JCQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZENvbmZpZ0xpbmsoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKXsKLQkJCV9jb25maWdMaW5rID0gbmV3IExpbmsodmFsaWRhdG9yR3JvdXAsU1dULk5vbmUpOwotCQkJR3JpZERhdGEgbGF5b3V0ID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCV9jb25maWdMaW5rLnNldExheW91dERhdGEobGF5b3V0KTsKLQkJCV9jb25maWdMaW5rLnNldFRleHQoIjxBPiIrIC8vJE5PTi1OTFMtMSQKLQkJCQlWYWxVSU1lc3NhZ2VzLkNvbmZpZ1dzU2V0dGluZ3MrIjwvQT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJX2NvbmZpZ0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTk9fTElOSyA9ICJQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLm5vbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXB1YmxpYyB2b2lkIGRvTGlua0FjdGl2YXRlZChMaW5rIGUpIHsKLQkJCQkJU3RyaW5nIGlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpOwotCQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGlkLCBuZXcgU3RyaW5nW117aWR9LCBEQVRBX05PX0xJTkspLm9wZW4oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgewotCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgewotCQkJCQlyZXR1cm4gIlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkb0xpbmtBY3RpdmF0ZWQoKExpbmspIGUud2lkZ2V0KTsJCQkJCQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZG9MaW5rQWN0aXZhdGVkKChMaW5rKSBlLndpZGdldCk7CQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQl9Ci0JCQotCQkvKioKLQkJICogSWYgdGhlIGN1cnJlbnQgcHJvamVjdCBkb2Vzbid0IGhhdmUgdGhlIHZhbGlkYXRpb24gYnVpbGRlciBjb25maWd1cmVkIG9uIGl0LCAKLQkJICogYW5kIHRoZSB1c2VyIGhhcyBhc2tlZCB1cyB0byBhZGQgYSBidWlsZGVyLCBhZGQgdGhlIGJ1aWxkZXIuIAotCQkgKiBPdGhlcndpc2UgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQnVpbGRlcigpIHsKLQkJCWlmIChfYWRkVmFsaWRhdGlvbkJ1aWxkZXIgIT0gbnVsbCAmJiBfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChnZXRQcm9qZWN0KCkpOwotCQl9Ci0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRWYWxpZGF0aW9uQnVpbGRlcihDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCWlmIChoYXNWYWxpZGF0aW9uQnVpbGRlcigpKXJldHVybjsKLQkJCQotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCV9hZGRWYWxpZGF0aW9uQnVpbGRlciA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkFERF9WQUxJREFUSU9OX0JVSUxERVIpOwotCQkJX2FkZFZhbGlkYXRpb25CdWlsZGVyLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBNYWtlIGEgY29weSBvZiB0aGUgY3VycmVudCB2YWxpZGF0b3JzIGFuZCBzdG9yZSB0aGUgcmVzdWx0cy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBjb3B5VmFsaWRhdG9ycygpewotCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMoZ2V0UHJvamVjdCgpKTsKLQkJCV92YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvclt2YWxzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKylfdmFsaWRhdG9yc1tpXSA9IHZhbHNbaV0uY29weSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciBpZiB0aGlzIHByb2plY3QgaGFzIGEgdmFsaWRhdG9yIGJ1aWxkZXIgYXNzaWduZWQgdG8gaXQuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRhdGlvbkJ1aWxkZXIoKXsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCi0JCXByaXZhdGUgdm9pZCBhZGRPdmVycmlkZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCV9vdmVycmlkZSA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfb3ZlcnJpZGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfb3ZlcnJpZGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkxhYmVsRW5hYmxlUHJvamVjdFNwZWNpZmljKTsKLQkJCV9vdmVycmlkZS5zZXRTZWxlY3Rpb24oZ2V0UHJvamVjdFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKSk7Ci0JCQlfb3ZlcnJpZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlfb3ZlcnJpZGUuc2V0Rm9jdXMoKTsKLQkJCQkJaWYgKFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKSl7Ci0JCQkJCQllbmFibGVEaXNhYmxlV2lkZ2V0cygpOwotCQkJCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhfc2hlbGwsIFZhbFVJTWVzc2FnZXMuVmFsaWRhdGlvbiwgCi0JCQkJCQkJVmFsVUlNZXNzYWdlcy5Qcm9qZWN0T3ZlcnJpZGVzTm90QWxsb3dlZCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoKSB7Ci0JCQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudShfdmFsaWRhdG9yc1RhYmxlLmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQkJZmluYWwgTWVudUl0ZW0gbWFudWFsSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJbWFudWFsSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfTUFOVUFMKTsKLQkJCWZpbmFsIE1lbnVJdGVtIGJ1aWxkSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJYnVpbGRJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9CVUlMRCk7Ci0JCQlmaW5hbCBNZW51SXRlbSBzZXR0aW5nc0l0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJc2V0dGluZ3NJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9TRVRUSU5HUyk7Ci0KLQkJCWNsYXNzIE1lbnVJdGVtTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gKE1lbnVJdGVtKSBlLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgaW5kZXggPSBtZW51LmluZGV4T2YobWVudUl0ZW0pICsgMTsKLQkJCQkJY29sdW1uQ2xpY2tlZChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJTWVudUl0ZW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNZW51SXRlbUxpc3RlbmVyKCk7Ci0JCQltYW51YWxJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWJ1aWxkSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlzZXR0aW5nc0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCVZhbGlkYXRvciB2YWwgPSAoVmFsaWRhdG9yKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCW1hbnVhbEl0ZW0uc2V0U2VsZWN0aW9uKHZhbC5pc01hbnVhbFZhbGlkYXRpb24oKSk7Ci0JCQkJCWJ1aWxkSXRlbS5zZXRTZWxlY3Rpb24odmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotCQkJCQkvLyBzZXR0aW5nc0l0ZW0uc2V0RW5hYmxlZCh2bWQuaXNEZWxlZ2F0aW5nKCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlyZXR1cm4gbWVudTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNvbHVtbkNsaWNrZWQoaW50IGNvbHVtblRvRWRpdCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBfdmFsaWRhdG9yTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCVZhbGlkYXRvciB2YWwgPSAoVmFsaWRhdG9yKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJCXN3aXRjaCAoY29sdW1uVG9FZGl0KSB7Ci0JCQljYXNlIDE6Ci0JCQkJdmFsLnNldE1hbnVhbFZhbGlkYXRpb24oIXZhbC5pc01hbnVhbFZhbGlkYXRpb24oKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbighdmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCVZhbGlkYXRvci5WMiB2MiA9IHZhbC5hc1YyVmFsaWRhdG9yKCk7Ci0JCQkJaWYgKHYyICE9IG51bGwpewotCQkJCQlGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgRmlsdGVyRGlhbG9nKF9zaGVsbCwgdmFsLCBnZXRQcm9qZWN0KCkpOwotCQkJCQlpZiAoV2luZG93Lk9LID09IGZkLm9wZW4oKSl7Ci0JCQkJCQl2YWwuYmVjb21lKGZkLmdldFZhbGlkYXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGFuZGxlT2xkRGVsZWdhdGUodmFsKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlT2xkRGVsZWdhdGUoVmFsaWRhdG9yIHZhbCkgewotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0b3IuVjEgdjEgPSB2YWwuYXNWMVZhbGlkYXRvcigpOwotCQkJCWlmICh2MSA9PSBudWxsKXJldHVybjsKLQkJCQkKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2MS5nZXRWbWQoKTsKLQkJCSAgICBpZiAoIXZtZC5pc0RlbGVnYXRpbmcoKSlyZXR1cm47Ci0JCQkgICAgCi0JCQkgICAgR2xvYmFsQ29uZmlndXJhdGlvbiBnYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQkgICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBnYy5nZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kKTsKLQkJCSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkgICAgRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nIGRpYWxvZyA9IAotCQkJICAgIAluZXcgRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nKHNoZWxsLCB2bWQsIGRlbGVnYXRlSUQpOwotCQkJCi0JCQkgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJICAgIGRpYWxvZy5jcmVhdGUoKTsKLQkJCQotCQkJICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKWdjLnNldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQsIGRpYWxvZy5nZXREZWxlZ2F0ZUlEKCkpOwotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSl7Ci0JCQkJCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJLy8gTmVlZCB0byB1cGRhdGUgZXZlbiB0aGUgd2lkZ2V0cyB0aGF0IGRvIG5vdCBjaGFuZ2UgYmFzZWQgb24gYW5vdGhlcgotCQkJLy8gd2lkZ2V0cyBiZWNhdXNlIG9mIHBlcmZvcm1EZWZhdWx0cygpLiBJZiBwZXJmb3JtRGVmYXVsdHMoKSBpcyBzZWxlY3RlZCwKLQkJCS8vIHRoZW4gdGhlIHBhZ2VQcmVmZXJlbmNlcyB2YWx1ZXMgYXJlIHJlc2V0LCBhbmQgdGhlc2Ugd2lkZ2V0cwotCQkJLy8gbWlnaHQgYWxzbyBuZWVkIHRvIGJlIHVwZGF0ZWQuCi0JCQl1cGRhdGVBbGxXaWRnZXRzKCk7Ci0JCQl1cGRhdGVIZWxwKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzRm9yRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQl1cGRhdGVBbGxXaWRnZXRzKCk7Ci0JCQl1cGRhdGVIZWxwKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdXBkYXRlQWxsV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCV9zdXNwZW5kLnNldFNlbGVjdGlvbihnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKS5nZXRTdXNwZW5kKCkpOwotCQkJX292ZXJyaWRlLnNldFNlbGVjdGlvbihnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKTsKLQkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWFkZEJ1aWxkZXIoKTsKLQkJCS8vIFsyMTM2MzFdIHRoaXMgd2FybmluZyBzaG91bGQgb25seSBiZSBzaG93biBpZiB0aGUgdXNlciBhY3R1YWxseSB0cmllZCB0byBvdmVycmlkZQotCQkJLy8gdGhlIHZhbGlkYXRvcnMKLQkJCWlmICghVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpICYmIF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSl7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhfc2hlbGwsIFZhbFVJTWVzc2FnZXMuVmFsaWRhdGlvbiwgCi0JCQkJCVZhbFVJTWVzc2FnZXMuUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXVwZGF0ZVYxUHJvamVjdFNldHRpbmdzKCk7Ci0JCQlnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKS5zZXRTdXNwZW5kKF9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCWdldFByb2plY3RQcmVmZXJlbmNlcygpLnNldE92ZXJyaWRlKF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwbSA9IG5ldyBWYWxQcmVmTWFuYWdlclByb2plY3QocHJvamVjdCk7Ci0JCQl2cG0uc2F2ZVByZWZlcmVuY2VzKGdldFByb2plY3RQcmVmZXJlbmNlcygpLCBfdmFsaWRhdG9ycyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgdmVyc2lvbiAxIHByb2plY3Qgc2V0dGluZ3MuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlVjFQcm9qZWN0U2V0dGluZ3MoKSB7Ci0JCQl0cnkgewotCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHBjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCQkJcGMuc2V0RG9lc1Byb2plY3RPdmVycmlkZShfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXBjLnNldERpc2FibGVBbGxWYWxpZGF0aW9uKF9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQkJCQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciB0aGUgc3BlY2lmaWMgcHJvamVjdCBwcmVmZXJlbmNlcy4gSWYgdGhlIHByb2plY3QgZGlkbid0IGhhdmUgYW55IHNwZWNpZmljIHByb2plY3QKLQkJICogcHJlZmVyZW5jZXMsIHRoZW4gY3JlYXRlIGEgZGVmYXVsdCBzZXQuCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgUHJvamVjdFByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcygpewotCQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFByb2plY3RQcmVmZXJlbmNlcyhnZXRQcm9qZWN0KCkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3ZhbGlkYXRvcnMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHRWYWxpZGF0b3JzKGdldFByb2plY3QoKSk7Ci0JCQl1cGRhdGVXaWRnZXRzRm9yRGVmYXVsdHMoKTsKLQkJCWdldERlZmF1bHRzQnV0dG9uKCkuc2V0Rm9jdXMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybUVuYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCXNldEFsbFZhbGlkYXRvcnModHJ1ZSk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRBbGxWYWxpZGF0b3JzKGJvb2xlYW4gYm9vbCkgewotCQkJZm9yIChUYWJsZUl0ZW0gaXRlbSA6IF92YWxpZGF0b3JzVGFibGUuZ2V0SXRlbXMoKSkgewotCQkJCVZhbGlkYXRvciB2YWwgPSAoVmFsaWRhdG9yKSBpdGVtLmdldERhdGEoKTsKLQkJCQl2YWwuc2V0TWFudWFsVmFsaWRhdGlvbihib29sKTsKLQkJCQl2YWwuc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2wpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURpc2FibGVBbGwoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlzZXRBbGxWYWxpZGF0b3JzKGZhbHNlKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlbHAoKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9zdXNwZW5kLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0RJU0FCTEVfQUxMX0VOQUJMRUQpOwotCQl9Ci0KLQkJLyoKLQkJICogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb250cm9scyBpbnRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCQkgKi8KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gX3BhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJX292ZXJyaWRlLmRpc3Bvc2UoKTsKLQkJCV9zdXNwZW5kLmRpc3Bvc2UoKTsKLQkJCV9jb25maWdMaW5rLmRpc3Bvc2UoKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uZGlzcG9zZSgpOwotCQkJX3ZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5kaXNwb3NlKCk7Ci0JCQlfY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSB3aWRnZXRzIGJhc2VkIG9uIHNvbWUgdG9wIGxldmVsIHByZWZlcmVuY2VzLiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBlbmFibGVEaXNhYmxlV2lkZ2V0cygpIHsKLQkJCWJvb2xlYW4gZ2xvYmFsT3ZlcnJpZGUgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpLmdldE92ZXJyaWRlKCk7Ci0JCQlib29sZWFuIGVuYWJsZSA9ICFfc3VzcGVuZC5nZXRTZWxlY3Rpb24oKSAmIF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSAmIGdsb2JhbE92ZXJyaWRlOwotCQkJX3N1c3BlbmQuc2V0RW5hYmxlZChfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkgJiBnbG9iYWxPdmVycmlkZSk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJX2NvbmZpZ0xpbmsuc2V0RW5hYmxlZCghZ2xvYmFsT3ZlcnJpZGUgfHwgIV9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7Ci0JCQkvLyBUaGlzIHBhZ2UgZG9lcyBub3QgbmVlZCB0byBjYWNoZSBhbnl0aGluZyBiZWZvcmUgaXQgbG9zZXMgZm9jdXMuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlfc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQkJCV9wYWdlSW1wbCA9IG5ldyBWYWxpZGF0b3JMaXN0UGFnZShwYXJlbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlfcGFnZUltcGwgPSBuZXcgSW52YWxpZFBhZ2UocGFyZW50KTsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQl9Ci0KLQkJcmV0dXJuIF9wYWdlSW1wbC5nZXRDb250cm9sKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQl0cnkgewotCQkJX3BhZ2VJbXBsLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBfcGFnZUltcGwucGVyZm9ybU9rKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luY2UgdGhlIHBhZ2VzIGFyZSBpbm5lciBjbGFzc2VzIG9mIGEgY2hpbGQgUHJlZmVyZW5jZVBhZ2UsIG5vdCBhCi0JICogUHJlZmVyZW5jZVBhZ2UgaXRzZWxmLCBEaWFsb2dQYWdlJ3MgYXV0b21hdGljIGRpc3Bvc2FsIG9mIGl0cyBjaGlsZHJlbidzCi0JICogd2lkZ2V0cyBjYW5ub3QgYmUgdXNlZC4gSW5zdGVhZCwgZGlzcG9zZSBvZiBlYWNoIGlubmVyIGNsYXNzJyB3aWRnZXRzCi0JICogZXhwbGljaXRseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoX3BhZ2VJbXBsICE9IG51bGwpIHsKLQkJCQlfcGFnZUltcGwuZGlzcG9zZSgpOwotCQkJCV9wYWdlSW1wbCA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGMpIHsKLQkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCX0KLQotCS8qCi0JICogcGFja2FnZSB2aXNpYmlsaXR5IGJlY2F1c2UgaWYgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgdGhlbiB0aGUgY29tcGlsZXIKLQkgKiBuZWVkcyB0byBjcmVhdGUgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgaW50ZXJuYWwgY2xhc3NlcywgYW5kCi0JICogdGhhdCBjYW4gaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuCi0JICovCi0Jdm9pZCBkaXNwbGF5QW5kTG9nRXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4YykgewotCQlsb2dFcnJvcihleGMpOwotCQlkaXNwbGF5TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5JQ09OX0VSUk9SKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGxheU1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGlJY29uVHlwZSkgewotCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLAotCQkJb3JnLmVjbGlwc2Uuc3d0LlNXVC5PSyB8IGlJY29uVHlwZSB8IG9yZy5lY2xpcHNlLnN3dC5TV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQltZXNzYWdlQm94LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCW1lc3NhZ2VCb3guc2V0VGV4dCh0aXRsZSk7Ci0JCW1lc3NhZ2VCb3gub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotCQlpZiAoX3BhZ2VJbXBsID09IG51bGwpcmV0dXJuOwotCQlpZiAodmlzaWJsZSlfcGFnZUltcGwuZ2FpbkZvY3VzKCk7Ci0JCWVsc2UgX3BhZ2VJbXBsLmxvc2VGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNnZXREZWZhdWx0c0J1dHRvbigpCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBnZXREZWZhdWx0c0J1dHRvbigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRzQnV0dG9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHByb2plY3QuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCUlBZGFwdGFibGUgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRFbGVtZW50ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdClyZXR1cm4gKElQcm9qZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0KLQkJT2JqZWN0IGFkYXB0ZWRPYmplY3QgPSBzZWxlY3RlZEVsZW1lbnQuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCWlmIChhZGFwdGVkT2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlZE9iamVjdDsKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWUwOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idmFsaWRhdGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0ZV9jb3JlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2ZjIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzNjkwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi12YWxpZGF0ZS5qYXIKLWJ1aWxkLnhtbAotY29tbW9uLmphcgotdmFsaWRhdGVzcmMuemlwCi1jb21tb25zcmMuemlwCi1zcmMuemlwCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbl8xLjAuMC56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZiNDI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9kZWJ1Zz10cnVlCi0KLSMgU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2lzaCBwZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiB0byBiZSBsb2dnZWQKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3RpbWluZ3M9ZmFsc2UKLQotIyBzZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHZlcnNpb24gMSB2YWxpZGF0b3IgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdjE9ZmFsc2UKLQotIyBTZXQgdGhpcyB0byBhIGZpbGUgbmFtZSwgaWYgeW91IHdpc2ggdGhlIHJlc3VsdHMgdG8gYmUgbG9nZ2VkIHRvIGEgZmlsZSwgb3RoZXJ3aXNlCi0jIHRoZXkgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZGVyci4gV2hlbiBsb2dnZWQgdG8gYSBmaWxlIHRoZSByZXN1bHRzIGFyZSBpbiBhCi0jIENTViAoY29tbWEgc2VwYXJhdGVkIHZhbHVlcykgZm9ybS4gV2hlbiBsb2dnZWQgdG8gc3RkZXJyIHRoZXkgYXJlIGluIGEgbW9yZSAKLSMgaHVtYW4gcmVhZGFibGUgZm9ybS4KLSMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdGltaW5ncy90cmFjZWZpbGU9Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZkYWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWViNzQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI01vbiBPY3QgMTUgMTU6MTU6NDcgRURUIDIwMDcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Xwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Xwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkZGMxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gSnVuIDExIDE0OjU4OjIyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjBhYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24iLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmRjN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgeHNkcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgeHNkcy8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSB2YWxpZGF0ZV9jb3JlLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCi0gICAgICAgICAgIHZhbGlkYXRlLyxcCi0gICAgICAgICAgIHZmMi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMTFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZSI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnBsdWdpbiI+PC9wYWNrYWdlPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzcyMmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVkFMSURBVElPTl9CVUlMREVSX05BTUU9VmFsaWRhdGlvbgotVkFMSURBVElPTl9QUk9CTEVNTUFSS0VSX05BTUU9VmFsaWRhdGlvbiBNZXNzYWdlCi1Qcm9ibGVtTWFya2VyVjI9VmFsaWRhdGlvbiBNZXNzYWdlCi0KLVZBTElEQVRJT05fUFJPSkVDVE1BUktFUl9OQU1FPUVuYWJsZWQgVmFsaWRhdG9ycwotVkFMSURBVElPTl9QUkVGRVJFTkNFTUFSS0VSX05BTUU9VmFsaWRhdGlvbiBQcmVmZXJlbmNlcwotVmFsaWRhdG9yPVZhbGlkYXRvcgotUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yPVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcgotdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI9dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLVZhbGlkYXRvckRlbGVnYXRlcz1WYWxpZGF0b3IgRGVsZWdhdGVzCi0KLUJ1bmRsZS1OYW1lLjAgPSBWYWxpZGF0aW9uIEZyYW1ld29yawotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLQotRXh0ZW5zaW9uLnZhbGlkYXRvcj1WYWxpZGF0b3IgKFZlcnNpb24gMikKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5NWM3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gIAotPCEtLSBWYWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0b3IiIG5hbWU9IiVWYWxpZGF0b3IiIHNjaGVtYT0ieHNkcy92YWxpZGF0b3JFeHRTY2hlbWEuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yVjIiIG5hbWU9IiVFeHRlbnNpb24udmFsaWRhdG9yIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgbmFtZT0iJVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgc2NoZW1hPSJ4c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciIgbmFtZT0iJXZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIiBzY2hlbWE9InhzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvbkhlbHBlciIgbmFtZT0idmFsaWRhdGlvbkhlbHBlciIgc2NoZW1hPSJ4c2RzL3ZhbGlkYXRpb25IZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yRGVsZWdhdGVzIiBuYW1lPSIlVmFsaWRhdG9yRGVsZWdhdGVzIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yRGVsZWdhdGVzLmV4c2QiLz4gICAKLSAgIAotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gVmFsaWRhdGlvbiBDb250cmlidXRpb25zICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25idWlsZGVyIgotICAgICAgICAgbmFtZT0iJVZBTElEQVRJT05fQlVJTERFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbkJ1aWxkZXIiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2J1aWxkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gUHJvYmxlbSBtYXJrZXJzIG11c3QgYmUgYSBzdWJ0eXBlIG9mIHByb2JsZW1tYXJrZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YXNrIHZpZXcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvYmxlbW1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVWQUxJREFUSU9OX1BST0JMRU1NQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmFsaWRhdGlvblNldmVyaXR5Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idGFyZ2V0T2JqZWN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZ3JvdXBOYW1lIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWVzc2FnZUlkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci08IS0tIERvbid0IHdhbnQgdG8gZGlzcGxheSB0aGlzIG1hcmtlciBpbiB0aGUgdGFzayB2aWV3IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InByb2plY3RtYXJrZXIiCi0gICAgICAgICBuYW1lPSIlVkFMSURBVElPTl9QUk9KRUNUTUFSS0VSX05BTUUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJlbmFibGVkVmFsaWRhdG9yTGlzdCI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9ImF1dG9WYWxpZGF0ZSI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9InJ1bldoZW5CdWlsZCI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im1heE51bU1lc3NhZ2VzIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlcyI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9InZlcnNpb24iPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gRG9uJ3Qgd2FudCB0byBkaXNwbGF5IHRoaXMgbWFya2VyIGluIHRoZSB0YXNrIHZpZXcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJlZmVyZW5jZW1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVWQUxJREFUSU9OX1BSRUZFUkVOQ0VNQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9ImVuYWJsZWRWYWxpZGF0b3JMaXN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iYXV0b1ZhbGlkYXRlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0icnVuV2hlbkJ1aWxkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWF4TnVtTWVzc2FnZXMiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJwcm9qZWN0c0Nhbk92ZXJyaWRlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmVyc2lvbiI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSBHUksgLSBJIGFkZGVkIGEgbmV3IHByb2JsZW0gbWFya2VyIHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIHYyIGNoYW5nZXMgc2VwYXJhdGUgZnJvbSB0aGUgdjEgZnJhbWV3b3JrLiAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJwcm9ibGVtbWFya2VyMiIKLSAgICAgICAgIG5hbWU9IiVQcm9ibGVtTWFya2VyVjIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJvd25lciI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZlODI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLUVyckNvbmZpZz1JV0FFMDEwMEUgRXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gZXJyb3IuIEFuIGludGVybmFsIGVycm9yIGhhcyBoYXBwZW5lZCwgdGhlIHZhbGlkYXRvciB7MH0gaGFzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQgdGhlIHZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50LgotRXJyR3JvdXBOYW1lPUlXQUUwMTAxRSBJbnZhbGlkIGVsZW1lbnQsIGV4cGVjdCBlaXRoZXIgdGhlIGVsZW1lbnQgImluY2x1ZGUiIG9yICJleGNsdWRlIi4KLUVyckZpbHRlclJ1bGU9SVdBRTAxMDJFIEFuIGludmFsaWQgZmlsdGVyIHJ1bGUgaGFzIGJlZW4gZW5jb3VudGVyZWQuCi0KLUVyckdyb3VwTm9UeXBlPUlXQUUwMTAzRSBHcm91cHMgbXVzdCBoYXZlIGEgdmFsaWQgdHlwZSwgbm8gdHlwZSB3YXMgcmV0dXJuZWQKLUVyckdyb3VwSW52YWxpZFR5cGU9SVdBRTAxMDRFIEdyb3VwcyBtdXN0IGhhdmUgYSB2YWxpZCB0eXBlLCB0aGUgZm9sbG93aW5nIGludmFsaWQgdHlwZSB3YXMgcmV0dXJuZWQ6IHswfQotRXJyRGVwZW5kZW5jeVZlcnNpb249SVdBRTAxMDVFIE9ubHkgdmVyc2lvbiB7MH0gaXMgc3VwcG9ydGVkCi0KLUVyclBhdHRlcm5BdHRyaWI9SVdBRTAxMDZFIFRoZSBwYXR0ZXJuIGF0dHJpYnV0ZSBtdXN0IGJlIHN1cHBsaWVkCi1FcnJUeXBlUmVxPUlXQUUwMTA3RSBUeXBlIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlIGZvciBmaWxlIGZpbHRlcnMKLQotVmJmRXhjU3ludGF4Tm9WYWxDbGFzcz1JV0FFMDAxNkUgVmFsaWRhdG9yIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2Ugbm8gImNsYXNzIiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGluIHRoZSA8cnVuPiBlbGVtZW50IG9mIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yIHRoZSB2YWxpZGF0b3IgbmFtZWQgezB9LiBDYW5ub3QgY3JlYXRlIGEgdmFsaWRhdG9yIHVubGVzcyBhIDxydW4+IGVsZW1lbnQgZXhpc3RzIHRoYXQgc3BlY2lmaWVzIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgSVdvcmtiZW5jaEhlbHBlciBpbnRlcmZhY2UuCi1WYmZFeGNTeW50YXhOb1ZhbFJ1bj1JV0FFMDAxNUUgVmFsaWRhdG9yIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2Ugbm8gPHJ1bj4gZWxlbWVudCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBsdWdpbi54bWwgZmlsZSBmb3IgdGhlIHZhbGlkYXRvciBuYW1lZCB7MH0uIENhbm5vdCBjcmVhdGUgYSB2YWxpZGF0b3IgdW5sZXNzIGEgPHJ1bj4gZWxlbWVudCBleGlzdHMgdGhhdCBzcGVjaWZpZXMgdGhlICJjbGFzcyIgYXR0cmlidXRlLiBUaGUgdmFsdWUgb2YgdGhlICJjbGFzcyIgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJV29ya2JlbmNoSGVscGVyIGludGVyZmFjZS4KLVZiZkV4Y1N5bnRheE5vVmFsTnVsbD1JV0FFMDAxOEUgVmFsaWRhdG9yIGNsYXNzIHswfSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oU3RyaW5nKSByZXR1cm5lZCBudWxsLgotCi1FcnJUeXBlPVRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUgaXMgaW5jb3JyZWN0LiBJdCB3YXMgc3BlY2lmaWVkIGFzIHswfSBidXQgdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZTogezF9LCB7Mn0sIHszfQotQ29uZmlnRXJyb3I9SXQgYXBwZWFycyB0aGF0IHZhbGlkYXRvciB7MH0gKHdpdGggaWQgezF9KSBoYXMgYmVlbiBjb25maWd1cmVkIGluY29ycmVjdGx5LCBpdCBwcm9kdWNlZCB7Mn0gbWVzc2FnZXMgd2hpbGUgdmFsaWRhdGluZyB7M30uIEl0IGhhcyBiZWVuIGRpc2FibGVkLiBUcnkgcmVzdG9yaW5nIHRoZSBkZWZhdWx0cyBmb3IgdGhpcyB2YWxpZGF0b3IuCi0KLUdyb3VwSW5jbHVkZT1JbmNsdWRlIEdyb3VwCi1Hcm91cEV4Y2x1ZGU9RXhjbHVkZSBHcm91cAotCi1UeXBlSW5jbHVkZT1pbmNsdWRlCi1UeXBlRXhjbHVkZT1leGNsdWRlCi0KLUpvYk5hbWU9VmFsaWRhdGlvbgotSm9iTmFtZU1vbml0b3I9VmFsaWRhdGlvbiBNb25pdG9yCi1Kb2JJbmRleFNhdmU9SW5kZXggU2F2ZQotCi1NaWdyYXRpb25Kb2JOYW1lPVZhbGlkYXRpb24gU2V0dXAKLQotUnVsZVByb2plY3ROYXR1cmU9UHJvamVjdCBuYXR1cmUKLVJ1bGVGaWxlRXh0PUZpbGUgZXh0ZW5zaW9uCi1SdWxlRmlsZT1GaWxlCi1SdWxlQ29udGVudFR5cGU9Q29udGVudCBUeXBlCi1SdWxlRmFjZXQ9RmFjZXQKLVJ1bGVGb2xkZXI9Rm9sZGVyCi0KLUZpbGVFeHRXaXRoQ2FzZT17MH06IHsxfSAoY2FzZSBzZW5zaXRpdmUpCi1GaWxlRXh0V2l0aG91dENhc2U9ezB9OiB7MX0KLQotQ29udGVudFR5cGVFeGFjdD17MH06IHsxfSAoZXhjbHVkZXMgc3VidHlwZXMpCi1Db250ZW50VHlwZU5vdEV4YWN0PXswfTogezF9IChpbmNsdWRlcyBzdWJ0eXBlcykKLQotTG9nVmFsU3RhcnQ9VmFsaWRhdG9yIHswfSBzdGFydGluZyB0byB2YWxpZGF0ZTogezF9Ci1Mb2dWYWxFbmQ9VmFsaWRhdG9yIHswfSBmaW5pc2hlZCB2YWxpZGF0aW5nOiB7MX0KLUxvZ1ZhbEVuZFRpbWU9VmFsaWRhdG9yIHswfSB3aXRoIGlkIHsxfSBmaW5pc2hlZCB2YWxpZGF0aW5nOiB7Mn0gaW4gezN9Ci1Mb2dWYWxTdW1tYXJ5PVZhbGlkYXRvciB7MH0gd2l0aCBpZCB7MX0gdmFsaWRhdGVkIHsyfSByZXNvdXJjZXMgaW4gezN9Ci1Mb2dWYWxTdW1tYXJ5Mj1WYWxpZGF0b3IgezB9IHdpdGggaWQgezF9IHZhbGlkYXRlZCB7Mn0gcmVzb3VyY2VzIGluIHszfSB1c2luZyB7NH0gb2YgQ1BVIHRpbWUKLUxvZ1Nlc3Npb249U2Vzc2lvbiBzdGFydGVkIG9uOiB7MH0KLQotU2V2RXJyb3I9RXJyb3IKLVNldldhcm5pbmc9V2FybmluZwotU2V2SWdub3JlPUlnbm9yZQotCi1UaW1lVW5kZXI9dW5kZXIgYSBzZWNvbmQKLVRpbWVOYW5vPXswfSBuYW5vc2Vjb25kcwotVGltZU1pY3JvPXswfSBtaWNyb3NlY29uZHMKLVRpbWVTZWM9ezB9IHNlY29uZHMKLVRpbWVNaW49ezB9IG1pbnV0ZXMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV9iYXNlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL3ZhbGlkYXRlX2Jhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3OTZiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL3ZhbGlkYXRlX2Jhc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zLCBlYWNoIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgcHJlZmFjZSB0aGVpciBwcm9wZXJ0eSBuYW1lcyB3aXRoIGFuIGlkZW50aWZpZXIuCi0jCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIENvZGUgb3JpZW50ZWQgaW5zdHJ1Y3Rpb25zOgotIyAgICAgKgotIyAgICAgKiBJbiB0aGUgc3RyaW5nLCB5b3UgbWF5IHNlZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgc2VxdWVuY2VzOgotIyAgICAgKiBhKSB7bn0gIHdoZXJlIG4gaXMgYSBudW1iZXIuIFRoZXNlIGFyZSByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLgotIyAgICAgKiBiKSAnJyAgSW4gLnByb3BlcnRpZXMgZmlsZXMsIGluIG9yZGVyIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZSAoJykgaW4gdGhlIGZpbmFsCi0jICAgICAqICAgIHN0cmluZywgc29tZXRpbWVzIHR3byBhcG9zdHJvcGhlcyBtdXN0IGJlIGVudGVyZWQgaW4gdGhlIHN0cmluZy4gSW4gdGhlIHRyYW5zbGF0ZWQKLSMgICAgICogICAgc3RyaW5nLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUge259IGluIHRoZSBzdHJpbmcsIHRoZW4gdG8gc2hvdyBvbmUgYXBvc3Ryb3BoZQotIyAgICAgKiAgICB0byB0aGUgdXNlciwgcHV0IHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8ge259IGluIHRoZSBzdHJpbmcsCi0jICAgICAqICAgIHRoZW4gcHV0IG9uZSBhcG9zdHJvcGhlLgotIyAgICAgKiAgICBGb3IgZXhhbXBsZSwgc2F5IHRoYXQgeW91IHdhbnQgdGhlIHVzZXIgdG8gcmVhZCAiR2VvcmdlJ3MgZmlsZSIuIAotIyAgICAgKiAgICAgICAgR0VPUkdFPUdlb3JnZSdzIGZpbGUgd2FzIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICAgICAgR0VPUkdFMj1HZW9yZ2UnJ3MgZmlsZSBhbmQgezB9IHdlcmUgb24gdGhlIGRlc2suCi0jICAgICAqICAgIEdFT1JHRSB1c2VzIG9uZSBhcG9zdHJvcGhlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHtufSBhbmQgR0VPUkdFMgotIyAgICAgKiAgICB1c2VzIHR3byBhcG9zdHJvcGhlcyBiZWNhdXNlIHRoZXJlIGlzIGEge259LgotIyAgICAgKiBjKSAnJyB0ZXh0ICcnIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBkb3VibGUKLSMgICAgICogICAgYXBvc3Ryb3BoZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAKLSMgICAgICogZCkgPHRleHQ+IHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBhbmdsZQotIyAgICAgKiAgICBicmFja2V0cyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqIGUpICJ0ZXh0IiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIAotIyAgICAgKiAgICBtYXJrcyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqICAgIAotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBPdGhlciBpbnN0cnVjdGlvbnMKLSMgICAgICogYSkgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdGV4dCB0aGF0IGlzIG9uIGEgbGluZSB3aGljaCBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgCi0jICAgICAqICAgIHN5bWJvbCAoIykuCi0jICAgICAqIGIpIERvIG5vdCB0cmFuc2xhdGUgdGhlc2Ugd29yZHM6IAotIyAgICAgKiAgICAgICAgc2NoZW1hLCBFSkIsIFJEQiwgSkFSLCBSTUksIEJNUCwgQ01QLCBPT1NRTAotIyAgICAgKiBjKSBQbGVhc2UgcmV0dXJuIHRoZSAucHJvcGVydGllcyBmaWxlcyB1c2luZyB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotIyAgICAgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHR3byBvZiB0aGUgZmlsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLgotIyAgICAgKgotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBBbnkgb3RoZXIgY29tbWVudHMgdG8gdGhlIHRyYW5zbGF0b3JzIGFyZSBvbiBsaW5lcyB3aGljaCBzdGFydCBsaWtlIHRoaXM6ICAjIDJUQzoKLSMKLSMgVmVyc2lvbiAxLjE0Ci0jCi0jCi0jIElEOgotIyAgICBWQkYgLSBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrCi0jICAgICAgIFZCRl9FWEM9RXhjZXB0aW9uIG9yIGVycm9yIHRleHQKLSMgICAgICAgVkJGX1NUQVRVUz1TdGF0dXMgbWVzc2FnZQotIyAgICAgICBWQkZfVEFTSz1UYXNrIGxpc3QgbWVzc2FnZQotIwotCi0jIAotIyBCZWdpbiBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFN0cmluZ3MKLSMKLSMgSURzOgotIyAgICBWQkZfRVhDPUV4Y2VwdGlvbiBvciBlcnJvciB0ZXh0Ci0jICAgIFZCRl9TVEFUVVM9U3RhdHVzIG1lc3NhZ2UKLSMgICAgVkJGX1RBU0s9VGFzayBsaXN0IG1lc3NhZ2UKLSMKLVZCRl9FWENfQ0FOTk9UX0FERF9NQVJLRVI9SVdBRTAwMDFFIFRoZSBtYXJrZXIgY2Fubm90IGJlIGFkZGVkIHRvIHJlc291cmNlIHswfSBpbiB0aGUgdGFzayBsaXN0LgotVkJGX0VYQ19DQU5OT1RfUkVNT1ZFX01BUktFUj1JV0FFMDAwMkUgVGhlIG1hcmtlciBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHJlc291cmNlIHswfSBpbiB0aGUgdGFzayBsaXN0LgotCi1WQkZfRVhDX0hFTFBFUl9NSVNTSU5HPUlXQUUwMDAzRSBVbmFibGUgdG8gbG9hZCB7MH0gYmVjYXVzZSBpdCBkaWQgbm90IHNwZWNpZnkgYSA8aGVscGVyPi4gRWFjaCB2YWxpZGF0b3IgbXVzdCBpZGVudGlmeSB0aGUgaGVscGVyIGNsYXNzIHRoYXQgbG9hZHMgaXRzIE1PRiBtb2RlbC4KLVZCRl9FWENfSEVMUEVSX0NBTk5PVExPQUQ9SVdBRTAwMDRFIFVuYWJsZSB0byBsb2FkIHswfSBiZWNhdXNlIGl0cyA8aGVscGVyPiwgezF9LCBjb3VsZCBub3QgYmUgbG9hZGVkLiBFbnN1cmUgdGhhdCB0aGUgY2FzZS1zZW5zaXRpdmUgZmlsZSBuYW1lIGlzIHNwZWxsZWQgY29ycmVjdGx5LgotCi1WQkZfRVhDX0lOVEVSTkFMPUlXQUUwMDA1RSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdmFsaWRhdGlvbi4gVmFsaWRhdGlvbiB3YXMgYmVpbmcgcnVuIG9uIHByb2plY3QgezB9IHdpdGggdmFsaWRhdG9yIHsxfS4gVGhlIG1lc3NhZ2UgdGhyb3duIHdhcyB7Mn0uCi0KLSMgMlRDOiBJbiB0aGUgZm9sbG93aW5nIHN0cmluZywgInR5cGUiIGlzIGEgbm91bgotVkJGX0VYQ19JTlZBTElEX1RZUEVfRklMVEVSPUlXQUUwMDA2RSBJbnZhbGlkIHR5cGUgZmlsdGVyOyB7MH0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7MX0uCi1WQkZfRVhDX0lOVkFMSURfUkVTT1VSQ0U9SVdBRTAwMDdFIENhbm5vdCBhZGQgbWVzc2FnZSAiezB9IiB3aXRoIHRhcmdldCBvYmplY3QgInsxfSIgYmVjYXVzZSBubyBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgY2FuIGJlIGZvdW5kIHdpdGggd2hpY2ggdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlLgotCi1WQkZfRVhDX01JU1NJTkdfVkFMSURBVE9SX0VQPUlXQUUwMDA4RSBUaGUgdmFsaWRhdG9yIGZyYW1ld29yayBjb3VsZCBub3QgYmUgc3RhcnRlZC4gVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lZCBcInswfVwiIGNvdWxkIG5vdCBiZSBmb3VuZC4gU2F2ZSBhbGwgbG9nIGZpbGVzIGFuZCBjb250YWN0IHlvdXIgSUJNIHJlcHJlc2VudGF0aXZlLgotVkJGX0VYQ19NSVNTSU5HX1BST0pFQ1ROQVRVUkVfSUQ9SVdBRTAwMDlFIEEgcHJvamVjdE5hdHVyZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBJRC4gVmFsaWRhdGlvbiBpcyBpZ25vcmluZyB0aGlzIHRhZyBhbmQgY29udGludWluZy4KLQotVkJGX0VYQ19SVU5USU1FPUlXQUUwMDEwRSBSdW4tdGltZSBleGNlcHRpb24gezB9IG9jY3VycmVkIGR1cmluZyB2YWxpZGF0aW9uLiBUaGUgdmFsaWRhdG9yIGJlaW5nIHJ1biB3YXMgezF9IGFuZCB0aGUgbWVzc2FnZSB0aHJvd24gd2FzIHsyfS4KLQotVkJGX0VYQ19TWU5UQVhfTlVMTF9OQU1FPUlXQUUwMDExRSBSZXNvdXJjZSB7MH0gY2Fubm90IGJlIGFkZGVkIHRvIGZpbGUgbGlzdCBiZWNhdXNlIElXb3JrYmVuY2hDb250ZXh0LmdldFBvcnRhYmxlTmFtZSgpIHJldHVybnMgbnVsbC4gVGhpcyByZXNvdXJjZSB3aWxsIG5vdCBiZSB2YWxpZGF0ZWQgYnkgdGhlIHZhbGlkYXRvciBuYW1lZCB7MX0uCi1WQkZfRVhDX1NZTlRBWF9OT19IRUxQRVI9SVdBRTAwMTJFIE5vIDxoZWxwZXI+IGVsZW1lbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yIHZhbGlkYXRvciB7MH0uIFNpbmNlIHRoZSBoZWxwZXIgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSB2YWxpZGF0b3Igd2lsbCBub3QgYmUgbG9hZGVkLgotVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX0NMQVNTPUlXQUUwMDEzRSBObyAiY2xhc3MiIGF0dHJpYnV0ZSBpbiB0aGUgPGhlbHBlcj4gZWxlbWVudCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBsdWdpbi54bWwgZmlsZSBmb3IgdmFsaWRhdG9yIHswfS4gVGhlIGhlbHBlciBjYW5ub3QgYmUgY3JlYXRlZCB3aXRob3V0IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgaXQuIFNpbmNlIHRoZSBoZWxwZXIgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSB2YWxpZGF0b3Igd2lsbCBub3QgYmUgbG9hZGVkLgotVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRT1JV0FFMDAxNEUgVGhlIGhlbHBlciB7MH0gY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSBhIFRocm93YWJsZSB3YXMgY2F1Z2h0LgotVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRT1JV0FFMDAxN0UgQ2Fubm90IGNyZWF0ZSB2YWxpZGF0b3IgezB9IGJlY2F1c2UgYSBUaHJvd2FibGUgd2FzIGNhdWdodC4KLQotVkJGX0VYQ19ESVNBQkxFVj1JV0FFMDAxOUUgQ2Fubm90IGluc3RhbnRpYXRlIHZhbGlkYXRvciB7MH0uIERpc2FibGluZyB0aGUgdmFsaWRhdG9yOyByZWFkIHRoZSBsb2cgZm9yIGRldGFpbHMuCi1WQkZfRVhDX0RJU0FCTEVIPUlXQUUwMDIwRSBDYW5ub3QgaW5zdGFudGlhdGUgaGVscGVyIHswfS4gRGlzYWJsaW5nIHZhbGlkYXRvciB7MX07IHJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4KLVZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1I9SVdBRTAwMjFFIENhbm5vdCBsb2NhdGUgbWV0YS1kYXRhIGZvciB2YWxpZGF0b3IgezB9LgotCi1WQkZfRVhDX1ZBTElEQVRPUk5BTUVfSVNfTlVMTD1JV0FFMDAyMkUgVGhlIHBsdWdpbiB3aXRoIElEIHswfSBoYXMgYmVlbiBkaXNhYmxlZCBiZWNhdXNlIGl0cyBnZXROYW1lKCkgbWV0aG9kIHJldHVybnMgbnVsbC4gVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhIHZhbHVlLgotCi1WQkZfRVhDX05VTExDUkVBVEU9SVdBRTAwMjNFIENhbm5vdCBjcmVhdGUgYSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb24gYSBudWxsIHJlc291cmNlLgotVkJGX0VYQ19OVUxMU0FWRT1JV0FFMDAyNEUgQ2Fubm90IHNhdmUgYSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb24gYSBudWxsIHJlc291cmNlLgotVkJGX0VYQ19TQVZFPUlXQUUwMDI1RSBDb3VsZCBub3Qgc2F2ZSB0aGUgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9uIHJlc291cmNlIHswfS4KLVZCRl9FWENfTlVMTFJFVFJJRVZFPUlXQUUwMDI2RSBDYW5ub3QgcmV0cmlldmUgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBiZWNhdXNlIHJlc291cmNlIGlzIG51bGwuCi1WQkZfRVhDX1JFVFJJRVZFPUlXQUUwMDI3RSBDb3VsZCBub3QgcmV0cmlldmUgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgcmVzb3VyY2UgezB9LgotCi1WQkZfRVhDX0JBRFZNRD1JV0FFMDAyOEUgVmFsaWRhdG9yTWV0YURhdGFbXSBtdXN0IG5vdCBiZSBudWxsIG9yIGVtcHR5LgotVkJGX0VYQ19PUEVOUFJKPUlXQUUwMDI5RSBQcm9qZWN0IHswfSBtdXN0IGJlIG9wZW4uCi1WQkZfRVhDX0VYSVNUUFJKPUlXQUUwMDMwRSBQcm9qZWN0IHswfSBtdXN0IGV4aXN0LgotVkJGX0VYQ19CQURQUko9SVdBRTAwMzFFIFByb2plY3QgezB9IG11c3QgYmUgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgcmVzb3VyY2VzIGluIHRoZSBJUmVzb3VyY2VbXS4KLVZCRl9FWENfTVVMVElQUko9SVdBRTAwMzJFIEFsbCBJUmVzb3VyY2UgaW5zdGFuY2VzIGluIHRoZSBJUmVzb3VyY2VbXSBtdXN0IGJlIHBhcnQgb2YgdGhlIHNhbWUgSVByb2plY3QgaW5zdGFuY2UuIFRoZSByZXNvdXJjZXMgY29tZSBmcm9tIHRoZSBmb2xsb3dpbmcgcHJvamVjdHM6IHswfS4KLVZCRl9FWENfQkFEVkFMPUlXQUUwMDMzRSBWYWxpZGF0b3IgezB9IG11c3QgYmUgY29uZmlndXJlZCBvbiB7MX07Ci0KLVZCRl9TVEFUVVNfSU5JVElBTElaSU5HPUluaXRpYWxpemluZyB7MH0uCi0KLVZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVA9UGVyZm9ybWluZyBjbGVhbnVwIG9uIHswfSBiZWZvcmUgdGVybWluYXRpb24uCi0KLVZCRl9TVEFUVVNfUFJPR1JFU1NNT05JVE9SX1RJVExFPVZhbGlkYXRpbmcKLVZCRl9TVEFUVVNfTlVMTF9ERUxUQT1MYXN0IGJ1aWxkIHN0YXRlIG9mIHswfSBjb3VsZCBub3QgYmUgcmV0cmlldmVkLiBQZXJmb3JtaW5nIGEgZnVsbCB2YWxpZGF0aW9uLgotCi1WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEPVZhbGlkYXRpb24gb2YgezB9IHVzaW5nIHsxfSB3YXMgY2FuY2VsbGVkLgotCi1WQkZfU1RBVFVTX1NUQVJUX1JFTU9WSU5HX09MRF9NRVNTQUdFUz1SZW1vdmluZyB7MH0gbWVzc2FnZXMgb24gezF9IGhhcyBzdGFydGVkLi4uCi1WQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVM9TWVzc2FnZXMgcmVtb3ZlZC4KLQotVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OPVZhbGlkYXRpb24gb2YgezB9IGJ5IHsxfSBoYXMgc3RhcnRlZC4uLgotVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTj1WYWxpZGF0aW9uIG9mIHswfSBieSB7MX0gaXMgY29tcGxldGUuIEFsbCBrbm93biBwcm9ibGVtcyBoYXZlIGJlZW4gcmVwb3J0ZWQuCi1WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFk9VmFsaWRhdGlvbiBvZiB7MH0gYnkgezF9IGVuZGVkIGFibm9ybWFsbHkuIFRoZSBsaXN0IG9mIHByb2JsZW1zIG1heSBiZSBpbmNvbXBsZXRlLiBQbGVhc2UgY2hlY2sgdGhlIGluZm9ybWF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY2F1c2Ugb2YgdGhlIGFibm9ybWFsIHRlcm1pbmF0aW9uLgotCi1WQkZfU1RBVFVTX0xPT0tJTkc9TG9va2luZyBmb3IgdmFsaWRhdGlvbiBtZXNzYWdlcyBvd25lZCBieSB1bmluc3RhbGxlZCB2YWxpZGF0b3JzLi4uCi1WQkZfU1RBVFVTX0xPT0tJTkdET05FPUxvb2tpbmcgZm9yIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLmRvbmUuCi1WQkZfU1RBVFVTX1JFTU9WSU5HPVJlbW92aW5nIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLgotVkJGX1NUQVRVU19SRU1PVklOR0RPTkU9UmVtb3ZpbmcgdmFsaWRhdGlvbiBtZXNzYWdlcyBvd25lZCBieSB1bmluc3RhbGxlZCB2YWxpZGF0b3JzLi4uZG9uZS4KLQotVkJGX1dST05HX0NPTlRFWFRfRk9SX0RFTEVHQVRFPVRoZSB2YWxpZGF0b3IgezB9IGlzIGEgYmVpbmcgaW52b2tlZCB3aXRoIGEgd3JvbmcgY29udGV4dC4gUGxlYXNlIHVzZSBhbiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0LgotVkJGX05PX0RFTEVHQVRFPVRoZSB2YWxpZGF0b3IgezB9IGlzIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IgYnV0IG5vIGRlbGVnYXRlIGNhbiBmb3VuZCBmb3IgaXQuCi1WQkZfQ0FOTk9UX0lOU1RBTlRJQVRFX0RFTEVHQVRFPVRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgezB9IHJlZ2lzdGVyZWQgZm9yIHsxfSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aWxsIGJlIGRlbGV0ZWQgc29vbi4KLVZCRl9UQVNLX1dBUk5fTUVTU0FHRV9MSU1JVF9BQk9SVD1JV0FFMDAzNFcgSVdBRDMwMDBJOiB7MX0gdGVybWluYXRlZCB2YWxpZGF0aW9uIG9mIHswfSBiZWNhdXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB3ZXJlIHJlcG9ydGVkLiBTb21lIG1lc3NhZ2VzIG1heSBiZSBtaXNzaW5nLgotCi1WQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfVkFMPUlXQUUwMDM1VyBJV0FEMzAwMEk6IFNvbWUgbWVzc2FnZXMgbWF5IGJlIG1pc3NpbmcgYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaGFzIGJlZW4gcmVwb3J0ZWQuIEluY3JlYXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhbmQgdHJ5IGFnYWluLgotVkJGX1ZBTElEQVRJT05fSk9CX01TRz1XYWl0aW5nIGZvciBidWlsZAotCi0jCi0jIEVuZCBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFN0cmluZ3MKLSMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9yZW1pbmRlcnMudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9yZW1pbmRlcnMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGMyMzIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcmVtaW5kZXJzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTEpIFRoZSByZXN0b3JlIGRlZmF1bHRzIGJ1dHRvbiB3b3JrcyBpbW1lZGlhdGVseSwgaWYgdGhlIHVzZXIgbGF0ZXIgcHJlc3NlcyBjYW5jZWwsIHRoZSByZXN0b3JlIHNob3VsZCBub3QgaGFwcGVuLgotMikgU2hvdWxkIEkgYWRkIGNoZWNrcyBmb3IgVGVhbSBQcml2YXRlIGFuZCBkZXJpdmVkPwotCi00KSBBZGRpbmcgYSBuZXcgdmFsaWRhdG9yIGhhZCBubyBmaWx0ZXJzLCB1bnRpbCBhIHJlc3RvcmUgZGVmYXVsdHMgd2FzIGZvcmNlZC4KLTUpIEhvdyBkbyB5b3UgZ2V0IHlvdXIgYnVpbGRlciBhZGRlZCB0byBhIG5ldyBwcm9qZWN0PwotCi1SZW1lbWJlciB0byBkZWxldGUgdGhpcyBmaWxlIHdoZW4geW91IGFyZSBkb25lLgotCi1UbyB1cGdyYWRlIGFuIGV4aXN0aW5nIHZhbGlkYXRvcgotCi0xKSBJIGNoYW5nZWQgdGhlIHBsdWctaW4gdG8gdXNlIHRoZSBuZXcgRVAKLTIpIEkga2VlcCB0aGUgdmFsaWRhdG9yIGFzIGltcGxlbWVudGluZyBhbiBJVmFsaWRhdG9yICh0byBtYWtlIHNvbWUgb2YgdGhlIG90aGVyIGNhbGxzIGVhc2llcikKLTMpIEFkZCBwcm9qZWN0IGxldmVsIG9wdGlvbnMKLTYpIFNpbmNlIEkgaGlqYWNrZWQgY29sdW1uIDMsIHdoYXQgc2hvdWxkIEkgZG8gYWJvdXQgZGVsZWdhdGluZyB2YWxpZGF0b3JzPwotLSBJZiBpdCBpcyBhbiBvbGQgdmFsaWRhdG9yIGNhbGwgdGhlIG9sZCBkaWFsb2cKLS0gSWYgaXQgaXMgYSBuZXcgdmFsaWRhdG9yLCBhZGQgYSBjb21ibyBib3ggdG8gdGhlIHNldHRpbmdzIHBhZ2UKLS0gTm90ZSAtIHRoZSBkZWxlZ2F0aW5nIEVQIGhhcyBhIHRhcmdldCwgd2hpY2ggaXMgcmVhbGx5IG5vIG1vcmUgdGhhbiBhIG5hbWUsIGFuZCBhIGNsYXNzIHdoaWNoIGlzIHdoYXQgcmVhbGx5IGdldHMKLXNlbGVjdGVkLCBhbmQgdGhlbiBjYWxsZWQuIEluIHRoZSBjYXNlIG9mIHRoZSBYU0QgdmFsaWRhdG9yLCB0aGUgdGFyZ2V0IGlzIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IuIChUaGlzIHBob25leQotdGFyZ2V0IGlzIHdoYXQgeW91IGFkZCB5b3VyIGZpbHRlcnMgdG8pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiM2U3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFZhbGlkYXRpb24gY29uc3RhbnRzIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIG1hcmtlciBleHRlbnNpb24gcG9pbnQgYW5kIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIE9ubHkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNob3VsZCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JU3RyaW5nIERJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORyA9ICJkaXNhYmxlQWxsVmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbgotCVN0cmluZyBTQVZFX0FVVE9NQVRJQ0FMTFlfU0VUVElORyA9ICJzYXZlQXV0b21hdGljYWxseSI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbgotCi0JLy8gRGVmYXVsdHMgZm9yIHRoZSBwcmVmZXJlbmNlIGFuZCBwcm9qZWN0IHZhbHVlcwotCQotCVN0cmluZyBDVVJSRU5UX1ZFUlNJT04gPSAoU3RyaW5nKSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEhlYWRlcnMoKS5nZXQob3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7ICAvLyB0aGlzIGlzIGEgY29uc3RhbnQsIHNvIGl0IHNob3VsZCBiZSBpbnRlcm4KLQlib29sZWFuIERFRkFVTFRfQVNZTkMgPSB0cnVlOwotCWJvb2xlYW4gREVGQVVMVF9ESVNBQkxFX1ZBTElEQVRJT05fU0VUVElORyA9IGZhbHNlOwotCVZhbGlkYXRvck1ldGFEYXRhW10gREVGQVVMVF9FTkFCTEVEX1ZBTElEQVRPUlMgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGFBcnJheUVuYWJsZWRCeURlZmF1bHQoKTsgIC8vIHN0b3JlIGEgY29weSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBhbmQgZG9uJ3QgY3JlYXRlIGEgY29weSBldmVyeSB0aW1lIHdlIG5lZWQgdGhpcyB2YWx1ZQotCWludCBERUZBVUxUX01BWE5VTU1FU1NBR0VTID0gNTA7Ci0JaW50IERFUFRIX0lORklOSVRFID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCWludCBERVBUSF9aRVJPID0gSVJlc291cmNlLkRFUFRIX1pFUk87Ci0JU3RyaW5nIEVMRU1FTlRfU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkIC8vIHNlcGFyYXRlcyB0aGUgbmFtZSBvZiBvbmUgSVZhbGlkYXRvciBmcm9tIHRoZSBuZXh0IGluIHRoZSBsaXN0IG9mIGVuYWJsZWQgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0IG9yIHByZWZlcmVuY2UKLQlTdHJpbmcgREVMRUdBVEVTX1NFUEFSQVRPUiA9ICI9IjsgLy8kTk9OLU5MUy0xJCAvLyBTZXBhcmF0ZXMgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yIGlkIGZyb20gdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBpZCBpbiB0aGUgbGlzdCBvZiBkZWxlZ2F0ZXMKLQotCS8vIFRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHByZWZlcmVuY2UgbWFya2VyIGFzIHNob3duIGluCi0JLy8gcGx1Z2luLnhtbAotCS8vIEV2ZW4gdGhvdWdoIHRoZSBwbHVnaW4ueG1sIHZhbHVlcyBhcmUgbm90IHVzZWQgdG8gY3JlYXRlIG5ldyBQcmVmZXJlbmNlIG9yIFByb2plY3QgbWFya2VycywKLQkvLyBtYWludGFpbmluZyBvbmUgbG9jYWwgbmFtZSBlbnN1cmVzIHRoYXQgdGhlcmUncyBubyBjb25mdXNpb24gd3JpdGluZyB0aGUgbWlncmF0aW9uIGNvZGUuCi0JLy8gVGhlc2UgYXJlIHRoZSBRdWFsaWZpZWROYW1lcyB1c2VkIHRvIHBlcnNpc3QgdGhlIHVzZXIncyBzZXR0aW5ncy4KLQlTdHJpbmcgRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUyA9ICJlbmFibGVkTWFudWFsVmFsaWRhdG9yTGlzdCI7IC8vJE5PTi1OTFMtMSQgLy8gU3RyaW5nCi0JU3RyaW5nIEVOQUJMRURfQlVJTERfVkFMSURBVE9SUyA9ICJlbmFibGVkQnVpbGRWYWxpZGF0b3JMaXN0IjsgLy8kTk9OLU5MUy0xJCAvLyBTdHJpbmcKLQlTdHJpbmcgREVMRUdBVEVfVkFMSURBVE9SUyA9ICJkZWxlZ2F0ZVZhbGlkYXRvckxpc3QiOyAvLyROT04tTkxTLTEkIC8vIFN0cmluZwotCVN0cmluZyBKMkVFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZSI7IC8vJE5PTi1OTFMtMSQgLy8gRm9yIDQuMDMsIHRoaXMgaXMgdGhlIHBsdWdpbiBpZCB0aGF0IHRoZSB2YWxpZGF0aW9uIGNvbnN0YW50cyB3ZXJlIGRlY2xhcmVkIGluLgotCVN0cmluZyBNQVhOVU1NRVNTQUdFUyA9ICJtYXhOdW1NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQgLy8gaW50ZWdlcgotCVN0cmluZyBQTFVHSU5fSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQlTdHJpbmcgUFJFRl9QUk9KRUNUU19DQU5fT1ZFUlJJREUgPSAicHJvamVjdHNDYW5PdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbgotCS8vIGVuZCB2YWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGNvbnN0YW50cwotCi0JLy8gUHJlZmVyZW5jZSBhbmQgUHJvamVjdCBjb25zdGFudHMKLQlTdHJpbmcgUFJFRkVSRU5DRV9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByZWZlcmVuY2VtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSl9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByb2plY3RtYXJrZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBleHRlbnNpb24gd2hpY2ggc2F2ZXMgdXNlciB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGZvciBhIHBhcnRpY3VsYXIgcHJvamVjdCAoZS5nLiB3aGljaCB2YWxpZGF0b3JzIHJ1biBvbiB0aGUgcHJvamVjdCkKLQlTdHJpbmcgUFJKX01BUktFUl80MDMgPSBKMkVFX1BMVUdJTl9JRCArICIucHJvamVjdG1hcmtlciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIGV4dGVuc2lvbiB3aGljaCBzYXZlcyB1c2VyIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0IChlLmcuIHdoaWNoIHZhbGlkYXRvcnMgcnVuIG9uIHRoZSBwcm9qZWN0KQotCVN0cmluZyBQUkpfT1ZFUlJJREVHTE9CQUwgPSAib3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbiAoVXNlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgb3Igb3ZlcnJpZGUpCi0KLQlRdWFsaWZpZWROYW1lIFVTRVJfUFJFRkVSRU5DRSA9IG5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgIlZhbGlkYXRpb25Db25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUmVzb3VyY2UKLQlRdWFsaWZpZWROYW1lIFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UgPSBuZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJWYWxpZGF0aW9uTWFudWFsQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGZvciB0aGUgSVJlc291cmNlCi0JUXVhbGlmaWVkTmFtZSBVU0VSX0JVSUxEX1BSRUZFUkVOQ0UgPSBuZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJWYWxpZGF0aW9uQnVpbGRDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUmVzb3VyY2UKLQlRdWFsaWZpZWROYW1lIERFTEVHQVRFU19QUkVGRVJFTkNFID0gbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAiVmFsaWRhdGlvbkRlbGVnYXRlc0NvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBmb3IgdGhlIElSZXNvdXJjZQotCi0JLy8gVmFsaWRhdGlvbiBtZXNzYWdlIG1hcmtlciBjb25zdGFudHMKLQkKLQkvKiogVGhlIGV4dGVuc2lvbiB3aGljaCBpcyB1c2VkIHRvIGFkZCB2YWxpZGF0aW9uIG1hcmtlcnMgdG8gdGhlIHRhc2sgbGlzdCAqLwotCVN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqIEZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGlzIGZpZWxkIGFzc29jaWF0ZXMgYSBtZXNzYWdlIHdpdGggYSBncm91cCwgc28gdGhhdCBhIHN1YnNldCBvZiBtZXNzYWdlcyBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgZmlsZS4gKi8KLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfR1JPVVAgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAgUGVyc2lzdCB0aGUgbWVzc2FnZSBpZCBvZiB0aGUgbWVzc2FnZSwgbm90IGp1c3QgdGhlIHRyYW5zbGF0ZWQgdGV4dC4gKi8KLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEID0gIm1lc3NhZ2VJZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGFzIHNob3duIGluIHBsdWdpbi54bWwKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBJVmFsaWRhdG9yIHdobyBvd25zIHRoZSBJTWFya2VyIG9uIHRoZSB0YXNrIGxpc3QKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkgPSAidmFsaWRhdGlvblNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJCAvLyBvbmUgb2YgdGhlIFNldmVyaXR5RW51bSB2YWx1ZXMKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUID0gInRhcmdldE9iamVjdCI7IC8vJE5PTi1OTFMtMSQgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgSVJlc291cmNlLCB0aGlzIGZpZWxkIGlkZW50aWZpZXMgd2hpY2ggdGFyZ2V0T2JqZWN0IG93bnMgYSBwYXJ0aWN1bGFyIG1lc3NhZ2UuCi0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdTQUQgdmVyc2lvbnMgd2hpY2ggY3JlYXRlZCBtYXJrZXJzIG9mIHRoZXNlIHR5cGVzCi0JU3RyaW5nIFZFUlNJT040XzAzID0gIjQuMDMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT041XzAgPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWRVJTSU9ONV8wMSA9ICI1LjAuMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBlbmQgcHJlZmVyZW5jZSBhbmQgcHJvamVjdCBkZWZhdWx0cwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzBjMGJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIE9ubHkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGNhbiB1c2UgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIoKSB7fQotCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSB2YWxpZGF0aW9uIG1hcmtlciwgcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIHdobyBvd25zCi0JICogdGhlIG1lc3NhZ2UuIElmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGZvdW5kIG9yIGlmIHRoZSBtYXJrZXIgaXMgbm90IGEgdmFsaWRhdGlvbiBtYXJrZXIsCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3IoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAoIW1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKFZBTElEQVRJT05fTUFSS0VSKSlyZXR1cm4gbnVsbDsKLQotCQkJT2JqZWN0IGF0dHJpYiA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJLy8gb3duZXIgbm90IHNldAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGF0dHJpYi50b1N0cmluZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWFya2VyIGlzIGEgdmFsaWRhdGlvbiBtYXJrZXIuIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhWQUxJREFUSU9OX01BUktFUik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgdXNlIGJ5IHRoZSBUVlQgVmFsaWRhdGlvbiBwbHVnLWluIE9OTFkhISEgTm8gY29kZSBzaG91bGQgYWNjZXNzIHRoZQotCSAqIHZhbGlkYXRpb24gbWFya2VycyBpbiB0aGUgbGlzdCBkaXJlY3RseSBleGNlcHQgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQgdGhlIFRWVAotCSAqIFZhbGlkYXRpb24gcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxWYWxpZGF0aW9uTWFya2VycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICgocHJvamVjdCA9PSBudWxsKSB8fCAoIXByb2plY3QuaXNPcGVuKCkpKXJldHVybjsKLQotCQl0cnkgewotCQkJcHJvamVjdC5kZWxldGVNYXJrZXJzKFZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgREVQVEhfSU5GSU5JVEUpOyAvLyBmYWxzZSBtZWFucyBvbmx5Ci0JCQkvLyBjb25zaWRlciBWQUxJREFUSU9OX01BUktFUiwgbm90IHZhcmlhbnRzIG9mIFZBTElEQVRJT05fTUFSS0VSLiAKLQkJCS8vU2luY2UgYWRkVGFzayBvbmx5IGFkZHMgVkFMSURBVElPTl9NQVJLRVIsIHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgaXRzIHN1YnR5cGVzLgotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGZvciB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uIGdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5nZXRSb290KCk7Ci0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBudWxsOwotCQl0cnkgewotCQkJZ3AgPSAoR2xvYmFsQ29uZmlndXJhdGlvbikgcm9vdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCWlmIChncCA9PSBudWxsKWdwID0gZ2V0R2xvYmFsQ29uZmlndXJhdGlvbihyb290KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Jvb3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JCXJldHVybiBncDsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgR2xvYmFsQ29uZmlndXJhdGlvbiBnZXRHbG9iYWxDb25maWd1cmF0aW9uKElXb3Jrc3BhY2VSb290IHJvb3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlncCA9IChHbG9iYWxDb25maWd1cmF0aW9uKSByb290LmdldFNlc3Npb25Qcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKGdwID09IG51bGwpIHsKLQkJCQlncCA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKHJvb3QpOwotCQkJCVByZWZlcmVuY2VzIHByZWZzID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCWlmKCBwcmVmcyAhPSBudWxsICl7Ci0JCQkJCXByZWZzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZ3ApOwotCQkJCX0KLQkJCQkKLQkJCQlncC5nZXRWZXJzaW9uKCk7IC8vIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24ncyB2ZXJzaW9uIGF0dHJpYnV0ZQotCQkJCWdwLmxvYWQoKTsgLy8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHN0b3JlZCB2YWx1ZXMKLQkJCQlncC5wYXNzaXZhdGUoKTsgLy8gc3RvcmUgdGhpcyBpbnN0YW5jZSBhcyBhIHByb3BlcnR5IG9uIHRoZSBJUmVzb3VyY2UKLQkJCX0KLQkJCXJldHVybiBncDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Jvb3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JfQotCi0JcHVibGljIFByb2plY3RDb25maWd1cmF0aW9uIGdldFByb2plY3RDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcmpwID0gKFByb2plY3RDb25maWd1cmF0aW9uKSBwcm9qZWN0LmdldFNlc3Npb25Qcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKHByanAgPT0gbnVsbCB8fCAhcHJqcC5nZXRSZXNvdXJjZSgpLmV4aXN0cygpKSB7Ci0JCQkJcHJqcCA9IG5ldyBQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQlwcmpwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJcHJqcC5sb2FkKCk7IC8vIGluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSBmcm9tIHRoZSBzdG9yZWQgdmFsdWVzCi0JCQkJcHJqcC5wYXNzaXZhdGUoKTsgLy8gc3RvcmUgdGhpcyBpbnN0YW5jZSBhcyBhIHByb3BlcnR5IG9uIHRoZSBJUmVzb3VyY2UKLQkJCX0KLQkJCXJldHVybiBwcmpwOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUHJvamVjdENvbmZpZ3VyYXRpb24gZ2V0UHJvamVjdENvbmZpZ3VyYXRpb25XaXRob3V0TWlncmF0ZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBudWxsOwotCQl0cnkgewotCQkJcHJqcCA9IChQcm9qZWN0Q29uZmlndXJhdGlvbikgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCWlmIChwcmpwID09IG51bGwgfHwgIXByanAuZ2V0UmVzb3VyY2UoKS5leGlzdHMoKSkgewotCQkJCXByanAgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJcHJqcC5nZXRWZXJzaW9uKCk7IC8vIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24ncyB2ZXJzaW9uIGF0dHJpYnV0ZQotCQkJCXByanAubG9hZCgpOyAvLyBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgZnJvbSB0aGUgc3RvcmVkIHZhbHVlcwotCQkJCXByanAucGFzc2l2YXRlKCk7IC8vIHN0b3JlIHRoaXMgaW5zdGFuY2UgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgSVJlc291cmNlCi0JCQl9Ci0JCQlyZXR1cm4gcHJqcDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgbmF0dXJlIG9mIHRoZSBwcm9qZWN0IGhhcyBjaGFuZ2VkOyB1cGRhdGUgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBkb2Vzbid0IGRvIGFueXRoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvamVjdE5hdHVyZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2luZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNNaWdyYXRlZChwcm9qZWN0KSkgewotCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJaWYoIXByanAudXNlR2xvYmFsUHJlZmVyZW5jZSgpKQotCQkJCQlwcmpwLnN0b3JlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5pbmcoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBEbyBub3QgbG9hZCBvciBtaWdyYXRlIHRoZSBwcm9qZWN0IGluIHRoaXMgbWV0aG9kOyBsZXQgdGhlIGdldENvbmZpZ3VyYXRpb24oSVByb2plY3QpCi0JCS8vIG1ldGhvZCBkbyB0aGF0LiBEbyBub3QgbG9hZCB0aGUgcHJvamVjdCBiZWZvcmUgaXQncyBuZWNlc3NhcnkuCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhcmUgYXQgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgbWV0YWRhdGEsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbE1pZ3JhdGVkKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uZ2V0Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IChHbG9iYWxDb25maWd1cmF0aW9uKSByb290LmdldFNlc3Npb25Qcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKGdwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ3AuaXNWZXJzaW9uQ3VycmVudCgpOwotCQkJfQotCi0JCQlTdHJpbmcgc2VyaWFsaXplZFByanAgPSByb290LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKHNlcmlhbGl6ZWRQcmpwICE9IG51bGwpIHsKLQkJCQlncCA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKHJvb3QpOwotCQkJCWdwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJcmV0dXJuIGdwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Jvb3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyB0aGUgY3VycmVudCBsZXZlbCBvZiBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlncmF0ZWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IChQcm9qZWN0Q29uZmlndXJhdGlvbikgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCQlpZiAocHJqcCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwcmpwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHNlcmlhbGl6ZWRQcmpwID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCQlpZiAoc2VyaWFsaXplZFByanAgIT0gbnVsbCkgewotCQkJCQlwcmpwID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQlwcmpwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzCi0JCQkJCS8vIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJCXJldHVybiBwcmpwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHByb2plY3QgaGFzIG92ZXJyaWRkZW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBvciBub3QuIElmIHRoZSBwcm9qZWN0IGV4aXN0cyBhbmQgaXMgYWxsb3dlZCB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gYW5zd2VyIHRoZQotCSAqIHByb2plY3QgY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGFuc3dlciB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIHByb2plY3QgaXQgY2FuIGJlIG51bGwKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIGdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGMgPSBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJaWYgKHBjICE9IG51bGwgJiYgIXBjLnVzZUdsb2JhbFByZWZlcmVuY2UoKSlyZXR1cm4gcGM7Ci0JCXJldHVybiBnZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V2ZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9FdmVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiYTYxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cyBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgc3RhdGljIEV2ZW50TWFuYWdlciBfaW5zdDsKLQkKLQkvLyBmYWxzZSBtZWFucyB0aGF0IGVjbGlwc2UgaXMgbm90IHNodXR0aW5nIGRvd24sIGFuZCB0cnVlIG1lYW5zIHRoYXQgaXQgaXMgc2h1dHRpbmcgZG93bi4gCi0JLy8gVXNlZCBpbiB0d28gbWV0aG9kczogc2h1dGRvd24oKSxhbmQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCXByaXZhdGUgYm9vbGVhbiBfc2h1dGRvd247IAotCi0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgX3Bvc3RBdXRvQnVpbGRWaXNpdG9yID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gX2lzQWN0aXZlID0gZmFsc2U7IC8vIGhhcyB0aGUgcmVnaXN0cnkgYmVlbiByZWFkPwotCi0JcHJpdmF0ZSBFdmVudE1hbmFnZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFdmVudE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKF9pbnN0ID09IG51bGwpX2luc3QgPSBuZXcgRXZlbnRNYW5hZ2VyKCk7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuaW5nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhVmFsaWRhdGlvblBsdWdpbi5pc0FjdGl2YXRlZCgpKXJldHVybjsKLQotCQkvLyBXaGVuIHRoZSBwcm9qZWN0IGlzIG9wZW5lZCwgY2hlY2sgZm9yIGFueSBvcnBoYW5lZCB0YXNrcwotCQkvLyBvciB0YXNrcyB3aG9zZSBvd25lcnMgbmVlZCB0byBiZSB1cGRhdGVkLgotCQlDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkub3BlbmluZyhwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zaW5nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhVmFsaWRhdGlvblBsdWdpbi5pc0FjdGl2YXRlZCgpKXJldHVybjsKLQotCQl0cnkgewotCQkJYm9vbGVhbiBpc01pZ3JhdGVkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzTWlncmF0ZWQocHJvamVjdCk7Ci0JCQkvLyBJZiBpdCdzIG5vdCBtaWdyYXRlZCwgdGhlbiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGxvYWQgdGhlCi0JCQkvLyB2YWxpZGF0b3IgYW5kIGl0cyBwcmVyZXF1aXNpdGUgcGx1Zy1pbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0KLQkJCQkJaWYgKCF2bWQuaXNBY3RpdmUoKSkgewotCQkJCQkJLy8gSWYgdGhpcyB2YWxpZGF0b3IgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCwgb3IgaWYgaXQgaGFzIGJlZW4gc2h1dCBkb3duLAotCQkJCQkJLy8gZG9uJ3QgYWN0aXZhdGUgaXQgYWdhaW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJaGVscGVyLmNsb3NpbmcoKTsKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcyBwYXJ0aWN1bGFyIGhlbHBlciwgbG9nIHRoZSBlcnJvciBhbmQKLQkJCQkJCS8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5jbG9zaW5nKHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0aW5nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaXNNaWdyYXRlZCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5pc01pZ3JhdGVkKHByb2plY3QpOwotCQkJLy8gSWYgaXQncyBub3QgbWlncmF0ZWQsIHRoZW4gaXQgaGFzbid0IGJlZW4gbG9hZGVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBsb2FkIHRoZQotCQkJLy8gdmFsaWRhdG9yIGFuZCBpdHMgcHJlcmVxdWlzaXRlIHBsdWdpbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0KLQkJCQkJaWYgKCF2bWQuaXNBY3RpdmUoKSkgewotCQkJCQkJLy8gSWYgdGhpcyB2YWxpZGF0b3IgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCwgb3IgaWYgaXQgaGFzIGJlZW4gc2h1dCBkb3duLAotCQkJCQkJLy8gZG9uJ3QgYWN0aXZhdGUgaXQgYWdhaW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJaGVscGVyLmRlbGV0aW5nKCk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgaGVscGVyLCBsb2cgdGhlIGVycm9yIGFuZAotCQkJCQkJLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmRlbGV0aW5nKHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgYSBwcm9qZWN0J3MgZGVzY3JpcHRpb24gY2hhbmdlcywgVGhlIHByb2plY3QgbWF5IGhhdmUgY2hhbmdlZCBpdHMgbmF0dXJlLiBVcGRhdGUgdGhlIGNhY2hlCi0JICogdG8gcmVmbGVjdCB0aGUgbmV3IG5hdHVyZXMuIFRoZSBwcm9qZWN0IGNvdWxkIGJlIG9wZW5pbmcuIE1pZ3JhdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvc3RBdXRvQ2hhbmdlKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChfcG9zdEF1dG9CdWlsZFZpc2l0b3IgPT0gbnVsbCkgewotCQkJX3Bvc3RBdXRvQnVpbGRWaXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZiAoc3ViZGVsdGEgPT0gbnVsbCkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHN1YmRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQkJCWlmICgoc3ViZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSA9PSBJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTikgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKChzdWJkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gSVJlc291cmNlRGVsdGEuT1BFTikgewotCQkJCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQkJCS8vIFByb2plY3Qgd2FzIGp1c3Qgb3BlbmVkLiBJZiBwcm9qZWN0LmlzT3BlbigpIGhhZCByZXR1cm5lZCBmYWxzZSwKLQkJCQkJCQkJLy8gcHJvamVjdCB3b3VsZCBqdXN0IGhhdmUgYmVlbiBjbG9zZWQuCi0JCQkJCQkJCW9wZW5pbmcocHJvamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkZWx0YS5hY2NlcHQoX3Bvc3RBdXRvQnVpbGRWaXNpdG9yLCB0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHNvbWUgcmVzb3VyY2UgY2hhbmdlcyBoYXZlIGhhcHBlbmVkIG9uIHRoZSBwbGF0Zm9ybS4gSWYgdGhlIGNoYW5nZQotCSAqIGlzIGEgcHJvamVjdCBkZWxldGlvbiwgdGhhdCBwcm9qZWN0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgotCSAqIAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEKLQkgKiBAc2VlIElSZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoX3NodXRkb3duICYmICFpc0FjdGl2ZSgpKSB7Ci0JCQkvLyBJZiB3ZSdyZSBzaHV0dGluZyBkb3duLCBhbmQgbm90aGluZyBoYXMgYmVlbiBhY3RpdmF0ZWQsIGRvbid0IG5lZWQgdG8KLQkJCS8vIGRvIGFueXRoaW5nLgotCQkJcmV0dXJuOwotCQl9Ci0KLS8vCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSl7Ci0vLwkJCVRyYWNpbmcubG9nKCJJUmVzb3VyY2VDaGFuZ2VFdmVudCB0eXBlID0gIiArIC8vJE5PTi1OTFMtMSQKLS8vCQkJCU1pc2MucmVzb3VyY2VDaGFuZ2VFdmVudFR5cGUoZXZlbnQuZ2V0VHlwZSgpKSArIAotLy8JCQkJIiwgcmVzb3VyY2UgPSAiICsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCWV2ZW50LmdldFJlc291cmNlKCkgKyAiLCBzb3VyY2UgPSAiICsgZXZlbnQuZ2V0U291cmNlKCkgKyAiLCBkZWx0YSA9ICIgKyAgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0vLwkJCQlldmVudC5nZXREZWx0YSgpKTsKLS8vCQkJCQotLy8JCX0KLQkJCi0JCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCWJvb2xlYW4gaXNQcm9qZWN0ID0gZXZlbnQuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0OwotCQkJaWYgKChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkgJiYgaXNQcm9qZWN0KSB7Ci0JCQkJZGVsZXRpbmcoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSBpZiAoKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpICYmIGlzUHJvamVjdCkgewotCQkJCWNsb3NpbmcoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpIHsKLQkJCQlwb3N0QXV0b0NoYW5nZShldmVudC5nZXREZWx0YSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBWYWxpZGF0aW9uUGx1Z2luIGlzIHNodXR0aW5nIGRvd24uIChVc3VhbGx5IGltcGxpZXMgdGhhdAotCSAqIGVpdGhlciB0aGUgcGx1Zy1pbiBjb3VsZCBub3QgbG9hZCwgb3IgdGhhdCB0aGUgd29ya2JlbmNoIGlzIHNodXR0aW5nIGRvd24uKQotCSAqIDxwPgotCSAqIFRoZSBtYW5hZ2VyIHdpbGwgdGhlbiBub3RpZnkgYWxsIGFjdGl2ZSBoZWxwZXJzIG9mIHRoZSBzaHV0ZG93biwgc28gdGhhdCB0aGV5IG1heSBwZXJmb3JtIGFueQotCSAqIGxhc3QtbWludXRlIHdyaXRlcyB0byBkaXNrLCBjbGVhbnVwLCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQkvLyByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpIG5lZWRzIHRvIGtub3cgd2hlbiBhIHNodXRkb3duIGhhcyBzdGFydGVkLgotCQkJX3NodXRkb3duID0gdHJ1ZTsKLQotCQkJLy8gSWYgdGhlIHZhbGlkYXRvcnMgYXJlIGxvYWRlZCwgdGhlbiBmb3IgZXZlcnkgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLAotCQkJLy8gd2UgbXVzdCBzZWUgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBJZiBpdCBoYXMsIGV2ZXJ5IGVuYWJsZWQgSVdvcmtiZW5jaENvbnRleHQKLQkJCS8vIG11c3QgYmUgY2FsbGVkIHRvIGNsZWFuIHVwLiBJZiB0aGUgcHJvamVjdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIHRoZW4gbm8KLQkJCS8vIElXb3JrYmVuY2hDb250ZXh0IGJ1aWx0IGFueXRoaW5nLCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGNsZWFuIHVwLgotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gbnVsbDsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJLy8gSWYgdGhlIHByb2plY3QgaXNuJ3Qgb3BlbmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gY2xlYW4gdXAuCi0JCQkJCS8vIElmIHRoZSBwcm9qZWN0IHdhcyBvcGVuZWQsIGl0IHdvdWxkIGhhdmUgYmVlbiBtaWdyYXRlZCwgYW5kIHRoZXJlJ3Mgc29tZXRoaW5nCi0JCQkJCS8vIHRvIGNsZWFuIHVwLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlib29sZWFuIGlzTWlncmF0ZWQgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNNaWdyYXRlZChwcm9qZWN0KTsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWlncmF0ZWQsIHRoZW4gaXQgaGFzbid0IGJlZW4gbG9hZGVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBsb2FkCi0JCQkJCS8vIHRoZSB2YWxpZGF0b3IgYW5kIGl0cyBwcmVyZXF1aXNpdGUgcGx1Zy1pbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQkJCWlmIChpc01pZ3JhdGVkKSB7Ci0JCQkJCQlwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCi0JCQkJCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZExpc3QgPSBwcmpwLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQkJCQkvLyBpZiB2bWRMaXN0IGlzIG51bGwsIElQcm9qZWN0IGhhcyBuZXZlciBiZWVuIGxvYWRlZCwgc28gbm90aGluZyB0byBjbGVhbiB1cAotCQkJCQkJaWYgKHZtZExpc3QgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdm1kTGlzdC5sZW5ndGg7IGorKykgewotCQkJCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRMaXN0W2pdOwotCi0JCQkJCQkJCWlmICghdm1kLmlzQWN0aXZlKCkpIHsKLQkJCQkJCQkJCS8vIElmIHRoaXMgdmFsaWRhdG9yIGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQsIG9yIGlmIGl0IGhhcyBiZWVuCi0JCQkJCQkJCQkvLyBzaHV0IGRvd24sIGRvbid0IGFjdGl2YXRlIGl0IGFnYWluLgotCQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaGVscGVyLnNodXRkb3duKCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJCQkJLy8gU2luY2Ugd2UncmUgc2h1dHRpbmcgZG93biwgaWdub3JlIHRoZSBleGNlcHRpb24uCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJLy8gU2luY2Ugd2UncmUgc2h1dHRpbmcgZG93biwgaWdub3JlIHRoZSBleGNlcHRpb24uCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJLy8gSGF2ZSB0byB1c2UgdGhpcyBjb252b2x1dGVkIHRlY2huaXF1ZSBmb3IgdGhlIHNodXRkb3duIHByb2JsZW0uCi0JCS8vIGkuZS4sIHdoZW4gZWNsaXBzZSBpcyBzaHV0IGRvd24sIGlmIHZhbGlkYXRpb24gcGx1Zy1pbiBoYXNuJ3QgYmVlbiBsb2FkZWQsCi0JCS8vIHRoZSBFdmVudE1hbmFnZXIgaXMgYWN0aXZhdGVkIGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIGl0Ci0JCS8vIHNlbmRzIG1hbnkgZXhjZXB0aW9ucyB0byB0aGUgLmxvZy4gQXQgZmlyc3QsIEkgd3JvdGUgYQotCQkvLyBzdGF0aWMgbWV0aG9kIG9uIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciwgd2hpY2ggcmV0dXJuZWQgdHJ1ZQotCQkvLyBpZiB0aGUgcmVnaXN0cnkgaGFkIGJlZW4gcmVhZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4gSG93ZXZlciwKLQkJLy8gdGhhdCBkaWRuJ3Qgc29sdmUgdGhlIGV4Y2VwdGlvbiBwcm9ibGVtLCBiZWNhdXNlIGVjbGlwc2UncwotCQkvLyBjbGFzcyBsb2FkZXIgZmFpbGVkIHRvIGxvYWQgdGhlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBjbGFzcy4KLQkJLy8KLQkJLy8gVGhlIGZpeCBpcyB0byBrZWVwIGFsbCBzaHV0ZG93biBtZWNoYW5pc21zIGluIHRoaXMgY2xhc3MuCi0JCS8vIFRyYWNrIGV2ZXJ5dGhpbmcgaW4gaGVyZS4KLQkJcmV0dXJuIF9pc0FjdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBvbmNlIHRoZSByZWdpc3RyeSBoYXMgYmVlbgotCSAqIHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYikgewotCQlfaXNBY3RpdmUgPSBiOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgd29ya2JlbmNoIGlzIHJ1bm5pbmcgaW4gVUkgb3IgSGVhZGxlc3MuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBwbHVnLWluIG5vIGxvbmdlciBkZXBlbmRzIG9uIGplbS4gSWYgeW91IG5lZWQgdGhpcyBmdW5jdGlvbiB1c2UgdGhlIGplbQotCSAqIGNvZGUgZGlyZWN0bHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGVhZGxlc3MoKSB7Ci0JCS8vcmV0dXJuIFVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSA9PSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQ7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ZpbHRlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRmlsdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGI0MzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRmlsdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdGhlIFZhbGlkYXRpb25PcGVyYXRpb24gaGllcmFyY2h5LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsdGVyVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgVk1ERGVsdGFWaXNpdG9yIF9kZWx0YVZpc2l0b3IgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFZNRFJlc291cmNlVmlzaXRvciBfcmVzb3VyY2VWaXNpdG9yID0gbnVsbDsKLQotCXByaXZhdGUgaW50ZXJmYWNlIFZNRFJlY29yZGVyIHsKLQkJcHVibGljIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBnZXRSZXN1bHQoKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTUREZWx0YVZpc2l0b3IgZXh0ZW5kcyBWTURSZWNvcmRlciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTURSZXNvdXJjZVZpc2l0b3IgZXh0ZW5kcyBWTURSZWNvcmRlciwgSVJlc291cmNlVmlzaXRvciB7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXJVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgU2V0IG9mIGVuYWJsZWQgVmFsaWRhdG9yTWV0YURhdGEsIGNyZWF0ZSBhIE1hcCB3aXRoIGVhY2ggVmFsaWRhdG9yTWV0YURhdGEgYXMgYSBrZXkKLQkgKiB3aXRoIGFuIGFzc29jaWF0ZWQgbnVsbCB2YWx1ZS4KLQkgKi8KLQlzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IHdyYXBJbk1hcChTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCU1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PigpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzID09IG51bGwpIHx8IChlbmFibGVkVmFsaWRhdG9ycy5zaXplKCkgPT0gMCkpcmV0dXJuIHJlc3VsdDsKLQotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGVuYWJsZWRWYWxpZGF0b3JzKXJlc3VsdC5wdXQodm1kLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBjaGVja0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbClyZXR1cm47Ci0JCWVsc2UgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIE1hcCBvZiBWTUQgPD0+U2V0KElGaWxlRGVsdGEpLCBlaXRoZXIgcmV0dXJuIHRoZSBleGlzdGluZyBTZXQgb3IgY3JlYXRlIGEgU2V0IGFuZAotCSAqIHJldHVybiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQ8SUZpbGVEZWx0YT4gZ2V0UmVzb3VyY2VEZWx0YXMoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGVuYWJsZWRWYWxpZGF0b3JzLCAKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTZXQ8SUZpbGVEZWx0YT4gZmlsZURlbHRhcyA9IGVuYWJsZWRWYWxpZGF0b3JzLmdldCh2bWQpOwotCQlpZiAoZmlsZURlbHRhcyA9PSBudWxsKSB7Ci0JCQlmaWxlRGVsdGFzID0gbmV3IEhhc2hTZXQ8SUZpbGVEZWx0YT4oKTsKLQkJCWVuYWJsZWRWYWxpZGF0b3JzLnB1dCh2bWQsIGZpbGVEZWx0YXMpOwotCQl9Ci0JCXJldHVybiBmaWxlRGVsdGFzOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBJRmlsZURlbHRhIHR5cGUsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBJUmVzb3VyY2VEZWx0YSB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRSZXNvdXJjZURlbHRhVHlwZShpbnQgaWZpbGVEZWx0YVR5cGUpIHsKLQkJc3dpdGNoIChpZmlsZURlbHRhVHlwZSkgewotCQkJY2FzZSAoSUZpbGVEZWx0YS5BRERFRCkgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkRFTEVURUQpIDogewotCQkJCXJldHVybiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkNIQU5HRUQpIDoKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgSVJlc291cmNlRGVsdGEgdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIElGaWxlRGVsdGEgdHlwZS4KLQkgKi8KLQlzdGF0aWMgaW50IGdldEZpbGVEZWx0YVR5cGUoaW50IGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQlzd2l0Y2ggKGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5BRERFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2VzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCXJldHVybiBJRmlsZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDogLy8gaW5jb21pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuQURERUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDogLy8gb3V0Z29pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJZGVmYXVsdCA6IHsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5DSEFOR0VEOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwgKGFzIHN0b3JlZCBpbgotCSAqIGdldFByb2plY3QoKSksIGFuZCBlbmFibGVkIGJ5IHRoZSB1c2VyIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBhZGRGaWxlRGVsdGEoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGVuYWJsZWRWYWxpZGF0b3JzLCAKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCwgV29ya2JlbmNoRmlsZURlbHRhIGZpbGVEZWx0YSkgewotCQlTZXQ8SUZpbGVEZWx0YT4gZmlsZURlbHRhcyA9IGdldFJlc291cmNlRGVsdGFzKGVuYWJsZWRWYWxpZGF0b3JzLCB2bWQpOwotCQlmaWxlRGVsdGFzLmFkZChmaWxlRGVsdGEpOwotCQllbmFibGVkVmFsaWRhdG9ycy5wdXQodm1kLCBmaWxlRGVsdGFzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLgotCSAqIAotCSAqIElmIGZpbHRlckluIGlzIHRydWUsIGRvIG5vdCBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yLiBJZgotCSAqIGZpbHRlckluIGlzIGZhbHNlLCBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yIChyZWNvbW1lbmRlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gCi0JCWdldEZpbGVEZWx0YXMoU2V0IGVuYWJsZWRWYWxpZGF0b3JzLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGZpbHRlckluKSB7Ci0JCS8vIGJ5IGRlZmF1bHQgYXNzdW1lIHRoYXQgdGhlIHJlc291cmNlcyBoYXZlIGNoYW5nZWQsIGkuZS4gbm90IGFkZGVkIG9yIGRlbGV0ZWQKLQkJcmV0dXJuIGdldEZpbGVEZWx0YXMoZW5hYmxlZFZhbGlkYXRvcnMsIGNoYW5nZWRSZXNvdXJjZXMsIElGaWxlRGVsdGEuQ0hBTkdFRCwgZmlsdGVySW4pOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLCB3aXRoIGVhY2ggZGVsdGEgb2YgdHlwZSBkZWx0YVR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gCi0JCWdldEZpbGVEZWx0YXMoU2V0IGVuYWJsZWRWYWxpZGF0b3JzLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBpbnQgaWZpbGVEZWx0YVR5cGUpIHsKLQkJLy8gYnkgZGVmYXVsdCBjaGVjayBpZiB0aGUgT2JqZWN0cyBhcmUgZmlsdGVyZWQgaW4gYnkgdGhlIHZhbGlkYXRvcgotCQlyZXR1cm4gZ2V0RmlsZURlbHRhcyhlbmFibGVkVmFsaWRhdG9ycywgY2hhbmdlZFJlc291cmNlcywgaWZpbGVEZWx0YVR5cGUsIGZhbHNlKTsgCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTWFwIHdyYXBwZXIsIHdpdGggZWFjaCBWTUQgZnJvbSBlbmFibGVkVmFsaWRhdG9ycyBhcyB0aGUga2V5LCBhbmQgdGhlIHZhbHVlIGEgU2V0IG9mCi0JICogSUZpbGVEZWx0YSB3cmFwcGVyIGFyb3VuZCB0aGUgY2hhbmdlZCBPYmplY3RbXS4KLQkgKiA8cD4KLQkgKiBJZiAiZm9yY2UiIGlzIHRydWUsIHRoZW4gZG9uJ3QgY2hlY2sgaWYgdGhlIG9iamVjdCBpcyBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yIG9yIG5vdC4KLQkgKiBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gY2FuIHVzZSB2YWxpZGF0b3JzIHRoYXQgZG9uJ3QgZmlsdGVyIGluIHRoZXNlIHBhcnRpY3VsYXIgcmVzb3VyY2VzLAotCSAqIGJ1dCBjYW4gdXNlIGEgZGVmYXVsdEV4dGVuc2lvbidzIHZhbGlkYXRvcnMgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBnZXRGaWxlRGVsdGFzKFNldCBlbmFibGVkVmFsaWRhdG9ycywgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgaW50IGlmaWxlRGVsdGFUeXBlLCBib29sZWFuIGZvcmNlKSB7Ci0JCU1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PigpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzID09IG51bGwpIHx8IChlbmFibGVkVmFsaWRhdG9ycy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVuYWJsZWRWYWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gY2Fubm90TG9hZCA9IGZhbHNlOwotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJU2V0PElGaWxlRGVsdGE+IGRlbHRhcyA9IG5ldyBIYXNoU2V0PElGaWxlRGVsdGE+KCk7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNoYW5nZWRSZXNvdXJjZXNbaV07Ci0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSB3ZmQgPSBudWxsOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgb2JqOwotCQkJCQkJaWYgKGZvcmNlIHx8ICFmaWx0ZXJPdXQobW9uaXRvciwgdm1kLCByZXMsIGdldFJlc291cmNlRGVsdGFUeXBlKGlmaWxlRGVsdGFUeXBlKSkpIHsKLQkJCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHJlcy5nZXRQcm9qZWN0KCkpOwotCi0JCQkJCQkJd2ZkID0gZ2V0RmlsZURlbHRhKGhlbHBlciwgdm1kLCByZXMsIGdldFJlc291cmNlRGVsdGFUeXBlKGlmaWxlRGVsdGFUeXBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3ZmQgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKG9iaik7Ci0JCQkJCX0KLQotCQkJCQlpZiAod2ZkICE9IG51bGwpIHsKLQkJCQkJCWRlbHRhcy5hZGQod2ZkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXN1bHQucHV0KHZtZCwgZGVsdGFzKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWNhbm5vdExvYWQgPSB0cnVlOwotCi0JCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChjYW5ub3RMb2FkKSB7Ci0JCQkvLyBTb21lIG9mIHRoZSB2YWxpZGF0b3JzIHNob3VsZCBub3QgYmUgaW4gdGhlIHJlc3VsdCBzZXQgYmVjYXVzZSBlaXRoZXIgdGhlaXIKLQkJCS8vIHZhbGlkYXRvciBjbGFzcyBvciBoZWxwZXIgY2xhc3MgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZC4KLQkJCU9iamVjdFtdIHZtZHMgPSBlbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIHZtZHNbaV07Ci0JCQkJaWYgKHZtZC5jYW5ub3RMb2FkKCkpIHsKLQkJCQkJcmVzdWx0LnJlbW92ZSh2bWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrYmVuY2hGaWxlRGVsdGEgZ2V0RmlsZURlbHRhKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBpcmVzb3VyY2VEZWx0YVR5cGUpIHsKLQkJLy8gc3RyaXAgb2ZmIHRoZSBlY2xpcHNlLXNwZWNpZmljIGluZm9ybWF0aW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGhlbHBlci5nZXRQb3J0YWJsZU5hbWUocmVzb3VyY2UpOwotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJLy8gVGhlIHJlc291cmNlIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KLQkJCS8vIENhbid0IHNlZSBob3cgdGhpcyB3b3VsZCBoYXBwZW4sIGJ1dCBjaGVjayBmb3IgaXQgYW55d2F5LgotCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05VTExfTkFNRSksIAotCQkJCW5ldyBPYmplY3RbXXtyZXNvdXJjZS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgcmVzdWx0KTsKLQotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCkgewotCQkJCS8vIFNpbmNlIG51bGwgZmlsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQsIGRlZmF1bHQgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotCQkJCS8vIHJlc291cmNlLgotCQkJCWZpbGVOYW1lID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCAKLQkJCQkJInBvcnRhYmxlTmFtZSBpcyBudWxsIGFuZCBwYXRoIGlzIG51bGwgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWludCBpZmlsZURlbHRhVHlwZSA9IGdldEZpbGVEZWx0YVR5cGUoaXJlc291cmNlRGVsdGFUeXBlKTsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hGaWxlRGVsdGEoZmlsZU5hbWUsIGlmaWxlRGVsdGFUeXBlLCByZXNvdXJjZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGQgdGhlIElSZXNvdXJjZSB0byB0aGUgdm1kJ3MgbGlzdCBvZiByZXNvdXJjZXMgdG8gdmFsaWRhdGUuIFJldHVybiB0cnVlIGlmIHRoZSBhZGQgd2FzCi0JICogc3VjY2Vzc2Z1bCBvciBmYWxzZSBpZiB0aGUgYWRkIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGRUb0ZpbGVMaXN0KE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBlbmFibGVkVmFsaWRhdG9ycywgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlc291cmNlRGVsdGEsIGJvb2xlYW4gaXNGdWxsQnVpbGQpIHsKLQkJaWYgKCh2bWQgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaGVscGVyLnJlZ2lzdGVyUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5hZGRJbnRlcm5hbEVycm9yVGFzayhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZtZCwgZXhjKTsKLQotCQkJLy8gRG9uJ3QgcmV0dXJuIC4uLiBldmVuIHRob3VnaCB0aGUgcmVnaXN0ZXIgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGF0J3Mgbm90IHRvIHNheQotCQkJLy8gdGhhdCB0aGUgdmFsaWRhdG9yIGNhbid0IHZhbGlkYXRlLgotCQl9Ci0KLQkJaWYgKGlzRnVsbEJ1aWxkKSB7Ci0JCQkvLyBUbyBpbmRpY2F0ZSBhIGZ1bGwgYnVpbGQgdG8gdGhlIHZhbGlkYXRvciwgZG9uJ3QgYnVpbGQgdXAgYSBsaXN0IG9mIGZpbGVzOwotCQkJLy8gcGFzcyBpbiBudWxsIGluc3RlYWQuIEdpdmVuIHRoYXQgdGhlIGxpc3Qgb2YgZmlsZXMgc2hvdWxkIG5vdCBiZSB1c2VkLAotCQkJLy8gZG9uJ3QgY2FsY3VsYXRlIGl0LgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBnZXRGaWxlRGVsdGEoaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhKTsKLQkJaWYgKG5ld0ZpbGVEZWx0YSAhPSBudWxsKSB7Ci0JCQkvLyBpZiBkZWx0YSBpcyBudWxsLCBnZXRGaWxlRGVsdGEgd2lsbCBoYXZlIGxvZ2dlZCB0aGUgcHJvYmxlbSBhbHJlYWR5Ci0JCQlhZGRGaWxlRGVsdGEoZW5hYmxlZFZhbGlkYXRvcnMsIHZtZCwgbmV3RmlsZURlbHRhKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0JCXJldHVybiAhKHZtZC5pc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgcmVzb3VyY2VEZWx0YSkpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIHZvaWQgZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGVuYWJsZWRWYWxpZGF0b3JzLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhLCBib29sZWFuIGlzRnVsbEJ1aWxkKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpcmV0dXJuOwotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmFibGVkVmFsaWRhdG9ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlib29sZWFuIGNhbm5vdExvYWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY2hlY2tDYW5jZWxlZChtb25pdG9yKTsKLQotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghZmlsdGVyT3V0KG1vbml0b3IsIHZtZCwgcmVzb3VyY2UsIHJlc291cmNlRGVsdGEpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gTm90aWZ5IHRoZSBoZWxwZXIgdGhhdCBhIHJlc291cmNlIGlzIGFib3V0IHRvIGJlIGZpbHRlcmVkIGluCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQkJYWRkVG9GaWxlTGlzdChlbmFibGVkVmFsaWRhdG9ycywgaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhLCBpc0Z1bGxCdWlsZCk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNhbm5vdExvYWQgPSB0cnVlOwotCi0JCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNhbm5vdExvYWQpIHsKLQkJCS8vIFNvbWUgb2YgdGhlIHZhbGlkYXRvcnMgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNldCBiZWNhdXNlIHRoZSB2YWxpZGF0b3IKLQkJCS8vIG9yIGhlbHBlciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotCQkJT2JqZWN0W10gdm1kcyA9IGVuYWJsZWRWYWxpZGF0b3JzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgdm1kc1tpXTsKLQkJCQlpZiAodm1kLmNhbm5vdExvYWQoKSkgewotCQkJCQllbmFibGVkVmFsaWRhdG9ycy5yZW1vdmUodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIGEgZnVsbCB2ZXJpZmljYXRpb24gb3IgYSBkZWx0YSB2ZXJpZmljYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGJvdGggd2lsbCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gcHJvY2VzcyB0aGUgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byBmaWx0ZXIgdGhlCi0JICogcmVzb3VyY2UgKGkuZS4sIHRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHJlc291cmNlIGZhaWxzIHRoZSBmaWx0ZXIgdGVzdCkuCi0JICogPGNvZGU+cHJvY2VzczwvY29kZT4gYWxzbyBzZW5kcyBvdXRwdXQgdG8gdGhlIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+LCBhbmQgY2FsbHMKLQkgKiB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgYW4gaW5jcmVtZW50YWwsIG5vdCBhIGZ1bGwsIHZhbGlkYXRpb24uIFRoZSBmdWxsIHZhbGlkYXRpb24KLQkgKiBmYWtlcyBhbiBJUmVzb3VyY2VEZWx0YSwgYW5kIHRoZSBpbmNyZW1lbnRhbCBuZWVkcyB0byBjaGVjayB0aGF0IHRoZSBkZWx0YSBpcyBvbmUgb2YgdGhlCi0JICogZGVsdGFzIHdoaWNoIGlzIGZpbHRlcmVkIGluIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKiAKLQkgKiBAc2VlIGZpbHRlck91dChJUmVzb3VyY2VEZWx0YSkKLQkgKiAKLQkgKiBUbyBwcm9jZXNzIGEgcmVzb3VyY2UsIHRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzOiAxLiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgcmVnaXN0ZXJlZCBmb3IKLQkgKiB0aGlzIHZhbGlkYXRvciAoaS5lLiwgdGhlIHZhbGlkYXRvciBoYXMgZWl0aGVyIHNwZWNpZmllZCBpdCBpbiBhIGZpbHRlciwgb3IgaGFzIG5vdCBmaWx0ZXJlZAotCSAqIGl0IG91dCBleHBsaWNpdGx5KSAyLiBjYWxsIDxjb2RlPmlzVmFsaWRhdGlvblNvdXJjZTwvY29kZT4gb24gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHdpdGgKLQkgKiB0aGUgY3VycmVudCByZXNvdXJjZS4gVGhpcyBtZXRob2QgcGVyZm9ybXMgZnVydGhlciBmaWx0ZXJpbmcgYnkgdGhlIFZhbGlkYXRvciBpdHNlbGYsIGluCi0JICogYWRkaXRpb24gdG8gdGhlIHN0YXRpYyBmaWx0ZXJpbmcgZG9uZSBieSB0aGUgZnJhbWV3b3JrLCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4KLQkgKiBwbHVnaW4ueG1sLiAzLiBJZiB0aGUgcmVzb3VyY2UgcGFzc2VzIGJvdGggZmlsdGVycywgY2FsbCA8Y29kZT52YWxpZGF0ZTwvY29kZT4gb24gdGhlCi0JICogdmFsaWRhdG9yLCB3aXRoIHRoZSByZXNvdXJjZS4gNC4gV2hlbiBjb21wbGV0ZSAoZWl0aGVyIGJ5IGZhaWxpbmcgdG8gcGFzcyBhIGZpbHRlciwgb3IgYnkgdGhlCi0JICogY29tcGxldGlvbiBvZiB0aGUgPGNvZGU+dmFsaWRhdGU8L2NvZGU+KSwgaW5jcmVtZW50IHRoZSBJUHJvZ3Jlc3NNb25pdG9yJ3Mgc3RhdHVzIGJ5IG9uZQotCSAqIChpLmUuLCBvbmUgcmVzb3VyY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLikKLQkgKi8KLQlzdGF0aWMgdm9pZCBmaWx0ZXJPdXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZW5hYmxlZFZhbGlkYXRvcnMsIAotCQkJSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkvLyBmaWx0ZXIgaW4gb25seSByZXNvdXJjZXMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkLCBkZWxldGVkLCBvciBpdHMgY29udGVudCBjaGFuZ2VkLgotCQkvLyBtb3ZlcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYW4gYWRkICYgZGVsZXRlIGNvbWJpbmF0aW9uCi0JCWlmIChmaWx0ZXJPdXQoZGVsdGEpKXJldHVybjsKLQkJCi0JCWZpbHRlck91dChtb25pdG9yLCBlbmFibGVkVmFsaWRhdG9ycywgcmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSwgZmFsc2UpOyAvLyBmYWxzZSA9Ci0JCS8vIGluY3JlbWVudGFsCi0JCS8vIGJ1aWxkCi0JfQotCi0JLyoqCi0JICogRmlsdGVyIG91dCByZXNvdXJjZSBkZWx0YXMgd2hpY2ggZG9uJ3QgY29ycmVzcG9uZCB0byBjaGFuZ2VzIHRoYXQgdmFsaWRhdG9ycyBjYW4gdmFsaWRhdGUuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBmaWx0ZXIgaW4gZGVsdGFzIG9ubHkgaWYgdGhlIGRlbHRhIGlzIGFuIGFkZCwgYSBkZWxldGUsIG9yIGlmIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUgaGFzIGNoYW5nZWQuCi0JICogCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGRlbHRhIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQsIGFuZCBmYWxzZSBpZiB3ZSBzaG91bGQgdmFsaWRhdGUgaXQuCi0JICogCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YQotCSAqLwotCXN0YXRpYyBib29sZWFuIGZpbHRlck91dChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoZGVsdGEgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJLy8gSWYgdGhlIGRlbHRhIGlzIGFuIElQcm9qZWN0LCBhbmQgdGhlIElQcm9qZWN0IGlzIGdldHRpbmcgZGVsZXRlZCBvciBjbG9zZWQsIGRvbid0Ci0JCQkJLy8gdmFsaWRhdGUgaXQgb3IgaXRzIGNoaWxkcmVuLgotCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2VzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCS8vIFdlIHdhbnQgdG8gYWRkIHRoZSBlbnRlcnByaXNlIGJlYW4gb25seSBpZiBpdHMgc291cmNlIGZpbGUncwotCQkJCS8vIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4gKGZvciBleGFtcGxlLCBpZiBhIGZvbGRlciBoYXMgYmVlbgotCQkJCS8vIGFkZGVkIHRvIHRoZSBwcm9qZWN0LCB0aGUgSUZpbGUgd2lsbCBiZSBjaGFuZ2VkIGJlY2F1c2UKLQkJCQkvLyBpdHMgcG9zaXRpb24gaGFzIGJlZW4gY2hhbmdlZCwgYnV0IHRoZSBlbnRlcnByaXNlIGJlYW4KLQkJCQkvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcmVkZXBsb3llZC4gU2VlIElSZXNvdXJjZURlbHRhLmdldEZsYWdzKCkKLQkJCQkvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4pCi0JCQkJLy8KLQkJCQkvLyBPciwgaWYgZWpiLWphci54bWwgaGFzIGNoYW5nZWQsIHRoZSBFSkJKYXIgaXMgZGVzdHJveWVkICYgY3JlYXRlZAotCQkJCS8vIGZyb20gc2NyYXRjaCwgc28gdGhlIGxpc3Qgb2YgRW50ZXJwcmlzZUJlYW4gaXMgbmV3LiBQdXJnZSB0aGUgb2xkCi0JCQkJLy8gRUpCSmFyIGZyb20gdGhlIEVKQkNhY2hlIChzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYWdhaW4pLAotCQkJCS8vIGFuZCBsb2FkIHRoZSBuZXcgRUpCSmFyIGludG8gdGhlIGNhY2hlLgotCQkJCWlmICgoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAmJiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAqIHZhbGlkYXRvcnMuIFRoYXQgaXMsIHRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIGNoYW5nZXMgd2hpY2ggY2FuIG9jY3VyIHRvIGFuIElQcm9qZWN0IHdoaWNoCi0JICogc2hvdWxkIG5vdCB0cmlnZ2VyIGEgcmV2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IG9yIGl0cyBjaGlsZHJlbi4gKGUuZy4gcHJvamVjdCBpcyBkZWxldGVkIG9yCi0JICogY2xvc2VkLikgRm9yIHRob3NlIGNhc2VzLCBvciBpZiB0aGUgSVJlc291cmNlRGVsdGEgaXMgaW52YWxpZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UKLQkgKiAoZG8gbm90IHZhbGlkYXRlIHRoZSBJUHJvamVjdCBvciBpdHMgY2hpbGRyZW4pLiBPdGhlcndpc2UsIHJldHVybiB0cnVlICh2YWxpZGF0ZSB0aGUgcmVzb3VyY2UgJgotCSAqIGl0cyBjaGlsZHJlbikuIElmIGFuIElQcm9qZWN0IGl0c2VsZiBoYXMgbm90IGNoYW5nZWQsIGJ1dCBvbmUgb2YgaXRzIGNoaWxkcmVuIGhhcwotCSAqIChkZWx0YS5nZXRLaW5kKCkgb2YgTk9fQ0hBTkdFKSwgdGhlbiByZXR1cm4gdHJ1ZSBzbyB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgdmFsaWRhdGVkLgotCSAqLwotCXN0YXRpYyBib29sZWFuIHNob3VsZFByb2Nlc3MoSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoKHJlc291cmNlICE9IG51bGwpICYmICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKGRlbHRhID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogLy8gcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSB3b3JrYmVuY2g7IG1heSBiZSBwYXJ0Ci0JCQkvLyBvZiBhIG1vdmUKLQkJCXsKLQkJCQlpZiAoMCAhPSAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pKSB7Ci0JCQkJCS8vIElmIGl0J3MgYmVpbmcgbW92ZWQsIGRvbid0IHJldmFsaWRhdGUgaXRzIGNoaWxkcmVuLiBJZiBpdCdzIGJlaW5nIGFkZGVkLCBmYWxsCi0JCQkJCS8vIHRocm91Z2ggdG8gdGhlICJyZXR1cm4gdHJ1ZTsiIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoOyBtYXkgYmUKLQkJCS8vIHBhcnQgb2YgYSBtb3ZlCi0JCQl7Ci0JCQkJLy8gV2hldGhlciBpdCdzIGJlaW5nIGRlbGV0ZWQgb3IgbW92ZWQsIGRvbid0IHJldmFsaWRhdGUgaXRzIGNoaWxkcmVuLgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoOyBtYXkgYmUgcGFydAotCQkJLy8gb2YgYSBtb3ZlCi0JCQl7Ci0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgewotCQkJCQkvLyBDaGFuZ2UgaXMgcmVsYXRlZCB0byB0aGUgT1BFTiBiaXQuIFdoZXRoZXIgdGhlIHByb2plY3Qgd2FzIGNsb3NlZCBhbmQgaXMgbm93Ci0JCQkJCS8vIG9wZW4sCi0JCQkJCS8vIG9yIHRoZSBwcm9qZWN0IHdhcyBvcGVuIGFuZCBpcyBub3cgY2xvc2VkLCBkb24ndCBuZWVkIHRvIHJldmFsaWRhdGUgdGhlCi0JCQkJCS8vIGNoaWxkcmVuLgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSAhPSAwKSB7Ci0JCQkJCS8vIHByb2plY3Qgd2FzIG1vdmVkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZNRFJlc291cmNlVmlzaXRvciBnZXRSZXNvdXJjZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWlmIChfcmVzb3VyY2VWaXNpdG9yID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZVZpc2l0b3IgPSBuZXcgVk1EUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IF92bWREZWx0YXMgPSBudWxsOwotCQkJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCQkJCXB1YmxpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZ2V0UmVzdWx0KCkgewotCQkJCQlyZXR1cm4gX3ZtZERlbHRhczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMpIHsKLQkJCQkJX3ZtZERlbHRhcyA9IHdyYXBJbk1hcCh2YWxpZGF0b3JzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXJldHVybiBfcHJvZ3Jlc3NNb25pdG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJCQkJX3Byb2dyZXNzTW9uaXRvciA9IG07Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlGaWx0ZXJVdGlsLmNoZWNrQ2FuY2VsZWQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gZmlsdGVyIG91dCBhbnl0aGluZywgYmVjYXVzZSBhIGZ1bGwgdmFsaWRhdGlvbgotCQkJCQkvLyBpcyBhYm91dCB0byBiZSBwZXJmb3JtZWQuCi0JCQkJCWZpbHRlck91dChnZXRQcm9ncmVzc01vbml0b3IoKSwgX3ZtZERlbHRhcywgcmVzLCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VELCB0cnVlKTsKLQotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4gYXMgd2VsbAotCQkJCX0KLQkJCX07Ci0JCX0KLQkJX3Jlc291cmNlVmlzaXRvci5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCV9yZXNvdXJjZVZpc2l0b3Iuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCi0JCXJldHVybiBfcmVzb3VyY2VWaXNpdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZNRERlbHRhVmlzaXRvciBnZXREZWx0YVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWlmIChfZGVsdGFWaXNpdG9yID09IG51bGwpIHsKLQkJCV9kZWx0YVZpc2l0b3IgPSBuZXcgVk1ERGVsdGFWaXNpdG9yKCkgewotCQkJCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IF92bWREZWx0YXMgPSBudWxsOwotCQkJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCQkJCXB1YmxpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZ2V0UmVzdWx0KCkgewotCQkJCQlyZXR1cm4gX3ZtZERlbHRhczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMpIHsKLQkJCQkJX3ZtZERlbHRhcyA9IHdyYXBJbk1hcCh2YWxpZGF0b3JzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXJldHVybiBfcHJvZ3Jlc3NNb25pdG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJCQkJX3Byb2dyZXNzTW9uaXRvciA9IG07Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgc3ViZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJY2hlY2tDYW5jZWxlZChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gc3ViZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlZNRERlbHRhVmlzaXRvcjogc3ViZGVsdGEgb2YgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiBoYXMgcmVzb3VyY2UgZGVsdGEga2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc3ViZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiBEb2VzIHRoZSByZXNvdXJjZSBleGlzdD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQocmVzb3VyY2UuZXhpc3RzKCkpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiIElzIGl0IGEgcGhhbnRvbT8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQocmVzb3VyY2UuaXNQaGFudG9tKCkpOwotCQkJCQkJVHJhY2luZy5sb2coYnVmZmVyKTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIHRoZSBkZWx0YSBpcyBhbiBJUHJvamVjdCwgYW5kIHRoZSBJUHJvamVjdCBpcyBnZXR0aW5nIGRlbGV0ZWQgb3IgY2xvc2VkLAotCQkJCQkvLyBkb24ndCB2YWxpZGF0ZSBpdCBvciBpdHMgY2hpbGRyZW4uCi0JCQkJCWlmIChzaG91bGRQcm9jZXNzKHJlc291cmNlLCBzdWJkZWx0YSkpIHsKLQkJCQkJCWZpbHRlck91dChnZXRQcm9ncmVzc01vbml0b3IoKSwgX3ZtZERlbHRhcywgcmVzb3VyY2UsIHN1YmRlbHRhKTsKLQkJCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgZGVsdGEncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBkbyBub3QgdmlzaXQgdGhlIGRlbHRhJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCV9kZWx0YVZpc2l0b3Iuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQlfZGVsdGFWaXNpdG9yLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQotCQlyZXR1cm4gX2RlbHRhVmlzaXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBsb2FkRGVsdGFzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgCi0JCQlmaW5hbCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzLAlJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWTUREZWx0YVZpc2l0b3IgdmlzaXRvciA9IGdldERlbHRhVmlzaXRvcihtb25pdG9yLCBlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCWRlbHRhLmFjY2VwdCh2aXNpdG9yLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCXJldHVybiB2aXNpdG9yLmdldFJlc3VsdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGxvYWREZWx0YXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCAKLQkJCWZpbmFsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZFZhbGlkYXRvcnMsCUlQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVk1EUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IgPSBnZXRSZXNvdXJjZVZpc2l0b3IobW9uaXRvciwgZW5hYmxlZFZhbGlkYXRvcnMpOwotCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUgcGhhbnRvbQotCQkvLyByZXNvdXJjZXMKLQkJcmV0dXJuIHZpc2l0b3IuZ2V0UmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9HbG9iYWxDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0dsb2JhbENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwMWRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0dsb2JhbENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZ2xvYmFsIFByZWZlcmVuY2VzIGFzIHNldCBvbiB0aGUgVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsQ29uZmlndXJhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUID0gdHJ1ZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGX1NBVkVfQVVUT01BVElDQUxMWV9ERUZBVUxUID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2NhblByb2plY3RzT3ZlcnJpZGUgPSBnZXRDYW5Qcm9qZWN0c092ZXJyaWRlRGVmYXVsdCgpOwotCXByaXZhdGUgYm9vbGVhbiBfc2F2ZUF1dG9tYXRpY2FsbHkgPSBnZXRTYXZlQXV0b21hdGljYWxseURlZmF1bHQoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgaW4gYWxsIGNhc2VzIGV4Y2VwdCBmb3IgdGhlIFByZWZlcmVuY2UgcGFnZSdzIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgR2xvYmFsQ29uZmlndXJhdGlvbihJV29ya3NwYWNlUm9vdCByb290KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHJvb3QsIGNvbnZlcnRUb0FycmF5KFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRBbGxWYWxpZGF0b3JzKCkpKTsKLQotCQkvLyBDYW4ndCBwdXQgdGhlIGNhbGwgdG8gbG9hZCgpIGFuZCBwYXNzaXZhdGUoKSBpbiB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IgZHVlCi0JCS8vIHRvIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbi4KLQkJLy8gICAgMS4gRmlyc3QgdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCwgYW5kIHRoYXQgbG9hZHMgdGhlIHN0b3JlZCB2YWx1ZXMuCi0JCS8vICAgIDIuIFRoZW4gdGhpcyBjbGFzcydzIDxpbml0PiBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdGhhdCBpbml0aWFsaXplcyB0aGUgIm92ZXJyaWRlIiBmaWVsZAotCQkvLyAJICB0byB0aGUgZGVmYXVsdCwgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdG9yZWQgdmFsdWUuCi0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgUHJlZmVyZW5jZSBwYWdlLCBzbyB0aGF0IHRoZSBwYWdlIGNhbiBzdG9yZSB2YWx1ZXMKLQkgKiB3aXRob3V0IHBlcnNpc3RpbmcgdGhlbSAoaS5lLiwgaWYgdGhlIHVzZXIgcHJlc3NlcyBDYW5jZWwgdGhlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuKQotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uKEdsb2JhbENvbmZpZ3VyYXRpb24gb3JpZ2luYWwpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJb3JpZ2luYWwuY29weVRvKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblByb2plY3RzT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBfY2FuUHJvamVjdHNPdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYW5Qcm9qZWN0c092ZXJyaWRlKGJvb2xlYW4gY2FuKSB7Ci0JCV9jYW5Qcm9qZWN0c092ZXJyaWRlID0gY2FuOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRTYXZlQXV0b21hdGljYWxseSgpIHsKLQkJcmV0dXJuIF9zYXZlQXV0b21hdGljYWxseTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2F2ZUF1dG9tYXRpY2FsbHkoYm9vbGVhbiBzYXZlKSB7Ci0JCV9zYXZlQXV0b21hdGljYWxseSA9IHNhdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHQoKSAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihnZXREaXNhYmxlVmFsaWRhdGlvbkRlZmF1bHQoKSk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzRGVmYXVsdCgpKTsKLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShnZXRDYW5Qcm9qZWN0c092ZXJyaWRlRGVmYXVsdCgpKTsKLQkJc2V0U2F2ZUF1dG9tYXRpY2FsbHkoZ2V0U2F2ZUF1dG9tYXRpY2FsbHlEZWZhdWx0KCkpOwotCQlzZXREZWZhdWx0RGVsZWdhdGVzKGdldFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZXhpc3RzIG9ubHkgZm9yIG1pZ3JhdGlvbiBwdXJwb3Nlcy4gVGhlIHJvb3QgbWFya2VyIG11c3QgYmUgZGVsZXRlZCBhZnRlcgotCSAqIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcigpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBnZXRSb290KCk7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IHJvb3QuZmluZE1hcmtlcnMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGRVJFTkNFX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9PTkUpOwotCi0JCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMSkgewotCQkJCXJldHVybiBtYXJrZXJzOwotCQkJfQotCQkJLy8gam9iIGlzIGRvbmUuIE5vdGhpbmcgdG8gbWlncmF0ZS4KLQkJCXJldHVybiBudWxsOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gQ2FuJ3QgZmluZCB0aGUgSU1hcmtlcj8gQXNzdW1lIGl0J3MgZGVsZXRlZC4KLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIDUuMCBwcmVmZXJlbmNlcyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyLCBhbmQgdGhlIGN1cnJlbnQucHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbgotCQkvLyBQZXJzaXN0ZW50UHJvcGVydGllcyBvbiB0aGUgSVJlc291cmNlLgotCQkvLyBBIDUuMCByb290IGNhbiBoYXZlIG5vIG1hcmtlciB2YWx1ZXMgaWYgdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcyBwYWdlLCBhbmQKLQkJLy8gdmFsaWRhdGlvbiB3ZXJlIG5ldmVyIHZpZXdlZCBvciBydW4uCi0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gZ2V0Um9vdCgpOwotCQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJLy8gVGhlcmUgd2VyZSBubyBnbG9iYWwgcHJlZmVyZW5jZXMgaW4gNC4wMywgc28gdGhlIG1pZ3JhdGlvbiBpcyB0byBjcmVhdGUgc29tZS4KLQkJCQlyZXNldFRvRGVmYXVsdCgpOyAvLyBhc3NpZ24gdGhlIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBuZXcgR2xvYmFsIFByZWZlcmVuY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlNYXJrZXIgcm9vdE1hcmtlciA9IG1hcmtlclswXTsgLy8gZ2V0TWFya2VyKCkgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlJ3MgYSBtYXJrZXIKLQkJCS8vIGluIHRoZSBhcnJheQotLy8JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gbnVsbDsKLS8vCQkJU3RyaW5nIGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX1ZBTElEQVRPUlMpOwotLy8JCQlpZiAoZW5hYmxlZFZhbGlkYXRvcnNTdHJpbmcgPT0gbnVsbCkgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotLy8JCQl9IGVsc2UgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nKTsKLS8vCQkJfQotLy8KLS8vCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCQkJU3RyaW5nIGVuYWJsZWRNYW51YWxWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQkJCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMpKTsKLQkJCVN0cmluZyBlbmFibGVkQnVpbGRWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMpOwotCQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShlbmFibGVkQnVpbGRWYWxpZGF0b3JzKSk7Ci0vLwkJCWlmIChlbmFibGVkTWFudWFsVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkgfHwgZW5hYmxlZEJ1aWxkVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkpIAotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotCQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShnZXRWYWx1ZShyb290TWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFLCBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUKSk7Ci0JCQlyb290LmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlUbyhHbG9iYWxDb25maWd1cmF0aW9uIGdwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvcHlUbyhncCk7Ci0KLQkJLy8gTmVlZCB0byBoYXZlIGEgZGlzdGluY3QgbWV0aG9kIGZvciB0aGlzIGNoaWxkIGNsYXNzIChpLmUuLCB0aGUgcGFyYW1ldGVyCi0JCS8vIGlzIG5vdCBhIFZhbGlkYXRpb25Db25maWd1cmF0aW9uKSBiZWNhdXNlIGlmIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY2FsbGVkIGFzIHBhcnQgb2YgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24ncyBjb25zdHJ1Y3RvciwgdGhlbiB0aGUgdmFsdWUgb2YKLQkJLy8gdGhpcyBmaWVsZCBpcyBvdmVyd3JpdHRlbi4gRmllbGRzIG9mIHRoaXMgY2xhc3MgYXJlIGluaXRpYWxpemVkIHRvIHRoZQotCQkvLyBkZWZhdWx0IGFmdGVyIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBwYXJlbnQgaXMgY3JlYXRlZC4KLQkJZ3Auc2V0Q2FuUHJvamVjdHNPdmVycmlkZShjYW5Qcm9qZWN0c092ZXJyaWRlKCkpOwotCQlncC5zZXRTYXZlQXV0b21hdGljYWxseShnZXRTYXZlQXV0b21hdGljYWxseSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2FuUHJvamVjdHNPdmVycmlkZURlZmF1bHQoKSB7Ci0JCXJldHVybiBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2F2ZUF1dG9tYXRpY2FsbHlEZWZhdWx0KCkgewotCQlyZXR1cm4gUFJFRl9TQVZFX0FVVE9NQVRJQ0FMTFlfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgc3RvcmVkQ29uZmlndXJhdGlvbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlci5kZXNlcmlhbGl6ZShzdG9yZWRDb25maWd1cmF0aW9uKTsKLQotCQlpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiAhPSBudWxsICYmIHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBJZiBpdCdzIG51bGwsIHRoZW4gc3VwZXIuZGVzZXJpYWxpemUgaGFzIGFscmVhZHkgY2FsbGVkIHJlc2V0VG9EZWZhdWx0IHRvIGluaXRpYWxpemUKLQkJCS8vIHRoaXMgaW5zdGFuY2UuCi0JCQlpbnQgY2FuT3ZlcnJpZGVJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFKTsKLQkJCWludCBkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRElTQUJMRV9BTExfVkFMSURBVElPTl9TRVRUSU5HKTsKLQkJCWludCBzYXZlQXV0b21hdGljYWxseUluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcpOwotCQkJaWYgKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgY2FuT3ZlcnJpZGUgPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhjYW5PdmVycmlkZUluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERS5sZW5ndGgoKSwgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCk7Ci0JCQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShCb29sZWFuLnZhbHVlT2YoY2FuT3ZlcnJpZGUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCWlmKHNhdmVBdXRvbWF0aWNhbGx5SW5kZXggIT0gLTEpCi0JCQl7Ci0JCQkJU3RyaW5nIHNhdmVBdXRvbWF0aWNhbGx5ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoc2F2ZUF1dG9tYXRpY2FsbHlJbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcubGVuZ3RoKCksIGNhbk92ZXJyaWRlSW5kZXgpOwotCQkJCXNldFNhdmVBdXRvbWF0aWNhbGx5KEJvb2xlYW4udmFsdWVPZihzYXZlQXV0b21hdGljYWxseSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNzZXJpYWxpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcpOwotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGdldFNhdmVBdXRvbWF0aWNhbGx5KCkpKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihjYW5Qcm9qZWN0c092ZXJyaWRlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci5zZXJpYWxpemUoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVByb2plY3RWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk5ODhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVByb2plY3RWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogVmFsaWRhdG9ySGVscGVyIGV4dGVuc2lvbnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIHsKLQkKLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldE91dHB1dENvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JcHVibGljIElDb250YWluZXJbXSBnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VJbnN0YW5jZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyOTJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBieSBleHRlbnNpb25zIHRvIGFkZCB2YWxpZCB2YWxpZGF0aW9uIHR5cGVzIHRvIHRoZSB2YWxpZGF0ZQotICogbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIElSZXNvdXJjZSB0eXBlIGZvciB0aGUgZXh0ZW5zaWJsZSBvYmplY3Qgc2VsZWN0aW9uLAotCSAqIHNob3VsZCBiZSBpbnN0YW5jZSBvZiBJRm9sZGVyLCBJRmlsZSwgb3IgSVByb2plY3QgaWYgdGhpcyBleHRlbnNpb24ga25vd3MKLQkgKiBob3cgdG8gaGFuZGxlIHRoZSBzZWxlY3Rpb24sIG90aGVyd2lzZSBpdCBzaG91bGQgcmV0dXJuIG51bGwKLQkgKi8gCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgY2xhc3NuYW1lIG9mIHRoZSB2YWxpZGF0aW9uIHR5cGUgdG8gcmVnaXN0ZXIgZm9yIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25UeXBlU3RyaW5nKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ludGVybmFsVmFsaWRhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDEwMTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEludGVybmFsVmFsaWRhdG9yTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BfR1JPVVAgPSAiVmFsaWRhdGlvbk9wZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQgLy8gd2hlbiB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbgotCi0JLy8gYWRkcyBhIG1lc3NhZ2UgdG8gdGhlIHRhc2sKLQkvLyBsaXN0OyBlLmcuIGNhbmNlbCwgb3IgaW50ZXJuYWwKLQkvLyBlcnJvciwgdGhpcyBncm91cCBuYW1lIGlzIHVzZWQKLQkvLyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZQotCS8vIG1lc3NhZ2VzIHRoYXQgdGhlIHZhbGlkYXRvcgotCS8vIGl0c2VsZiBwdXQsIGFuZCB0aGUgb25lcyB3aGljaAotCS8vIHRoZSB2YWxpZGF0b3Igb3ducywgYnV0IHRoZQotCS8vIG9wZXJhdGlvbiBwdXQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEludGVybmFsVmFsaWRhdG9yTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBTZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB3cmFwSW5TZXQoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWlmICgodm1kcyA9PSBudWxsKSB8fCAodm1kcy5sZW5ndGggPT0gMCkpcmV0dXJuIHJlc3VsdDsKLQotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpcmVzdWx0LmFkZCh2bWQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHRocm93cyBhIFRocm93YWJsZSwgbG9nIHRoZSBpbnRlcm5hbCBlcnJvciB0byB0aGUgdGFzayBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW50ZXJuYWxFcnJvclRhc2soSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBUaHJvd2FibGUgZXhjKSB7Ci0JCWFkZE9wZXJhdGlvblRhc2socHJvamVjdCwgdm1kLCBSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCkgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBpcyBjYW5jZWxsaW5nIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC9yZXNvdXJjZSwgQWRkIGFuIGluZm9ybWF0aW9uIHRhc2sKLQkgKiB0byB0aGUgdGFzayBsaXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IHZhbGlkYXRpb24gaGFzIG5vdCBiZWVuIHJ1biBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqIAotCSAqIElmIHRoZSBjdXJyZW50IHZhbGlkYXRvciB0aHJvd3MgYSBUaHJvd2FibGUsIGxvZyB0aGUgaW50ZXJuYWwgZXJyb3IgdG8gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25UYXNrKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJbWVzc2FnZS5zZXRJZChtZXNzYWdlSWQpOwotCQltZXNzYWdlLnNldFBhcmFtcyhwYXJtcyk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKE9QX0dST1VQKTsKLQotCQkvLyBBbHRob3VnaCB0aGUgbWVzc2FnZSBpcyBvd25lZCBieSB0aGUgdmFsaWRhdG9yLCB0aGUgc3RyaW5nIG9mIHRoZSBtZXNzYWdlIGhhcyB0byBiZQotCQkvLyBsb2FkZWQgYnkgdGhpcyBjbGFzcycgQ2xhc3NMb2FkZXIKLQkJV29ya2JlbmNoUmVwb3J0ZXIuYWRkTWVzc2FnZShwcm9qZWN0LCB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogSWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBwcmV2aW91cyB2YWxpZGF0aW9uIHdpdGggdGhpcyB2YWxpZGF0b3IsIG9yIGlmIHRoZXJlIHdhcyBhCi0JICogVGhyb3dhYmxlIGNhdWdodCBkdXJpbmcgdGhlIGxhc3QgZXhlY3V0aW9uIG9mIHRoaXMgdmFsaWRhdG9yLCBhbmQgdGhlIHZhbGlkYXRvciBpcyBpbiB0aGUKLQkgKiBwcm9jZXNzIG9mIHZhbGlkYXRpbmcgbm93LCByZW1vdmUgdGhlIGZvcm1lciBpbmZvcm1hdGlvbiB0YXNrIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZXJhdGlvblRhc2tzKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHByb2plY3QsIHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIE9QX0dST1VQKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzZXMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRvck5hbWVzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlTZXQ8U3RyaW5nPiB0ZW1wID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSkgewotCQkJCXRlbXAuYWRkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHZtZE5hbWVzKTsKLQkJcmV0dXJuIHZtZE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoQ29sbGVjdGlvbjxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgewotCQlTZXQ8U3RyaW5nPiB0ZW1wID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSkgewotCQkJCXRlbXAuYWRkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHZtZE5hbWVzKTsKLQkJcmV0dXJuIHZtZE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzRm9yRXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCi0JCQkvLyBHZXQgYWxsIG9mIHRoZSB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QgZm9yIHRoZSBnaXZlbiBmaWxlIGV4dGVuc2lvbgotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gcHJqcC5nZXRWYWxpZGF0b3JzKCk7Ci0KLQkJCS8vIENvbnN0cnVjdCBhIGZha2UgSUZpbGUgdHlwZSB0byByZXByZXNlbnQgYSBmaWxlIHdpdGggdGhpcyBleHRlbnNpb24uCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0JCQlidWZmZXIuYXBwZW5kKGZpbGVFeHRlbnNpb24pOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt2bWRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCQlpZiAodm1kLmlzQXBwbGljYWJsZVRvKGZpbGUpKSB7Ci0JCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQkJfQotCQkJfQotCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB2YWxpZGF0b3IgbmFtZXMgdGhhdCB2YWxpZGF0ZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRvck5hbWVzRm9yRXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IGdldFZhbGlkYXRvcnNGb3JFeHRlbnNpb24ocHJvamVjdCwgZmlsZUV4dGVuc2lvbik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3ZtZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJbmFtZXNbaV0gPSB2bWRzW2ldLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ3NzRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgUHJvamVjdCBQcmVmZXJlbmNlcyBhcyBzZXQgb24gdGhlIFByb2plY3QncyBWYWxpZGF0aW9uIFByb3BlcnRpZXMgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDb25maWd1cmF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gewotCQotCS8qKiBmYWxzZSAtIElmIHRoZSB1c2VyIGhhcyBuZXZlciBzZXQgYSBwcmVmZXJlbmNlIGJlZm9yZSwgdGhpcyBpcyB0aGUgb3ZlcnJpZGUgZGVmYXVsdCAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSSl9PVkVSUklERUdMT0JBTF9ERUZBVUxUID0gZmFsc2U7Ci0JCi0JLyoqIGRlZmF1bHRfdmFsdWUgLSB0aGUgY29uZmlndXJhdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERlZmF1bHRWYWx1ZSA9ICJkZWZhdWx0X3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgYm9vbGVhbiBfZG9lc1Byb2plY3RPdmVycmlkZSA9IGdldERvZXNQcm9qZWN0T3ZlcnJpZGVEZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGluIGFsbCBjYXNlcyBleGNlcHQgZm9yIHRoZSBQcm9wZXJ0aWVzIHBhZ2UncyB2YWx1ZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyBtZXRob2QgZXh0cmFjdHMganVzdCB0aGlzIHByb2plY3QncyB2YWxpZGF0b3JzIGZyb20gdGhlCi0JCS8vIGdsb2JhbCBsaXN0LgotCQlzdXBlcihwcm9qZWN0LCBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoY29udmVydFRvQXJyYXkoVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvcnMoKSksIHByb2plY3QpKTsKLQotCQkvLyBDYW4ndCBwdXQgdGhlIGNhbGwgdG8gbG9hZCgpIGFuZCBwYXNzaXZhdGUoKSBpbiB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IKLQkJLy8gZHVlCi0JCS8vIHRvIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbi4KLQkJLy8gICAgMS4gRmlyc3QgdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCwgYW5kIHRoYXQgbG9hZHMgdGhlIHN0b3JlZAotCQkvLyB2YWx1ZXMuCi0JCS8vICAgIDIuIFRoZW4gdGhpcyBjbGFzcydzIDxpbml0PiBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdGhhdCBpbml0aWFsaXplcyB0aGUgIm92ZXJyaWRlIiBmaWVsZAotCQkvLyB0byB0aGUgZGVmYXVsdCwKLQkJLy8gICAgICAgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdG9yZWQgdmFsdWUuCi0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgUHJvcGVydGllcyBwYWdlLCBzbyB0aGF0IHRoZSBwYWdlIGNhbiBzdG9yZSB2YWx1ZXMKLQkgKiB3aXRob3V0IHBlcnNpc3RpbmcgdGhlbSAoaS5lLiwgaWYgdGhlIHVzZXIgcHJlc3NlcyBDYW5jZWwgdGhlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuKQotCSAqLwotCXB1YmxpYyBQcm9qZWN0Q29uZmlndXJhdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvbiBvcmlnaW5hbCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQlvcmlnaW5hbC5jb3B5VG8odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB0byB1c2UsIHdoZXRoZXIgZ2xvYmFsIG9yIHByb2plY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXNlR2xvYmFsUHJlZmVyZW5jZSgpIHsKLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGdwID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICghZ3AuY2FuUHJvamVjdHNPdmVycmlkZSgpKSB7Ci0JCQkJLy8gSWYgcHJvamVjdCdzIGNhbid0IG92ZXJyaWRlIHRoZSBnbG9iYWwsIHVzZSB0aGUgZ2xvYmFsCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIElmIHRoZSBwcm9qZWN0IG92ZXJyaWRlcywgdGhlbiBkb24ndCB1c2UgdGhlIGdsb2JhbC4KLQkJCS8vIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IG92ZXJyaWRlLCB1c2UgdGhlIGdsb2JhbC4KLQkJCXJldHVybiAhX2RvZXNQcm9qZWN0T3ZlcnJpZGU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb2VzUHJvamVjdE92ZXJyaWRlKCkgewotCQkvLyBJZiB0aGUgZ2xvYmFsIHByZWZlcmVuY2UgZG9lc24ndCBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUKLQkJLy8gdmFsdWUgb2YgX2RvZXNQcm9qZWN0T3ZlcnJpZGUgaXMuCi0JCXJldHVybiAhdXNlR2xvYmFsUHJlZmVyZW5jZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvZXNQcm9qZWN0T3ZlcnJpZGUoYm9vbGVhbiBkb2VzKSB7Ci0JCV9kb2VzUHJvamVjdE92ZXJyaWRlID0gZG9lczsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcHJlZmVyZW5jZXMgc2hvdWxkIGJlIHVzZWQgdGhlbiB0aGUgcHJlZmVyZW5jZSBzZXR0aW5ncyBhcmUgcmV0dXJuZWQ7IG90aGVyd2lzZSByZXR1cm4KLQkgKiB0aGUgcHJvamVjdCBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uICB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXREaXNhYmxlZFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldERpc2FibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldERpc2FibGVkVmFsaWRhdG9ycygpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0VmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRvcnMoKTsKLQl9Ci0KLSAgcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0gICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhib29sZWFuIGluY3JlbWVudGFsKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGluY3JlbWVudGFsKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoaW5jcmVtZW50YWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5wcmVmZXJlbmNlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2lzRW5hYmxlZChWYWxpZGF0b3JNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmlzRW5hYmxlZCh2bWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQodm1kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkRpc2FibGVkVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkRpc2FibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZlZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZlZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY291bGQgYmUgY2FsbGVkIHdpdGggdGhlIHByb2plY3QncyB2YWx1ZXMsIG9yIHdpdGggdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkgKiBWYWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdCB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCXN1cGVyLnNldEVuYWJsZWRWYWxpZGF0b3JzKGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyh2bWRzLCBnZXRSZXNvdXJjZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY291bGQgYmUgY2FsbGVkIHdpdGggdGhlIHByb2plY3QncyB2YWx1ZXMsIG9yIHdpdGggdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkgKiBWYWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdCB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHsKLQkJc3VwZXIuc2V0VmFsaWRhdG9ycyhleHRyYWN0UHJvamVjdFZhbGlkYXRvcnModm1kcywgZ2V0UmVzb3VyY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc2V0IG9mIHZhbGlkYXRvcnMsIHVzdWFsbHkgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHNldCwgY2hhbmdlIHRoZSBzZXQgc28gdGhhdCBpdAotCSAqIGNvbnRhaW5zIG9ubHkgdGhlIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJaW50IGxlbmd0aCA9ICh2bWRzID09IG51bGwpID8gMCA6IHZtZHMubGVuZ3RoOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGVuZ3RoXTsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCWludCBjb3VudCA9IDA7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAocmVhZGVyLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCX0KLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJdGVtcCA9IG51bGw7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldFRvRGVmYXVsdCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBwcm9qZWN0IGlzIHdoYXRldmVyIHRoZSBwcmVmZXJlbmNlIHZhbHVlcyBhcmUKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0KLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ3AuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ3AuZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoZ3AuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSk7Ci0JCQotCQkvLyBleGNlcHQgZm9yIHRoaXMgZmllbGQsIHdoaWNoIGlzIHVuaXF1ZSB0byB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcwotCQlzZXREb2VzUHJvamVjdE92ZXJyaWRlKGdldERvZXNQcm9qZWN0T3ZlcnJpZGVEZWZhdWx0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0VG9EZWZhdWx0Rm9yUHJvamVjdERlc2NyaXB0aW9uQ2hhbmdlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyBUaGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHByb2plY3QgaXMgd2hhdGV2ZXIgdGhlIHByZWZlcmVuY2UgdmFsdWVzIGFyZQotCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ3AuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ3AuZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoZ3AuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByb2plY3QncyBuYXR1cmUgaGFzIGNoYW5nZWQsIHNvIHJlY2FsY3VsYXRlIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlCi0JICogcHJvamVjdCwgYW5kIHJlc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHByb2plY3QgdG8gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgZG9lc24ndCBkbyBhbnl0aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvamVjdE5hdHVyZSgpIHsKLQkJLyoKLQkJICogV2UgZG8gbm90IHdhbnQgdG8gcGVyZm9ybSB0aGUgcmVzZXR0aW5nIHRoZSBvZiB0aGUgdmFsaWRhdG9ycyBhcyB0aGUgbmF0dXJlIG5ldmVyIGdldHMKLQkJICogcmVzZXQgZHVlIHRvIGNoYW5nZSBpbiB0aGUgcHJvamVjdCByZWZlcmVuY2VzIC0gVktCIEdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPQotCQkgKiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkgKiBzZXRWYWxpZGF0b3JzKGdwLmdldFZhbGlkYXRvcnMoKSk7IC8vIFJlc2V0IHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlCi0JCSAqIHByb2plY3QgKHRoZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBhdXRvbWF0aWNhbGx5IHNhdmVzIG9ubHkgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUKLQkJICogY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCkuIHJlc2V0VG9EZWZhdWx0KCk7IC8vIEdpdmVuIHRoYXQgdGhlIHByb2plY3QgaXMgIm5ldyIsIHJlc2V0Ci0JCSAqIGl0cyB2YWx1ZXMgdG8gdGhlIFByZWZlcmVuY2VzLgotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleGlzdHMgb25seSBmb3IgbWlncmF0aW9uIHB1cnBvc2VzLiBUaGUgcHJvamVjdCBtYXJrZXIgbXVzdCBiZSBkZWxldGVkIGFmdGVyCi0JICogbWlncmF0aW9uIGlzIGNvbXBsZXRlLgotCSAqLwotCXByb3RlY3RlZCBJTWFya2VyW10gZ2V0TWFya2VyKCkgewotCQl0cnkgewotCQkJLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIDQuMDMgcHJvamVjdCBtYXJrZXIuCi0JCQlJTWFya2VyW10gYWxsTWFya2VycyA9IGdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfTUFSS0VSXzQwMywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQotCQkJLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiB0aGlzIG1pZ2h0IGJlIGEgNS4wIHByb2plY3QgbWFya2VyLgotCQkJaWYgKChhbGxNYXJrZXJzID09IG51bGwpIHx8IChhbGxNYXJrZXJzLmxlbmd0aCA9PSAwKSkgewotCQkJCWFsbE1hcmtlcnMgPSBnZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCX0KLQotCQkJLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHByb2plY3RtYXJrZXIuCi0JCQlpZiAoYWxsTWFya2Vycy5sZW5ndGggPT0gMSkgewotCQkJCXJldHVybiBhbGxNYXJrZXJzOwotCQkJfQotCQkJLy8gSm9iIGlzIGRvbmUuIE5vdGhpbmcgdG8gbWlncmF0ZS4KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHsKLQkJLy8gNC4wMyBwcm9qZWN0IHByZWZlcmVuY2VzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBpbiB0aGUgZm9sbG93aW5nIHdheXM6Ci0JCS8vICAgIDEuIE9ubHkgcHJlZmVyZW5jZXMgdGhhdCBjb3VsZCBiZSBzZXQgd2VyZSB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGFuZCB0aGUgYXV0by12YWxpZGF0ZQotCQkvLyBvcHRpb24uCi0JCS8vICAgIDIuIFRoZSBwcmVmZXJlbmNlcyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyIGluc3RlYWQgb2YgYSBQZXJzaXN0ZW50UHJvcGVydHkuCi0JCS8vIFRoZSA1LjAgcHJvamVjdCBzZXR0aW5ncyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyLCBhbmQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXJlIHN0b3JlZAotCQkvLyBpbiBhIFBlcnNpc3RlbnRQcm9wZXJ0eS4KLQkJLy8gQSA1LjAgcHJvamVjdCBjb3VsZCBoYXZlIGEgbnVsbCB2YWxpZGF0aW9uIG1hcmtlciBpZiB0aGUgdmFsaWRhdGlvbiBwYWdlIHdhcyBuZXZlcgotCQkvLyBvcGVuZWQgb24gaXQsIGFuZCBpZiB2YWxpZGF0aW9uIHdhcyBuZXZlciBydW4uCi0JCXRyeSB7Ci0JCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCQkvLyBBc3N1bWUgZGVmYXVsdCB2YWx1ZXMKLQkJCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSU1hcmtlciBwcmpNYXJrZXIgPSBtYXJrZXJbMF07IC8vIGdldFByb2plY3RNYXJrZXIoKSBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUncyBhCi0JCQkvLyBtYXJrZXIgaW4gdGhlIGFycmF5Ci0vLwkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCi0vLwkJCVN0cmluZyBlbmFibGVkVmFsU3RyID0gKFN0cmluZykgZ2V0VmFsdWUocHJqTWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfVkFMSURBVE9SUyk7Ci0vLwkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbCA9IG51bGw7Ci0vLwkJCWlmIChlbmFibGVkVmFsU3RyID09IG51bGwpIHsKLS8vCQkJCWVuYWJsZWRWYWwgPSBncC5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJZW5hYmxlZFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZFZhbFN0cik7Ci0vLwkJCX0KLS8vCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbCk7Ci0JCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZE1hbmF1YWxWYWwgPSBudWxsOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkQnVpbGRWYWwgPSBudWxsOwotCQkJU3RyaW5nIGVuYWJsZWRNYW51YWxWYWxTdHIgPSAoU3RyaW5nKSBnZXRWYWx1ZShwcmpNYXJrZXIsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUyk7Ci0JCQlTdHJpbmcgZW5hYmxlZEJ1aWxkVmFsU3RyID0gKFN0cmluZykgZ2V0VmFsdWUocHJqTWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0vLwkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbCA9IG51bGw7Ci0vLwkJCWlmIChlbmFibGVkTWFudWFsVmFsU3RyLmVxdWFscyhudWxsKSB8fCBlbmFibGVkQnVpbGRWYWxTdHIuZXF1YWxzKG51bGwpKSB7Ci0vLwkJCQllbmFibGVkVmFsID0gZ3AuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLS8vCQkJfSBlbHNlIHsKLQkJCWlmICghZW5hYmxlZE1hbnVhbFZhbFN0ci5lcXVhbHMobnVsbCkgJiYgIWVuYWJsZWRCdWlsZFZhbFN0ci5lcXVhbHMobnVsbCkpIHsKLQkJCQllbmFibGVkTWFuYXVhbFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbFN0cik7Ci0JCQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZW5hYmxlZE1hbmF1YWxWYWwpOwotCQkJCWVuYWJsZWRCdWlsZFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbFN0cik7Ci0JCQkJc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhlbmFibGVkQnVpbGRWYWwpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGxvYWRWZXJzaW9uKG1hcmtlcik7IC8vIEluIDQuMDMsIGV2ZXJ5IHByb2plY3QgaGFkIGl0cyBvd24gdmFsaWRhdG9ycyAmCi0JCQkvLyBhdXRvLXZhbGlkYXRlIHNldHRpbmdzLgotCQkJQm9vbGVhbiBib29sVmFsID0gKEJvb2xlYW4pIGdldFZhbHVlKHByak1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwpOwotCQkJaWYgKChib29sVmFsID09IG51bGwpICYmICh2ZXJzaW9uLmVxdWFscyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT040XzAzKSkpIHsKLQkJCQkvLyBEaWZmZXJlbnQgZGVmYXVsdCBmb3IgNC4wMy4gSW4gNC4wMywgYWxsIHByb2plY3RzIG92ZXJyb2RlIHRoZSBnbG9iYWwsIGJlY2F1c2UKLQkJCQkvLyB0aGUKLQkJCQkvLyBnbG9iYWwgcHJlZmVyZW5jZXMgZGlkbid0IGV4aXN0LgotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKGJvb2xWYWwgPT0gbnVsbCkgewotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZ2V0RG9lc1Byb2plY3RPdmVycmlkZURlZmF1bHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoYm9vbFZhbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCWdldFJlc291cmNlKCkuZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weVRvKFByb2plY3RDb25maWd1cmF0aW9uIHByanApIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuY29weVRvKHByanApOwotCi0JCS8vIE5lZWQgdG8gaGF2ZSBhIGRpc3RpbmN0IG1ldGhvZCBmb3IgdGhpcyBjaGlsZCBjbGFzcyAoaS5lLiwgdGhlIHBhcmFtZXRlcgotCQkvLyBpcyBub3QgYSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbikgYmVjYXVzZSBpZiB0aGlzIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNhbGxlZCBhcyBwYXJ0IG9mIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJ3MgY29uc3RydWN0b3IsIHRoZW4gdGhlIHZhbHVlIG9mCi0JCS8vIHRoaXMgZmllbGQgaXMgb3ZlcndyaXR0ZW4uIEZpZWxkcyBvZiB0aGlzIGNsYXNzIGFyZSBpbml0aWFsaXplZCB0byB0aGUKLQkJLy8gZGVmYXVsdCBhZnRlciB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gcGFyZW50IGlzIGNyZWF0ZWQuCi0JCXByanAuc2V0RG9lc1Byb2plY3RPdmVycmlkZShkb2VzUHJvamVjdE92ZXJyaWRlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREb2VzUHJvamVjdE92ZXJyaWRlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIFBSSl9PVkVSUklERUdMT0JBTF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgaGF2ZSBub3QgY2hhbmdlZCBzaW5jZSB0aGlzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHdhcwotCSAqIGNvbnN0cnVjdGVkLCBmYWxzZSBvdGhlcndpc2UuIChUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIHRoZSBQcm9wZXJ0aWVzIGFuZCBQcmVmZXJlbmNlIHBhZ2VzOwotCSAqIGlmIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMgaGFzbid0IGNoYW5nZWQsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHRhc2sgbGlzdDsKLQkgKiB1cGRhdGluZyB0aGUgdGFzayBsaXN0IGlzIGEgY29zdGx5IG9wZXJhdGlvbi4pCi0JICogCi0JICogVGhlICJhbGxvdyIgcGFyYW1ldGVyIHJlcHJlc2VudHMgd2hldGhlciBvciBub3QgdGhlIGdsb2JhbCAiYWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUiIGhhcwotCSAqIGJlZW4gY2hhbmdlZDogLSBUUlVFIG1lYW5zIHRoYXQgdGhlIHByZWZlcmVuY2UgImFsbG93IiBwYXJhbWV0ZXIgaGFzIGJlZW4gY2hhbmdlZCAtIEZBTFNFCi0JICogbWVhbnMgdGhhdCB0aGUgcHJlZmVyZW5jZSAiYWxsb3ciIHBhcmFtdGVyIGhhcyBub3QgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKFZhbGlkYXRvck1ldGFEYXRhW10gb2xkRW5hYmxlZFZtZCwgYm9vbGVhbiBhbGxvdykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyBGaXJzdCBjaGVjayB0aGUgb2J2aW91czogaXMgZXZlcnkgZW5hYmxlZCB2YWxpZGF0b3Igc3RpbGwgZW5hYmxlZCwgYW5kIGlzCi0JCS8vIHRoZSBudW1iZXIgb2YgZW5hYmxlZCB2YWxpZGF0b3JzIHRoZSBzYW1lIGFzIGl0IHdhcyBiZWZvcmU/IElmIG5vdCwgcmV0dXJuIHRydWUuCi0JCWlmIChzdXBlci5oYXNFbmFibGVkVmFsaWRhdG9yc0NoYW5nZWQob2xkRW5hYmxlZFZtZCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQotCQkvLyBJZiB0aGUgZ2xvYmFsIHByZWZlcmVuY2UgdmFsaWRhdG9ycyBoYXZlIGNoYW5nZWQsIGRvZXMgdGhlIHRhc2sgbGlzdCBuZWVkIHRvIGJlIHVwZGF0ZWQ/Ci0JCS8vIFBSRUYgfCBQUk9KIHwgVVBEQVRFCi0JCS8vIEFMTE9XIHwgT1ZFUlJJREUgfCBUQVNLIExJU1QKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgIDAgfCAwIHwgMQotCQkvLyAgICAgMCB8IDEgfCAxCi0JCS8vICAgICAxIHwgMCB8IDEKLQkJLy8gICAgIDEgfCAxIHwgMAotCQkvLwotCQkvLyBJZiB0aGUgZ2xvYmFsICJhbGxvdyIgcHJlZmVyZW5jZSBjaGFuZ2VzIGZyb20gImFsbG93IiB0byAiZG9uJ3QgYWxsb3ciLCBvciB2aWNlIHZlcnNhLAotCQkvLyBhbmQgdGhlIHByb2plY3Qgb3ZlcnJpZGVzIHRoZSBwcmVmZXJlbmNlcywgYW5kIHRoZSB2YWxpZGF0b3JzIGRpZmZlciBiZXR3ZWVuIHRoZSBwcm9qZWN0Ci0JCS8vIGFuZCB0aGUgcHJlZmVyZW5jZXMsIHRoZW4gdGhlIHRhc2sgbGlzdCBtdXN0IGJlIHVwZGF0ZWQuCi0JCWlmIChhbGxvdykgewotCQkJLy8gImFsbG93IiBoYXMgY2hhbmdlZCwgc28gc2VlIGlmIHRoZSBwcmVmZXJlbmNlIGFuZCB0aGUgcHJvamVjdCB2YWxpZGF0b3JzIG1hdGNoLgotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBwcm9qRW5hYmxlZFZtZCA9IHN1cGVyLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7IC8vIGJ5cGFzcyB0aGUgY2hlY2sKLQkJCS8vIGZvciB3aGV0aGVyIHRoZQotCQkJLy8gZ2xvYmFsIHByZWZlcmVuY2VzCi0JCQkvLyBhcmUgdG8gYmUgdXNlZCBvcgotCQkJLy8gbm90Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCXJldHVybiBncC5oYXNFbmFibGVkVmFsaWRhdG9yc0NoYW5nZWQocHJvakVuYWJsZWRWbWQpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXZlRGVsZWdhdGVzQ2hhbmdlZChNYXAgb2xkRGVsZWdhdGVzLCBib29sZWFuIGFsbG93KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0KLSAgICBpZiAoc3VwZXIuaGF2ZURlbGVnYXRlc0NoYW5nZWQob2xkRGVsZWdhdGVzKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGFsbG93KSB7Ci0gICAgICBNYXAgcHJvakRlbGVnYXRlcyA9IHN1cGVyLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCk7IAotICAgICAgR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ3AuaGF2ZURlbGVnYXRlc0NoYW5nZWQocHJvakRlbGVnYXRlcyk7Ci0gICAgfQotICAgICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCX0gZWxzZSBpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlpbnQgcHJqT3ZlcnJpZGVJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSSl9PVkVSUklERUdMT0JBTCk7Ci0JCQlpbnQgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORyk7Ci0JCQlpbnQgdmVyc2lvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCQlpZiAoZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBkaXNhYmxlQWxsVmFsaWRhdGlvbiA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORy5sZW5ndGgoKSwgdmVyc2lvbkluZGV4KTsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihCb29sZWFuLnZhbHVlT2YoZGlzYWJsZUFsbFZhbGlkYXRpb24pLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oZmFsc2UpOzsKLQkJCX0KLQkJCS8vIHByb2plY3QgZG9lc24ndCBvdmVycmlkZSB0aGUgZ2xvYmFsCi0JCQlpZiAoZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwcmpPdmVycmlkZSA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKHByak92ZXJyaWRlSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSSl9PVkVSUklERUdMT0JBTC5sZW5ndGgoKSwgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCk7Ci0JCQkJc2V0RG9lc1Byb2plY3RPdmVycmlkZShCb29sZWFuLnZhbHVlT2YocHJqT3ZlcnJpZGUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX09WRVJSSURFR0xPQkFMKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihkb2VzUHJvamVjdE92ZXJyaWRlKCkpKTsKLQkJaWYgKGRvZXNQcm9qZWN0T3ZlcnJpZGUoKSkgewotCQkJLy8gU3RvcmUgY29tbW9uIHZhbHVlcyBmb3IgdGhlIFByb2plY3QgY29uZmlndXJhdGlvbiBvbmx5IGlmIHRoZXkgZGlmZmVyIGZyb20gdGhlIGdsb2JhbAotCQkJYnVmZmVyLmFwcGVuZChzdXBlci5zZXJpYWxpemUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5hdHRyaWJ1dGUuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuIGZ1bGxCdWlsZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGZ1bGxCdWlsZCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzZXQgb2YgdmFsaWRhdG9ycywgdXN1YWxseSB0aGUgZ2xvYmFsIHByZWZlcmVuY2Ugc2V0LCBjaGFuZ2UgdGhlIHNldCBzbyB0aGF0IGl0Ci0JICogY29udGFpbnMgb25seSB0aGUgdmFsaWRhdG9ycyBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMsIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBvbmx5UmVmZXJlbmNlZCkgewotCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQlpbnQgbGVuZ3RoID0gKHZtZHMgPT0gbnVsbCkgPyAwIDogdm1kcy5sZW5ndGg7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gMDsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCWlmIChyZWFkZXIuaXNDb25maWd1cmVkT25Qcm9qZWN0KHZtZCwgcHJvamVjdCkpIHsKLQkJCQlpZiAoIW9ubHlSZWZlcmVuY2VkIHx8IHZtZC5pc0RlcGVuZGVudFZhbGlkYXRvcigpKQotCQkJCQl0ZW1wW2NvdW50KytdID0gdm1kOwotCQkJfQotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQl0ZW1wID0gbnVsbDsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5hdHRyaWJ1dGUuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuIGZ1bGxCdWlsZCwgYm9vbGVhbiBvbmx5UmVmZXJlbmNlZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkKSwgZ2V0UmVzb3VyY2UoKSwgb25seVJlZmVyZW5jZWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhmdWxsQnVpbGQsIG9ubHlSZWZlcmVuY2VkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2dldEluY3JlbWVudGFsVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG51bWJlck9mTWFudWFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5udW1iZXJPZk1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbnsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCk7Ci0JfQkKLQotICBwdWJsaWMgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGdldERlbGVnYXRlRGVzY3JpcHRvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0gICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXREZWxlZ2F0ZURlc2NyaXB0b3Iodm1kKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldERlbGVnYXRlRGVzY3JpcHRvcih2bWQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzdG9yZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0UmVzb3VyY2UoKTsKLQkJSVNjb3BlQ29udGV4dCBwcm9qZWN0Q29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCk7Ci0JCWZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IHByb2plY3RDb250ZXh0LmdldE5vZGUoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXByZWYucHV0KFVTRVJfUFJFRkVSRU5DRSwgc2VyaWFsaXplKCkpOwotCQkJCXByZWYucHV0KFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UsIHNlcmlhbGl6ZU1hbnVhbFNldHRpbmcoKSk7Ci0JCQkJcHJlZi5wdXQoVVNFUl9CVUlMRF9QUkVGRVJFTkNFLCBzZXJpYWxpemVCdWlsZFNldHRpbmcoKSk7Ci0JCQkJcHJlZi5wdXQoREVMRUdBVEVTX1BSRUZFUkVOQ0UsIHNlcmlhbGl6ZURlbGVnYXRlc1NldHRpbmcoKSk7Ci0JCQkJcHJlZi5mbHVzaCgpOwotCQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRQcmVmZXJlbmNlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRSZXNvdXJjZSgpOwotCQlJU2NvcGVDb250ZXh0IHByb2plY3RDb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IHByb2plY3RDb250ZXh0LmdldE5vZGUoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOwotCQlpZiAocHJlZnMgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0b3JlZENvbmZpZyA9IHByZWZzLmdldChVU0VSX1BSRUZFUkVOQ0UsIERlZmF1bHRWYWx1ZSk7Ci0JCQlkZXNlcmlhbGl6ZShzdG9yZWRDb25maWcpOwotCQkJU3RyaW5nIHN0b3JlZE1hbnVhbENvbmZpZyA9IHByZWZzLmdldChVU0VSX01BTlVBTF9QUkVGRVJFTkNFLCBEZWZhdWx0VmFsdWUpOwotCQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkTWFudWFsQ29uZmlnKTsKLQkJCVN0cmluZyBzdG9yZWRCdWlsZENvbmZpZyA9IHByZWZzLmdldChVU0VSX0JVSUxEX1BSRUZFUkVOQ0UsIERlZmF1bHRWYWx1ZSk7Ci0JCQlkZXNlcmlhbGl6ZUJ1aWxkKHN0b3JlZEJ1aWxkQ29uZmlnKTsKLQkJCVN0cmluZyBzdG9yZWREZWxlZ2F0ZXNDb25maWd1cmF0aW9uID0gcHJlZnMuZ2V0KERFTEVHQVRFU19QUkVGRVJFTkNFLCBEZWZhdWx0VmFsdWUpOwotCQkJZGVzZXJpYWxpemVEZWxlZ2F0ZXMoc3RvcmVkRGVsZWdhdGVzQ29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0YmE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCXByaXZhdGUgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIGluc3RhbmNlOwotCXByaXZhdGUgYm9vbGVhbiBlcnJvckNvbmRpdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCi0JLyoqIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04gPSAicmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBydW4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU4gPSAicnVuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBpZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogY2xhc3MgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCAmJiAhZXJyb3JDb25kaXRpb24pCi0JCQkJaW5zdGFuY2UgPSAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUlVOKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJZXJyb3JDb25kaXRpb24gPSB0cnVlOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmKCFSRUZfRklMRV9WQUxJREFUT1JfRVhURU5TSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHRlbnNpb25zIG11c3QgYmUgb2YgdGhlIHR5cGUgXCIiICsgUkVGX0ZJTEVfVkFMSURBVE9SX0VYVEVOU0lPTiArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5pZCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBpZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTAxNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyIHsKLQlzdGF0aWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIgaW5zdGFuY2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElkID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFeHRlbnNpb25Qb2ludCA9ICJyZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIExpc3Q8UmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uPiByZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9uczsKLQotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSWQsIEV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ID09IG51bGwpcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlib29sZWFuIHJlY29nbml6ZWQgPSB0aGlzLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoIXJlY29nbml6ZWQpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJFcnJvciBwcm9jZXNzaW5nIGV4dGVuc2lvbjogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSBkZXNrdG9wIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uLlJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJYWRkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0ZW5zaW9uCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0V4dGVuc2lvbikgewotCi0gICAgCS8vYWRkIHRvIHRoZSBsaXN0IG9mIHBvc3QgdmFsaWRhdG9yIGV4dGVuc2lvbnMgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBhZGRlZCB5ZXQKLSAgICAJYm9vbGVhbiBjb250YWluc0V4dCA9IHRydWU7Ci0gICAgCUxpc3QgZXh0ZW5zaW9ucyA9IGdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCk7Ci0gICAgCUl0ZXJhdG9yIGl0ID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgIAl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAJCVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiBleHQgPSAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKWl0Lm5leHQoKTsKLSAgICAJCWlmKCFleHQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShJZCkuZXF1YWxzKG5ld0V4dGVuc2lvbi5nZXRBdHRyaWJ1dGUoSWQpKSkKLSAgICAJCQljb250YWluc0V4dCA9IGZhbHNlOwotICAgIAl9Ci0gICAgCWlmKCFjb250YWluc0V4dCB8fGdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCkuaXNFbXB0eSgpKQotICAgIAkJZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKS5hZGQobmV3IFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbihuZXdFeHRlbnNpb24pKTsKLSAgICAKLQkJZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKS5hZGQobmV3IFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbihuZXdFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIG5ld0V4dGVuc2lvbgotCSAqICAgICAgICAgICAgVGhlIGV4dGVuc2lvbnMgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaW9uUG9pbnQoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uIG5ld0V4dGVuc2lvbikgewotCQlpZiAocmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMgPT0gbnVsbCkKLQkJCXJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24+KCk7Ci0JCXJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zLmFkZChuZXdFeHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHByaW9yaXRpZXMgb2YgdGhvc2Ugd2hpY2ggYXJlCi0JICogICAgICAgICBhdmFpbGFibGUgYW5kIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIGdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcigpIHsKLQkJUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uIHJlZkZpbGVWYWxFeHQ7Ci0JCWZvciAoSXRlcmF0b3IgcmVmRmlsZVZhbEl0ciA9IGdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsgcmVmRmlsZVZhbEl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlyZWZGaWxlVmFsRXh0ID0gKFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbikgcmVmRmlsZVZhbEl0ci5uZXh0KCk7Ci0JCQlyZXR1cm4gcmVmRmlsZVZhbEV4dC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJFeHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBMaXN0PFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbj4gZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKSB7Ci0JCWlmIChyZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbj4oKTsKLQkJcmV0dXJuIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWdpc3RyeUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWdpc3RyeUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVnaXN0cnlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JUnVsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVmFsaWRhdGlvbiBjb25zdGFudHMgbmVlZGVkIHRvIGRlY2xhcmUgYW4gZXh0ZW5zaW9uIHBvaW50LCBhbmQgdG8gaW1wbGVtZW50IGFuIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JU3RyaW5nIFBMVUdJTl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCQotCS8qKiB2YWxpZGF0b3IgLSBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHZhbGlkYXRvciAqLwotCVN0cmluZyBWQUxJREFUT1JfRVhUX1BUX0lEID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBydW4gLSBpZGVudGlmaWVzIHRoZSBWYWxpZGF0b3IgY2xhc3MgKi8KLQlTdHJpbmcgVEFHX1JVTl9DTEFTUyA9ICJydW4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIGZpbHRlciAtIGlkZW50aWZpZXMgYSBmaWx0ZXIgLS0gdHlwZSBhbmQvb3IgbmFtZSAtLSB1c2VkIHRvIGZpbHRlciBvdXQgcmVzb3VyY2VzIHdoaWNoIGFyZQotCSAqIG5vdCB0byBiZSB2YWxpZGF0ZWQuIChpLmUuLCBpZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBwYXNzIHRoaXMgZmlsdGVyIHRlc3QsIGRvbid0IHZhbGlkYXRlIGl0LikgCi0JICovIAotCVN0cmluZyBUQUdfRklMVEVSID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBpZGVudGlmaWVzIGEgZmlsdGVyIC0tIHR5cGUgYW5kL29yIG5hbWUgLS0gdXNlZCB0byBmaWx0ZXIgb3V0IHJlc291cmNlcyB3aGljaCBhcmUgbm90IHRvIGJlIHZhbGlkYXRlZC4gKGkuZS4sIGlmIHRoZSByZXNvdXJjZSBkb2Vzbid0IHBhc3MgdGhpcyBmaWx0ZXIgdGVzdCwgZG9uJ3QgdmFsaWRhdGUgaXQuKQotCSAqLwotCVN0cmluZyBUQUdfQ09OVEVOVFRZUEUgPSAiY29udGVudFR5cGVCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKioKLQkgKiAgaWRlbnRpZmllcyBhIHR5cGUKLQkgKi8KLQlTdHJpbmcgQVRUX0NPTlRFTlRUWVBFSUQgPSAiY29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQgCi0JLyoqIGhlbHBlciAtIElWYWxpZGF0aW9uQ29udGV4dCB3aGljaCBsb2FkcyB0aGUgTU9GIG1vZGVsIGZvciB0aGUgSVZhbGlkYXRvciAqLyAKLQlTdHJpbmcgVEFHX0hFTFBFUl9DTEFTUyA9ICJoZWxwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb2plY3ROYXR1cmUgLSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0cyB3aGljaCB0aGUgdmFsaWRhdG9yIHNob3VsZCBydW4gb24gKi8KLQlTdHJpbmcgVEFHX1BST0pFQ1RfTkFUVVJFID0gInByb2plY3ROYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIGFnZ3JlZ2F0ZVZhbGlkYXRvciAtIGlkZW50aWZpZXMgYSB2YWxpZGF0b3Iocykgd2hpY2ggdGhpcyB2YWxpZGF0b3IgYWdncmVnYXRlcy4gVGhpcyB2YWx1ZSBpcyB1c2VkIAotCSAqIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQgYnkgYSBwYXJ0aWN1bGFyIHZhbGlkYXRvci4gQWdncmVnYXRlIHZhbGlkYXRvcnMgY2Fubm90IGJlIHNoYXJlZC4gCi0JICogb25seSBvbmUgdmFsaWRhdG9yIG1heSB1c2UgYW4gYWdncmVnYXRlIG9mIHRoYXQgdHlwZS4gKi8KLQlTdHJpbmcgVEFHX0FHR1JFR0FURV9WQUxJREFUT1JTID0gImFnZ3JlZ2F0ZVZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvKiogb2JqZWN0Q2xhc3MgLSBpZGVudGlmaWVzIGEgdHlwZSAqLyAKLQlTdHJpbmcgQVRUX09CSkVDVF9DTEFTUyA9ICJvYmplY3RDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogbmFtZUZpbHRlciAtIGlkZW50aWZpZXMgYSBuYW1lIChtYXkgaW5jbHVkZSB0aGUgJyonIHdpbGRjYXJkIGFueXdoZXJlIGluIHRoZSBuYW1lKSAqLwotCVN0cmluZyBBVFRfTkFNRV9GSUxURVIgPSAibmFtZUZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogaWQgLSBpZGVudGlmaWVzIGEgdW5pcXVlIGlkIHRvIGZpbHRlciBvbiAqLwotCVN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGNsYXNzIC0gaWRlbnRpZmllcyBhIGNsYXNzIG5hbWUgb2YgYSB0YWcsIGUuZy4gImhlbHBlciBjbGFzcyIsIG9yICJydW4gY2xhc3MiICovCi0JU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogYWN0aW9uIC0gaWRlbnRpZmllcyB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBhY3Rpb25zIGZvciB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBmaWx0ZXJlZCBpbiAqLyAKLQlTdHJpbmcgQVRUX0FDVElPTl9GSUxURVIgPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiBpbmNyZW1lbnRhbCAtIGlkZW50aWZpZXMgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBzdXBwb3J0cyBpbmNyZW1lbnRhbCBidWlsZCB2YWxpZGF0aW9uLiAKLQkgKiBEZWZhdWx0IGlzIHRydWUgKGkuZS4sIGluY3JlbWVudGFsIGJ1aWxkcyBhcmUgc3VwcG9ydGVkKS4gCi0JICovCi0JU3RyaW5nIEFUVF9JTkNSRU1FTlRBTCA9ICJpbmNyZW1lbnRhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHJ1ZSAtIFRoZSBpbmNyZW1lbnRhbCBkZWZhdWx0LiAqLwotCWJvb2xlYW4gQVRUX0lOQ1JFTUVOVEFMX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiAKLQkgKiBmdWxsQnVpbGQgLSBpZGVudGlmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMgZnVsbCBidWlsZCB2YWxpZGF0aW9uLiAKLQkgKiBEZWZhdWx0IGlzIHRydWUgKGkuZS4sIGZ1bGwgYnVpbGQgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQpLgotCSAqLyAKLQlTdHJpbmcgQVRUX0ZVTExCVUlMRCA9ICJmdWxsQnVpbGQiOyAvLyROT04tTkxTLTEkIAotCQotCS8qKiB0cnVlIC0gVGhlIGJ1aWxkIGRlZmF1bHQuICovCi0JYm9vbGVhbiBBVFRfRlVMTEJVSUxEX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiBlbmFibGVkIC0gaWRlbnRpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gRGVmYXVsdCBpcyAidHJ1ZSIgKGVuYWJsZWQpLiAqLyAKLQlTdHJpbmcgQVRUX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHJ1ZSAtIFRoZSAiZW5hYmxlZCIgZGVmYXVsdC4gKi8KLQlib29sZWFuIEFUVF9FTkFCTEVEX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiBpbmNsdWRlIC0gSW5jbHVkZSBwcm9qZWN0cyB3aXRoIHRoaXMgbmF0dXJlICovCi0JU3RyaW5nIEFUVF9JTkNMVURFID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIHRydWUgLSBCeSBkZWZhdWx0LCBpZiAiaW5jbHVkZSIgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcHJvamVjdE5hdHVyZSBlbGVtZW50LCAKLQkgKiB0aGVuIGFzc3VtZSB0aGF0IHRoZSBuYXR1cmUgaXMgaW5jbHVkZWQuICovCi0JYm9vbGVhbiBBVFRfSU5DTFVERV9ERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKiogCi0JICogcnVsZUdyb3VwIC0gaWRlbnRpZmllcyB0aGUgZGlmZmVyZW50IHZhbGlkYXRpb24gcGFzc2VzIHdoaWNoIHRoaXMgdmFsaWRhdG9yIHJlY29nbml6ZXMuIAotCSAqIFRoZSB2YWx1ZXMgYXJlIGlkZW50aWZpZWQgaW4gSVJ1bGVHcm91cC4KLQkgKi8KLQlTdHJpbmcgQVRUX1JVTEVfR1JPVVAgPSAicnVsZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0aGUgZGVmYXVsdCBwYXNzIGluY2x1ZGVzIG9ubHkgdGhlIEZBU1QgUEFTUy4gRlVMTCBjYW4gYmUgaW52b2tlZCBvbmx5IGV4cGxpY2l0bHkgYnkgYW4gb3BlcmF0aW9uLiAqLwotCWludCBBVFRfUlVMRV9HUk9VUF9ERUZBVUxUID0gSVJ1bGVHcm91cC5QQVNTX0ZBU1Q7Ci0JCi0JLyoqIGNhc2VTZW5zaXRpdmUgKi8KLQlTdHJpbmcgQVRUX0NBU0VfU0VOU0lUSVZFID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGFzeW5jIC0gSXMgdGhlIHZhbGlkYXRvciB0aHJlYWQtc2FmZT8gKi8KLQlTdHJpbmcgQVRUX0FTWU5DID0gImFzeW5jIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmYWxzZSAtIFRoZSAiY2FuIHZhbGlkYXRvciBydW4gYXN5bmNocm9ub3VzbHkiIGRlZmF1bHQuIEluIHRoZSBmdXR1cmUgdGhpcyBtYXkgYmUgY2hhbmdlZCB0byB0cnVlLiAqLwotCWJvb2xlYW4gQVRUX0FTWU5DX0RFRkFVTFQgPSBmYWxzZTsKLQotCS8qKiBtaWdyYXRlIC0gdGhlICJtaWdyYXRlIiBzZWN0aW9uIG9mIHRoZSB2YWxpZGF0b3IgKi8KLQlTdHJpbmcgVEFHX01JR1JBVEUgPSAibWlncmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdmFsaWRhdG9yIC0gdGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgb2YgdGhlICJtaWdyYXRlIiBzZWN0aW9uICovCi0JU3RyaW5nIFRBR19WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmcm9tIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBmb3JtZXIgdmFsaWRhdG9yIGNsYXNzICovCi0JU3RyaW5nIEFUVF9GUk9NID0gImZyb20iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRvIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjdXJyZW50IHZhbGlkYXRvciBjbGFzcyAqLwotCVN0cmluZyBBVFRfVE8gPSAidG8iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFUF9WQUxJREFUT1IgPSAiZGVwZW5kZW50VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBfVkFMX1ZBTFVFID0gImRlcFZhbFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQVJLRVJfSUQgPSAibWFya2VySWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BUktFUl9JRF9WQUxVRSA9ICJtYXJrZXJJZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gREVQX1ZBTF9WQUxVRV9ERUZBVUxUID0gZmFsc2U7Ci0JU3RyaW5nIEZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUNFVF9JRCA9ImZhY2V0SWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjc1NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHN0cmluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnLWluLgotICogCi0gKiBTZWUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUsIGluIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnksIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VDb25zdGFudHMgewotCS8vIEEgbWFya2VyIGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9BRERfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX0FERF9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBtYXJrZXIgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9SRU1PVkVfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX1JFTU9WRV9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotCVN0cmluZyBWQkZfRVhDX0lOVEVSTkFMID0gIlZCRl9FWENfSU5URVJOQUwiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSWYgdGhlIHZhbGlkYXRvciBjYW5ub3QgYmUgbG9hZGVkIGJlY2F1c2UgaXQgZGlkbid0IHNwZWNpZnkgYSBoZWxwZXIKLQlTdHJpbmcgVkJGX0VYQ19IRUxQRVJfTUlTU0lORyA9ICJWQkZfRVhDX0hFTFBFUl9NSVNTSU5HIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGxvYWRlZCBiZWNhdXNlIGl0cyBoZWxwZXIgY2Fubm90IGJlIGxvYWRlZAotCVN0cmluZyBWQkZfRVhDX0hFTFBFUl9DQU5OT1RMT0FEID0gIlZCRl9FWENfSEVMUEVSX0NBTk5PVExPQUQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBqYXZhLmxhbmcuUnVudGltZSBlcnJvciBoYXMgb2NjdXJlZCBkdXJpbmcgdGhlIGJ1aWxkLgotCVN0cmluZyBWQkZfRVhDX1JVTlRJTUUgPSAiVkJGX0VYQ19SVU5USU1FIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSAiVmFsaWRhdG9yIiBleHRlbnNpb24gcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwbHVnaW4ueG1sIGZpbGUuCi0JU3RyaW5nIFZCRl9FWENfTUlTU0lOR19WQUxJREFUT1JfRVAgPSAiVkJGX0VYQ19NSVNTSU5HX1ZBTElEQVRPUl9FUCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGludmFsaWQgdHlwZSBmaWx0ZXIgaW4gdGhlaXIgcGx1Z2luLnhtbCBmaWxlLgotCS8vIGkuZS4sIGl0IGlzbid0IGFuIGluc3RhbmNlIG9mIElSZXNvdXJjZS4KLQlTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1RZUEVfRklMVEVSID0gIlZCRl9FWENfSU5WQUxJRF9UWVBFX0ZJTFRFUiI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBUaGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBoYXMgbWFkZSBhIG1pc3Rha2UgaW4gaXRzIHBsdWdpbi54bWwncyBwcm9qZWN0TmF0dXJlIHRhZwotCVN0cmluZyBWQkZfRVhDX01JU1NJTkdfUFJPSkVDVE5BVFVSRV9JRCA9ICJWQkZfRVhDX01JU1NJTkdfUFJPSkVDVE5BVFVSRV9JRCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBUaGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBoYXMgbWFkZSBhIG1pc3Rha2UgaW4gaXRzIHBsdWdpbi54bWwncyBzeW50YXguCi0JU3RyaW5nIFZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMID0gIlZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIFRpdGxlIGZvciB0aGUgSVByb2dyZXNzTW9uaXRvci4KLQlTdHJpbmcgVkJGX1NUQVRVU19QUk9HUkVTU01PTklUT1JfVElUTEUgPSAiVkJGX1NUQVRVU19QUk9HUkVTU01PTklUT1JfVElUTEUiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gU3RhdHVzIGxpbmUgZm9yIHRoZSBJUHJvZ3Jlc3NNb25pdG9yCi0JU3RyaW5nIFZCRl9TVEFUVVNfSU5JVElBTElaSU5HID0gIlZCRl9TVEFUVVNfSU5JVElBTElaSU5HIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSB1c2VyIGhhcyBjYW5jZWxsZWQgdmFsaWRhdGlvbiwgZWFjaCB2YWxpZGF0b3IgbWlnaHQgaGF2ZSBjbGVhbnVwIHRvIGRvLiBUaGlzIG1lc3NhZ2UKLQkvLyBpcyBzaG93biB0byB0ZWxsIHRoZSB1c2VyIHdoaWNoIHZhbGlkYXRvciBpcyBiZWluZyBjbGVhbmVkIHVwIGF0IHRoZSBtb21lbnQuCi0JU3RyaW5nIFZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAgPSAiVkJGX1NUQVRVU19WQUxJREFUT1JfQ0xFQU5VUCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgdXNlciBjYW5jZWxsZWQgdmFsaWRhdGlvbiwgcmVtb3ZlIGFsbCBvZiB0aGUgdmFsaWRhdG9yJ3MgdGFza3MgZnJvbSB0aGUgdGFzayBsaXN0LCBhbmQKLQkvLyBwdXQgYW4gZW50cnkgc2F5aW5nIHRoYXQgdmFsaWRhdGlvbiBvbiB7cHJvamVjdH0gdXNpbmcge3ZhbGlkYXRvcn0gd2FzIGNhbmNlbGxlZC4KLQlTdHJpbmcgVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCA9ICJWQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIEJlZm9yZSBhIHZhbGlkYXRvciBpcyBiZWd1biwgdGhpcyBtZXNzYWdlIGluZm9ybXMgdGhlIHVzZXIgdGhhdCB2YWxpZGF0aW9uLCB1c2luZyBhCi0JLy8gcGFydGljdWxhciB2YWxpZGF0b3IsIGhhcyBiZWd1bgotCVN0cmluZyBWQkZfU1RBVFVTX1NUQVJUSU5HX1ZBTElEQVRJT04gPSAiVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIEFmdGVyIGEgdmFsaWRhdG9yIGlzIGZpbmlzaGVkLCB0aGlzIG1lc3NhZ2UgaW5mb3JtcyB0aGUgdXNlciB0aGF0IHZhbGlkdGFpb24sIHVzaW5nIGEKLQkvLyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgaGFzIGNvbXBsZXRlZC4KLQlTdHJpbmcgVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTiA9ICJWQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIGEgdmFsaWRhdG9yIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCB0aGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCVN0cmluZyBWQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFkgPSAiVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSBidWlsZCdzIGdldERlbHRhKGdldFByb2plY3QoKSkgbWV0aG9kIHJldHVybnMgbnVsbCwgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCBhIGZ1bGwKLQkvLyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlcmUncyBubyBkZWx0YSBpbmZvcm1hdGlvbi4KLQlTdHJpbmcgVkJGX1NUQVRVU19OVUxMX0RFTFRBID0gIlZCRl9TVEFUVVNfTlVMTF9ERUxUQSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTlVMTF9OQU1FID0gIlZCRl9FWENfU1lOVEFYX05VTExfTkFNRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU1lOVEFYX05PX0hFTFBFUiA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVIiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfQ0xBU1MgPSAiVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX0NMQVNTIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRSA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfVEhST1dBQkxFIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRSA9ICJWQkZfRVhDX1NZTlRBWF9OT19WQUxfVEhST1dBQkxFIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFID0gIlZCRl9FWENfSU5WQUxJRF9SRVNPVVJDRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19OVUxMQ1JFQVRFID0gIlZCRl9FWENfTlVMTENSRUFURSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfTlVMTFNBVkUgPSAiVkJGX0VYQ19OVUxMU0FWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU0FWRSA9ICJWQkZfRVhDX1NBVkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX05VTExSRVRSSUVWRSA9ICJWQkZfRVhDX05VTExSRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfUkVUUklFVkUgPSAiVkJGX0VYQ19SRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19CQURWTUQgPSAiVkJGX0VYQ19CQURWTUQiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09QRU5QUkogPSAiVkJGX0VYQ19PUEVOUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19FWElTVFBSSiA9ICJWQkZfRVhDX0VYSVNUUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19CQURQUkogPSAiVkJGX0VYQ19CQURQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX01VTFRJUFJKID0gIlZCRl9FWENfTVVMVElQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0JBRFZBTCA9ICJWQkZfRVhDX0JBRFZBTCI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTIjsgLy8kTk9OLU5MUy0xJCAKLQotCVN0cmluZyBWQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfVkFMID0gIlZCRl9UQVNLX1dBUk5fTUVTU0FHRV9MSU1JVF9WQUwiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFZCRl9WQUxJREFUSU9OX0pPQl9NU0cgPSAiVkJGX1ZBTElEQVRJT05fSk9CX01TRyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVWID0gIlZCRl9FWENfRElTQUJMRVYiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVIID0gIlZCRl9FWENfRElTQUJMRUgiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09SUEhBTl9JVkFMSURBVE9SID0gIlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IiOyAvLyROT04tTkxTLTEkIAotCi0JU3RyaW5nIFZCRl9TVEFUVVNfTE9PS0lORyA9ICJWQkZfU1RBVFVTX0xPT0tJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0xPT0tJTkdET05FID0gIlZCRl9TVEFUVVNfTE9PS0lOR0RPTkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HID0gIlZCRl9TVEFUVVNfUkVNT1ZJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSA9ICJWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0JU3RyaW5nIFZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURSA9ICJWQkZfV1JPTkdfQ09OVEVYVF9GT1JfREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9OT19ERUxFR0FURSA9ICJWQkZfTk9fREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9DQU5OT1RfSU5TVEFOVElBVEVfREVMRUdBVEUgPSAiVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSI7IC8vJE5PTi1OTFMtMSQgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YjgzZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHRoZSBTdHJpbmdzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBtYWNoaW5lJ3MgTG9jYWxlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIHsKLQkvL1RPRE8gTWFrZSB0aGlzIGNsYXNzIGZpbmFsIG9uY2UgdGhlIHB1YmxpYyBSZXNvdXJjZUhhbmRsZXIgaGFzIGJlZW4gZGVsZXRlZC4KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vVE9ETyBNYWtlIHRoaXMgbWV0aG9kIHByaXZhdGUgb25jZSB0aGUgcHVibGljIFJlc291cmNlSGFuZGxlciBoYXMgYmVlbiBkZWxldGVkLgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcywgYXMgaWRlbnRpZmllZCBieQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlpZiAoX2J1bmRsZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCV9idW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVmFsaWRhdGlvblBsdWdpbi5nZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJCV9idW5kbGUgPSBudWxsOwotCQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJCVRyYWNpbmcubG9nKCJDYW5ub3QgZmluZCBidW5kbGUgIiArIFZhbGlkYXRpb25QbHVnaW4uZ2V0QnVuZGxlUHJvcGVydHlGaWxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gX2J1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQkJVHJhY2luZy5sb2coIlJlc291cmNlIGJ1bmRsZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGtleTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJCVRyYWNpbmcubG9nKCJDYW5ub3QgZmluZCBtZXNzYWdlIGlkICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2Uoa2V5KSwgKE9iamVjdFtdKXBhcm1zKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiQ2Fubm90IGZpbmQgbWVzc2FnZSBpZCAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJVHJhY2luZy5sb2coIkNhbm5vdCBmb3JtYXQgbWVzc2FnZSBpZCAiICsga2V5ICsgIiB3aXRoICIgKyBwYXJtcy5sZW5ndGggKyAiIHBhcmFtZXRlcnMuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVGFza0xpc3RVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE2ZDk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVGFza0xpc3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBzaW5nbGV0b24gaW50ZXJhY3RzIHdpdGggdGhlIGVjbGlwc2Ugd29ya2JlbmNoJ3MgVGFzayBsaXN0LiBUYXNrTGlzdFV0aWxpdHkgYWRkcyBhbmQgcmVtb3ZlcwotICogdGFza3MgZnJvbSB0aGUgbGlzdC4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBNYW55Ci0gKiByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RVdGlsaXR5IGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfSU5GSU5JVEUgPSBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfWkVSTyA9IElSZXNvdXJjZS5ERVBUSF9aRVJPOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVCA9ICJ0YXJnZXRPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSU1hcmtlcltdIE5PX01BUktFUlMgPSBuZXcgSU1hcmtlclswXTsKLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0Um9vdCgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGhlcmUgZm9yIHVzZSBieSB0aGUgU0FCRVIgdmFsaWRhdG9yJ3MgcmVwb3J0ZXIgaW5zdGFuY2UgT05MWS4gRG8gbm90IHVzZS4gU2VlCi0JICogZGVmZWN0IDI2MDE0NCBmb3IgZGV0YWlscy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgc2V0UHJpb3JpdHkoSU1hcmtlciBpdGVtLCBpbnQgcHJpb3JpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwIGF0dHJpYiA9IGl0ZW0uZ2V0QXR0cmlidXRlcygpOwotCQlhdHRyaWIucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKHByaW9yaXR5KSk7Ci0JCWl0ZW0uc2V0QXR0cmlidXRlcyhhdHRyaWIpOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWRkcyBhIG1lc3NhZ2UgdG8gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1hcmtlciBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIG1hcmtlck5hbWUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkgfHwgKCFyZXNvdXJjZS5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkobWFya2VyVHlwZSk7Ci0KLQkJLy8gQWxsb3cgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhc2sgbGlzdC4KLQkJLy8gUHJpb3IgdG8gYSBmdWxsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQKLQkJLy8gYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgotCQkvLyBQcmlvciB0byBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbCByZW1vdmUgYWxsIG1lc3NhZ2VzLAotCQkvLyBvbiBlYWNoIG9mIHRoZSBjaGFuZ2VkIHJlc291cmNlcywgb3duZWQgYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGludm9rZWQuCi0JCS8vIAotCQkvLyBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdG9yIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCBhZGRpbmcgdGhlIHNhbWUgbWVzc2FnZQotCQkvLyBpbiBtb3JlIHRoYW4gb25lIHBsYWNlLCBhbmQgYWxzbyB0byBjbGVhciBvdXQgYW55IG9sZCBtZXNzYWdlcyB3aGljaCBhcmUgbm90IGNsZWFyZWQKLQkJLy8gYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCQlJTWFya2VyIGl0ZW0gPSBudWxsOwotCQlpZihtYXJrZXJOYW1lICE9IG51bGwgJiYgbWFya2VyTmFtZS5sZW5ndGgoKSA+MCApCi0JCQkgaXRlbSA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihtYXJrZXJOYW1lKTsgLy8gYWRkIGEgdmFsaWRhdGlvbiBtYXJrZXIKLQkJZWxzZQotCQkgICAgIGl0ZW0gPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoVkFMSURBVElPTl9NQVJLRVIpOyAvLyBhZGQgYSB2YWxpZGF0aW9uIG1hcmtlcgotCi0JCS8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZXBsYWNlIHRoZSBtdWx0aXBsZSBzZXRBdHRyaWJ1dGUKLQkJLy8gY2FsbHMgYWJvdmUgd2l0aCBhIHNpbmdsZSBzZXRBdHRyaWJ1dGVzIGNhbGwuCi0JCWJvb2xlYW4gb2Zmc2V0U2V0ID0gKChvZmZzZXQgIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSAmJiAobGVuZ3RoICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkpOwotCQlpbnQgc2l6ZSA9IChvZmZzZXRTZXQpID8gMTAgOiA4OyAvLyBhZGQgQ0hBUl9TVEFSVCwgQ0hBUl9FTkQgb25seSBpZiB0aGUgb2Zmc2V0IGlzIHNldC4gSWYKLQkJLy8gdGhlIG9mZnNldCBpcyBzZXQsIGl0IHRha2VzIHByZWNlbmRlbmNlIG92ZXIgdGhlIGxpbmUKLQkJLy8gbnVtYmVyLiAoZWNsaXBzZSdzIHJ1bGUsIG5vdCBtaW5lLikKLQkJU3RyaW5nW10gYXR0cmliTmFtZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlPYmplY3RbXSBhdHRyaWJWYWx1ZXMgPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vIFZlcnkgZmlyc3QgdGhpbmcsIGFkZCB0aGUgb3duZXIuIFRoYXQgd2F5LCBpZiB0aGUgY29kZSBkaWVzCi0JCS8vIGJlZm9yZSB0aGluZ3MgYXJlIHBlcnNpc3RlZCwgaG9wZWZ1bGx5IHRoaXMgbWFya2VyIHdpbGwgYmUgcGVyc2lzdGVkLgotCQkvLyBIb3BlZnVsbHksIGVjbGlwc2UgV0lMTCBwZXJzaXN0IHRoaXMgZmllbGQsIGFzIHJlcXVlc3RlZC4KLQkJYXR0cmliTmFtZXNbMF0gPSBWQUxJREFUSU9OX01BUktFUl9PV05FUjsKLQkJYXR0cmliVmFsdWVzWzBdID0gcGx1Z2luSWQ7Ci0JCWF0dHJpYk5hbWVzWzFdID0gVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFk7IC8vIHRoaXMgdmFsaWRhdGlvbiBzZXZlcml0eSBpcyBzdG9yZWQsIGluCi0JCS8vIGFkZGl0aW9uIHRvIHRoZSBtYXJrZXIgc2V2ZXJpdHksIHRvIGVuYWJsZQotCQkvLyBtb3JlIHRoYW4gb25lIHNldmVyaXR5IG9mIG1lc3NhZ2UgdG8gYmUKLQkJLy8gZGlzcGxheWVkLiBlLmcuIEVSUk9SIHwgV0FSTklORyAodXNpbmcKLQkJLy8gYmluYXJ5IE9SKS4gVGhlIElNYXJrZXIgY29uc3RhbnRzIGFyZQotCQkvLyByZWd1bGFyIGRlY2ltYWwgY29uc3RhbnRzLgotCQlhdHRyaWJWYWx1ZXNbMV0gPSBuZXcgSW50ZWdlcihtYXJrZXJUeXBlKTsKLQkJYXR0cmliTmFtZXNbMl0gPSBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1Q7IC8vIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWVzc2FnZXMgd2hpY2gKLQkJLy8gYXJlIHJlZ2lzdGVyZWQgb24gYW4gSVJlc291cmNlLCBidXQKLQkJLy8gYWdhaW5zdCBkaWZmZXJlbnQgdGFyZ2V0IG9iamVjdHMKLQkJYXR0cmliVmFsdWVzWzJdID0gKCh0YXJnZXRPYmplY3ROYW1lID09IG51bGwpID8gIiIgOiB0YXJnZXRPYmplY3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1szXSA9IFZBTElEQVRJT05fTUFSS0VSX0dST1VQOwotCQlhdHRyaWJWYWx1ZXNbM10gPSAoKGdyb3VwTmFtZSA9PSBudWxsKSA/ICIiIDogZ3JvdXBOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1s0XSA9IElNYXJrZXIuTUVTU0FHRTsKLQkJYXR0cmliVmFsdWVzWzRdID0gbWVzc2FnZTsKLQkJYXR0cmliTmFtZXNbNV0gPSBWQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQ7Ci0JCWF0dHJpYlZhbHVlc1s1XSA9IG1lc3NhZ2VJZDsKLQotCQlhdHRyaWJOYW1lc1s2XSA9IElNYXJrZXIuU0VWRVJJVFk7IC8vIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywKLQkJLy8gSU1hcmtlci5TRVZFUklUWV9JTkZPCi0JCWF0dHJpYlZhbHVlc1s2XSA9IG5ldyBJbnRlZ2VyKHNldmVyaXR5KTsKLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBsb2NhdGlvbiBpcyBhIGxpbmUgbnVtYmVyLCBzdG9yZSBpdCBhcyBhIGxpbmUgbnVtYmVyCi0JCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YobG9jYXRpb24pOwotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxJTkVfTlVNQkVSOwotCQkJYXR0cmliVmFsdWVzWzddID0gbGluZU51bWJlcjsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gT3RoZXJ3aXNlLCBzdG9yZSBpdCBhcyBhIHRleHQgbG9jYXRpb24KLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MT0NBVElPTjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxvY2F0aW9uOwotCQl9Ci0KLQkJaWYgKG9mZnNldFNldCkgewotCQkJYXR0cmliTmFtZXNbOF0gPSBJTWFya2VyLkNIQVJfU1RBUlQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOF0gPSBuZXcgSW50ZWdlcihvZmZzZXQpOwotCQkJYXR0cmliTmFtZXNbOV0gPSBJTWFya2VyLkNIQVJfRU5EOwotCQkJYXR0cmliVmFsdWVzWzldID0gbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKTsKLQkJfQotCi0JCWl0ZW0uc2V0QXR0cmlidXRlcyhhdHRyaWJOYW1lcywgYXR0cmliVmFsdWVzKTsKLQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWFya2VyIGFkZFRhc2soU3RyaW5nIHBsdWdpbklkLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpIHx8ICghcmVzb3VyY2UuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IGdldFNldmVyaXR5KG1hcmtlclR5cGUpOwotCi0JCS8vIEFsbG93IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSB0YXNrIGxpc3QuCi0JCS8vIFByaW9yIHRvIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbCByZW1vdmUgYWxsIG1lc3NhZ2VzIG93bmVkCi0JCS8vIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkJLy8gUHJpb3IgdG8gYW4gaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwgcmVtb3ZlIGFsbCBtZXNzYWdlcywKLQkJLy8gb24gZWFjaCBvZiB0aGUgY2hhbmdlZCByZXNvdXJjZXMsIG93bmVkIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcyBpbnZva2VkLgotCQkvLyAKLQkJLy8gSXQgaXMgdXAgdG8gdGhlIHZhbGlkYXRvciB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgYWRkaW5nIHRoZSBzYW1lIG1lc3NhZ2UKLQkJLy8gaW4gbW9yZSB0aGFuIG9uZSBwbGFjZSwgYW5kIGFsc28gdG8gY2xlYXIgb3V0IGFueSBvbGQgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCBjbGVhcmVkCi0JCS8vIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkJSU1hcmtlciBpdGVtID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKFZBTElEQVRJT05fTUFSS0VSKTsgLy8gYWRkIGEgdmFsaWRhdGlvbiBtYXJrZXIKLQotCQkvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVwbGFjZSB0aGUgbXVsdGlwbGUgc2V0QXR0cmlidXRlCi0JCS8vIGNhbGxzIGFib3ZlIHdpdGggYSBzaW5nbGUgc2V0QXR0cmlidXRlcyBjYWxsLgotCQlib29sZWFuIG9mZnNldFNldCA9ICgob2Zmc2V0ICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkgJiYgKGxlbmd0aCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpKTsKLQkJaW50IHNpemUgPSAob2Zmc2V0U2V0KSA/IDEwIDogODsgLy8gYWRkIENIQVJfU1RBUlQsIENIQVJfRU5EIG9ubHkgaWYgdGhlIG9mZnNldCBpcyBzZXQuIElmCi0JCS8vIHRoZSBvZmZzZXQgaXMgc2V0LCBpdCB0YWtlcyBwcmVjZW5kZW5jZSBvdmVyIHRoZSBsaW5lCi0JCS8vIG51bWJlci4gKGVjbGlwc2UncyBydWxlLCBub3QgbWluZS4pCi0JCVN0cmluZ1tdIGF0dHJpYk5hbWVzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJT2JqZWN0W10gYXR0cmliVmFsdWVzID0gbmV3IE9iamVjdFtzaXplXTsKLQotCQkvLyBWZXJ5IGZpcnN0IHRoaW5nLCBhZGQgdGhlIG93bmVyLiBUaGF0IHdheSwgaWYgdGhlIGNvZGUgZGllcwotCQkvLyBiZWZvcmUgdGhpbmdzIGFyZSBwZXJzaXN0ZWQsIGhvcGVmdWxseSB0aGlzIG1hcmtlciB3aWxsIGJlIHBlcnNpc3RlZC4KLQkJLy8gSG9wZWZ1bGx5LCBlY2xpcHNlIFdJTEwgcGVyc2lzdCB0aGlzIGZpZWxkLCBhcyByZXF1ZXN0ZWQuCi0JCWF0dHJpYk5hbWVzWzBdID0gVkFMSURBVElPTl9NQVJLRVJfT1dORVI7Ci0JCWF0dHJpYlZhbHVlc1swXSA9IHBsdWdpbklkOwotCQlhdHRyaWJOYW1lc1sxXSA9IFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZOyAvLyB0aGlzIHZhbGlkYXRpb24gc2V2ZXJpdHkgaXMgc3RvcmVkLCBpbgotCQkvLyBhZGRpdGlvbiB0byB0aGUgbWFya2VyIHNldmVyaXR5LCB0byBlbmFibGUKLQkJLy8gbW9yZSB0aGFuIG9uZSBzZXZlcml0eSBvZiBtZXNzYWdlIHRvIGJlCi0JCS8vIGRpc3BsYXllZC4gZS5nLiBFUlJPUiB8IFdBUk5JTkcgKHVzaW5nCi0JCS8vIGJpbmFyeSBPUikuIFRoZSBJTWFya2VyIGNvbnN0YW50cyBhcmUKLQkJLy8gcmVndWxhciBkZWNpbWFsIGNvbnN0YW50cy4KLQkJYXR0cmliVmFsdWVzWzFdID0gbmV3IEludGVnZXIobWFya2VyVHlwZSk7Ci0JCWF0dHJpYk5hbWVzWzJdID0gVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUOyAvLyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1lc3NhZ2VzIHdoaWNoCi0JCS8vIGFyZSByZWdpc3RlcmVkIG9uIGFuIElSZXNvdXJjZSwgYnV0Ci0JCS8vIGFnYWluc3QgZGlmZmVyZW50IHRhcmdldCBvYmplY3RzCi0JCWF0dHJpYlZhbHVlc1syXSA9ICgodGFyZ2V0T2JqZWN0TmFtZSA9PSBudWxsKSA/ICIiIDogdGFyZ2V0T2JqZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbM10gPSBWQUxJREFUSU9OX01BUktFUl9HUk9VUDsKLQkJYXR0cmliVmFsdWVzWzNdID0gKChncm91cE5hbWUgPT0gbnVsbCkgPyAiIiA6IGdyb3VwTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbNF0gPSBJTWFya2VyLk1FU1NBR0U7Ci0JCWF0dHJpYlZhbHVlc1s0XSA9IG1lc3NhZ2U7Ci0JCWF0dHJpYk5hbWVzWzVdID0gVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEOwotCQlhdHRyaWJWYWx1ZXNbNV0gPSBtZXNzYWdlSWQ7Ci0KLQkJYXR0cmliTmFtZXNbNl0gPSBJTWFya2VyLlNFVkVSSVRZOyAvLyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsCi0JCS8vIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCQlhdHRyaWJWYWx1ZXNbNl0gPSBuZXcgSW50ZWdlcihzZXZlcml0eSk7Ci0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgbG9jYXRpb24gaXMgYSBsaW5lIG51bWJlciwgc3RvcmUgaXQgYXMgYSBsaW5lIG51bWJlcgotCQkJSW50ZWdlciBsaW5lTnVtYmVyID0gSW50ZWdlci52YWx1ZU9mKGxvY2F0aW9uKTsKLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxpbmVOdW1iZXI7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIE90aGVyd2lzZSwgc3RvcmUgaXQgYXMgYSB0ZXh0IGxvY2F0aW9uCi0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTE9DQVRJT047Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsb2NhdGlvbjsKLQkJfQotCi0JCWlmIChvZmZzZXRTZXQpIHsKLQkJCWF0dHJpYk5hbWVzWzhdID0gSU1hcmtlci5DSEFSX1NUQVJUOwotCQkJYXR0cmliVmFsdWVzWzhdID0gbmV3IEludGVnZXIob2Zmc2V0KTsKLQkJCWF0dHJpYk5hbWVzWzldID0gSU1hcmtlci5DSEFSX0VORDsKLQkJCWF0dHJpYlZhbHVlc1s5XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCArIGxlbmd0aCk7Ci0JCX0KLQotCQlpdGVtLnNldEF0dHJpYnV0ZXMoYXR0cmliTmFtZXMsIGF0dHJpYlZhbHVlcyk7Ci0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gb25lIG9mIHRoZSBTZXZlcml0eUVudW0gc2V2ZXJpdGllcywgcmV0dXJuIHRoZSBJTWFya2VyIHNldmVyaXR5IGludCB0aGF0IGlzIGl0cwotCSAqIGVxdWl2YWxlbnQuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHVibGljIGZvciB0aGUgU2FiZXJSZXBvcnRlci4gTm8gb25lIG90aGVyIHRoYW4gVGFza0xpc3RVdGlsaXR5LCBvciB0aGUKLQkgKiBTYWJlclJlcG9ydGVyLCBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIQotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5RW51bVZhbHVlKSB7Ci0JCXN3aXRjaCAoc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJCWNhc2UgKElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5MT1dfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuQUxMX01FU1NBR0VTKSA6Ci0JCQljYXNlIChJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORykgOgotCQkJZGVmYXVsdCA6IHsKLQkJCQkvLyBhc3N1bWUgaXQncyBhIHdhcm5pbmcuCi0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXREZXB0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiBERVBUSF9JTkZJTklURTsgLy8gREVQVEhfSU5GSU5JVEUgbWVhbnMgZ2V0IHRoaXMgcHJvamVjdCdzIG1hcmtlcnMsIGFuZCB0aGUKLQkJCS8vIG1hcmtlcnMgYmVsb25naW5nIHRvIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJLy8gTmVlZGVkIGZvciB0aGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdoZW4gaXQgY2hlY2tzIGZvciBvcnBoYW4gdGFza3MuCi0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCBhbGwgb2YgdGhlIG1hcmtlcnMgaW4gdGhlIHdvcmtzcGFjZQotCQl9Ci0KLQkJcmV0dXJuIERFUFRIX1pFUk87IC8vIERFUFRIX1pFUk8gbWVhbnMganVzdCB0aGlzIHJlc291cmNlLCBub3QgaXRzIGNoaWxkcmVuCi0JfQotCi0JcHVibGljIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKGludCBzZXZlcml0eSwgSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgdGhpcyBwcm9qZWN0J3MgbWFya2VycywgYW5kIHRoZSBtYXJrZXJzCi0JCS8vIGJlbG9uZ2luZyB0byB0aGUgcHJvamVjdCdzIGNoaWxkcmVuLgotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIHNldmVyaXR5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgc2V2ZXJpdHksIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1hcmtlciBpcyBvd25lZCBieSB0aGUgb3duZXJJZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPd25lcihJTWFya2VyIG1hcmtlciwgU3RyaW5nIG93bmVySWQpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCS8vIFRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2lsbCByZW1vdmUgYW55ICJ1bm93bmVkIiB2YWxpZGF0aW9uIG1hcmtlcnMuCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gKChTdHJpbmcpIG93bmVyKS5lcXVhbHMob3duZXJJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5LCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIHRlbXBNYXJrZXJzID0gbnVsbDsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQl0cnkgewotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoVkFMSURBVElPTl9NQVJLRVIsIHRydWUsIGRlcHRoKTsgLy8gZmFsc2UgbWVhbnMKLQkJCQkvLyBvbmx5IGNvbnNpZGVyIFBST0JMRU1fTUFSS0VSLCBub3QgdmFyaWFudHMgb2YgUFJPQkxFTV9NQVJLRVIuCi0JCQkJLy8gU2luY2UgYWRkVGFzayBvbmx5IGFkZHMgUFJPQkxFTV9NQVJLRVIsIHdlIGRvbid0IG5lZWQKLQkJCQkvLyB0byBjb25zaWRlciBpdHMgc3VidHlwZXMuCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQotCQkJLy8gTm93IGZpbHRlciBpbiB0aGUgbWFya2VycywgYmFzZWQgb24gc2V2ZXJpdHkgdHlwZS4KLQkJCWlmIChhbGxNYXJrZXJzLmxlbmd0aCAhPSAwKSB7Ci0JCQkJdGVtcE1hcmtlcnMgPSBuZXcgSU1hcmtlclthbGxNYXJrZXJzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gYWxsTWFya2Vyc1tpXTsKLQkJCQkJSW50ZWdlciBmaWx0ZXJTZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZKTsKLQkJCQkJaWYgKGZpbHRlclNldmVyaXR5ID09IG51bGwpIHsKLQkJCQkJCS8vIG9kZC4uLm1hcmtlciB3YXNuJ3QgY3JlYXRlZCBjb3JyZWN0bHkuIEhvdyBjb3VsZCB0aGlzIGhhcHBlbj8KLQkJCQkJCS8vIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgc2V2ZXJpdHkgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBnZXRTZXZlcml0eShzZXZlcml0eSkpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKChzZXZlcml0eSAmIGZpbHRlclNldmVyaXR5LmludFZhbHVlKCkpID09IDApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRlbXBNYXJrZXJzW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gdmFsaWRNYXJrZXJzID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcE1hcmtlcnMsIDAsIHZhbGlkTWFya2VycywgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiB2YWxpZE1hcmtlcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcikgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBuZXcgU3RyaW5nW117bWVzc2FnZU93bmVyfSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXJzKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG1lc3NhZ2VPd25lcnMsIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lcnMsIGludCBkZXB0aCkgewotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB0ZW1wID0gbmV3IElNYXJrZXJbbWFya2Vycy5sZW5ndGhdOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCi0JCQl0cnkgewotCQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJCWlmICgob3duZXIgPT0gbnVsbCkgfHwgIShvd25lciBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJLy8gVGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aWxsIHJlbW92ZSBhbnkgInVub3duZWQiIHZhbGlkYXRpb24gbWFya2Vycy4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXNzYWdlT3duZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlT3duZXIgPSBtZXNzYWdlT3duZXJzW2pdOwotCQkJCQlpZiAoKChTdHJpbmcpIG93bmVyKS5lcXVhbHMobWVzc2FnZU93bmVyKSkgewotCQkJCQkJdGVtcFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQkJfQotCi0JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgdmFsaWRhdGlvbiB0YXNrcyBmcm9tIHRoZSByZXNvdXJjZS4gSWYgZGVwdGggaXMgSU5GSU5JVEUsIGNoaWxkCi0JICogdGFza3MgYXJlIHJldHVybmVkIGFzIHdlbGwuIE9ubHkgdGhlIHRhc2tzIHdoaWNoIGFyZSBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VPd25lciwgYW5kCi0JICogYXBwbHkgdG8gdGhlIG5hbWVkIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCAob2JqZWN0TmFtZSkgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZU93bmVyID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCUlNYXJrZXJbXSB2YWxpZExpc3QgPSBudWxsOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVyLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzICE9IG51bGwpIHsKLQkJCXZhbGlkTGlzdCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJCS8vIElmIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSByZXNvdXJjZSwgcmVtb3Zpbmcgb25lCi0JCQkJLy8gdGFyZ2V0J3MKLQkJCQkvLyBtZXNzYWdlcyBzaG91bGQgbm90IHJlbW92ZSB0aGUgb3RoZXIgdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotCQkJCWlmIChvYmplY3ROYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IHRhcmdldE9iamVjdCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCQkJaWYgKCh0YXJnZXRPYmplY3QgPT0gbnVsbCkgfHwgISh0YXJnZXRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8ICEoKChTdHJpbmcpIHRhcmdldE9iamVjdCkuZXF1YWxzKG9iamVjdE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZ3JvdXBOYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGdyb3VwID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9HUk9VUCk7Ci0JCQkJCWlmICgoZ3JvdXAgPT0gbnVsbCkgfHwgIShncm91cCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgZ3JvdXApLmVxdWFscyhncm91cE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl2YWxpZExpc3RbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZhbGlkTGlzdCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIHRhc2tzIGZyb20gdGhlIHJlc291cmNlLiBJZiB0aGUgcmVzb3VyY2UgaXMgYW4gSVByb2plY3QsIGFsbCB0YXNrcwotCSAqIGFyZSBhbHNvIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdCdzIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXJzLCBudWxsKTsgLy8gbnVsbCBtZWFucyByZW1vdmUgbWVzc2FnZXMgZnJvbSBhbGwgdGFyZ2V0Ci0JCS8vIG9iamVjdHMKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBuZXcgU3RyaW5nW117b3duZXJ9LCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgbnVsbCwgZGVwdGgpOyAvLyBudWxsIG1lYW5zIG5vIGdyb3VwIG5hbWUKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZCB0YXNrcy4gRXZlcnkgdGFzawotCSAqIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwgd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVUYXNrU3Vic2V0KHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZCB0YXNrcy4gRXZlcnkgdGFzawotCSAqIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwgd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgob3duZXJzID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSU1hcmtlcltdIGFsbFRhc2tzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZGVwdGgpOwotCQlpZiAoYWxsVGFza3MubGVuZ3RoID4gMCkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMoYWxsVGFza3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgd2hpY2ggYXJlIG93bmVkIGJ5ICJmcm9tIiB0byBtYWtlIHRoZWlyIG93bmVyICJ0byIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU93bmVyKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdXBkYXRlT3duZXIoZnJvbSwgdG8sIGdldFJvb3QoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgb24gdGhlIElSZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLiBBbGwgbWFya2VycwotCSAqIG93bmVkIGJ5ICJmcm9tIiBoYXZlIHRoZWlyIG93bmVyIHJlYXNzaWduZWQgdG8gInRvIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3duZXIoU3RyaW5nIGZyb20sIFN0cmluZyB0bywgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBvd25lZE1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIGZyb20pOwotCQlpZiAob3duZWRNYXJrZXJzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3duZWRNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG93bmVkTWFya2Vyc1tpXTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIsIHRvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVlRocmVhZE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVlRocmVhZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiZDk0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZUaHJlYWRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyAocXVldWUsIGludm9rZSwgZXRjLikgdGhlIFJ1bm5hYmxlcyB0aGF0IHBlcmZvcm0gdGhlIHZhbGlkYXRpb24gZm9yIGEKLSAqIHBhcnRpY3VsYXIgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVlRocmVhZE1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIFZUaHJlYWRNYW5hZ2VyIF9tYW5hZ2VyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTV9PRl9SRVNUQVJUID0gNTsgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHRocmVhZAotCS8vIHNob3VsZCBhdHRlbXB0IHRvIGlnbm9yZSBhIFRocm93YWJsZSBhbmQKLQkvLyBjYXJyeSBvbgotCi0JcHJpdmF0ZSBUaHJlYWQgX3ZhbGlkYXRpb25UaHJlYWQgPSBudWxsOyAvLyBUaGlzIHRocmVhZCBjaGVja3MgaWYgdGhlIGN1cnJlbnQgUnVubmFibGUgaXMKLQkvLyBmaW5pc2hlZCwgYW5kIGlmIHNvLCBsb2FkcyB0aGUgZmlyc3QgUnVubmFibGUgb2ZmIG9mCi0JLy8gdGhlIHF1ZXVlIGFuZCBzdGFydHMgaXQuCi0Jdm9sYXRpbGUgaW50IHJlc3RhcnQgPSAwOyAvLyBob3cgbWFueSB0aW1lcyBoYXMgdGhlIHRocmVhZCBiZWVuIHJlc3RhcnRlZD8KLQl2b2xhdGlsZSBKb2JzIF9qb2JzID0gbnVsbDsKLQotCXByaXZhdGUgVlRocmVhZE1hbmFnZXIoKSB7Ci0JCV9qb2JzID0gbmV3IEpvYnMoKTsKLQotCQkvLyBTdGFydCB0aGUgdmFsaWRhdGlvbiB0aHJlYWQgdG8gY2hlY2sgZm9yIHF1ZXVlZCBWYWxpZGF0aW9uT3BlcmF0aW9uCi0JCVJ1bm5hYmxlIHZhbGlkYXRpb25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKHJlc3RhcnQgPiBNQVhfTlVNX09GX1JFU1RBUlQpIHsKLQkJCQkJCQkvLyBzb21ldGhpbmcgaGFzIGdvbmUgc2VyaW91c2x5LCBzZXJpb3VzbHkgd3JvbmcKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJyZXN0YXJ0ID0gIiArIHJlc3RhcnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJCVJ1bm5hYmxlIGpvYiA9IGdldEpvYnMoKS5kZXF1ZXVlKCk7IC8vIElmIGN1cnJlbnRSdW5uYWJsZSBpcyBudWxsLCB0aGVyZSdzCi0JCQkJCQkvLyBub3RoaW5nIG9uIHRoZSBxdWV1ZS4gU2hvdWxkbid0Ci0JCQkJCQkvLyBoYXBwZW4gd2l0aCBhIHNlbWFwaG9yZS4KLQkJCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQkJCWdldEpvYnMoKS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCQkJCQkJam9iLnJ1bigpOwotCQkJCQkJCWdldEpvYnMoKS5zZXRBY3RpdmUoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJcmVzdGFydCsrOwotCQkJCQkJZ2V0Sm9icygpLnNldEFjdGl2ZShmYWxzZSk7Ci0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCS8vZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCV92YWxpZGF0aW9uVGhyZWFkID0gbmV3IFRocmVhZCh2YWxpZGF0aW9uUnVubmFibGUsICJWYWxpZGF0aW9uVGhyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQkJX3ZhbGlkYXRpb25UaHJlYWQuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZUaHJlYWRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChfbWFuYWdlciA9PSBudWxsKSB7Ci0JCQlfbWFuYWdlciA9IG5ldyBWVGhyZWFkTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfbWFuYWdlcjsKLQl9Ci0KLQlKb2JzIGdldEpvYnMoKSB7Ci0JCXJldHVybiBfam9iczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBxdWV1ZShSdW5uYWJsZSBydW5uYWJsZSkgewotCQlnZXRKb2JzKCkucXVldWUocnVubmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgUnVubmFibGVzIGhhdmUgYmVlbiBydW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotCQlyZXR1cm4gZ2V0Sm9icygpLmlzRG9uZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgSm9icyB7Ci0JCXByaXZhdGUgVmVjdG9yPFJ1bm5hYmxlPiBfcXVldWVkSm9iczsgLy8gVGhlIHF1ZXVlZCBSdW5uYWJsZXMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4KLQkJcHJpdmF0ZSBib29sZWFuIF9pc0FjdGl2ZTsgLy8gSXMgYSBqb2IgYmVpbmcgcnVuIGluIHRoZSB2YWxpZGF0aW9uIHRocmVhZD8KLQotCQlwdWJsaWMgSm9icygpIHsKLQkJCV9xdWV1ZWRKb2JzID0gbmV3IFZlY3RvcjxSdW5uYWJsZT4oKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBxdWV1ZShSdW5uYWJsZSBydW5uYWJsZSkgewotCQkJLy8gSWYgdGhlcmUgaXMgYSB0aHJlYWQgcnVubmluZyBhbHJlYWR5LCB0aGVuIGl0IG11c3QgZmluaXNoIGJlZm9yZSBhbm90aGVyIHZhbGlkYXRpb24KLQkJCS8vIHRocmVhZCBpcyBsYXVuY2hlZCwgb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMgY291bGQgcmVmbGVjdCB0aGUgbGFzdCB0aHJlYWQKLQkJCS8vIGZpbmlzaGVkLAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgbGFzdCBzdGF0ZSBvZiBjaGFuZ2VzLgotCi0JCQkvLyBIYXZlIHRvIHdhaXQgZm9yIHRoZSBjdXJyZW50IFJ1bm5hYmxlIHRvIGZpbmlzaCwgc28gYWRkIHRoaXMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUKLQkJCV9xdWV1ZWRKb2JzLmFkZChydW5uYWJsZSk7Ci0JCQlub3RpZnlBbGwoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQb3AgdGhlIFJ1bm5hYmxlIG9mZiBvZiB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCi0JCSAqLwotCQlzeW5jaHJvbml6ZWQgUnVubmFibGUgZGVxdWV1ZSgpIHsKLQkJCXdoaWxlIChfcXVldWVkSm9icy5zaXplKCkgPT0gMCkgewotCQkJCXRyeSB7Ci0JCQkJCXdhaXQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9IC8vIEJsb2NrIG9uIHRoZSBzZW1hcGhvcmU7IGJyZWFrIHdoZW4gYSBqb2IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHF1ZXVlLgotCi0JCQlSdW5uYWJsZSBqb2IgPSBudWxsOwotCQkJaWYgKF9xdWV1ZWRKb2JzLnNpemUoKSA+IDApIHsKLQkJCQlqb2IgPSBfcXVldWVkSm9icy5nZXQoMCk7Ci0JCQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkJCV9xdWV1ZWRKb2JzLnJlbW92ZSgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gam9iOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQWN0aXZlKCkgewotCQkJcmV0dXJuIF9pc0FjdGl2ZTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmUoYm9vbGVhbiBhY3RpdmUpIHsKLQkJCV9pc0FjdGl2ZSA9IGFjdGl2ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIFJ1bm5hYmxlcyBoYXZlIGJlZW4gcnVuLgotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRG9uZSgpIHsKLQkJCXJldHVybiAoKF9xdWV1ZWRKb2JzLnNpemUoKSA9PSAwKSAmJiAhaXNBY3RpdmUoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGE4YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHVzZXIncyBwcmVmZXJlbmNlIG9yIHByb2plY3Qgc2V0dGluZ3MuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcG9wdWxhdGVkIGZyb20gdGhlIG11bHRpcGxlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGlzIGtlcHQgYXMgYSBzZXNzaW9uCi0gKiBwcm9wZXJ0eSB3aGlsZSB0aGUgcmVzb3VyY2UgaXMgb3Blbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgSVJlc291cmNlIAlfcmVzb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIAlkaXNhYmxlQWxsVmFsaWRhdGlvbiA9IGdldERpc2FibGVBbGxWYWxpZGF0aW9uKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgCQlfdmVyc2lvbjsKLQkKLQkvKioKLQkgKiBNYXAgb2YgYWxsIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCBvciBpbnN0YWxsZWQgZ2xvYmFsbHkuIFRoZSB2YWx1ZSBvZiB0cnVlCi0JICogbWVhbnMgdGhhdCB0aGUgVk1EIGlzIGVuYWJsZWQsIGFuZCBhIHZhbHVlIG9mIGZhbHNlIG1lYW5zIHRoYXQgdGhlIFZNRCBpcyBkaXNhYmxlZC4KLQkgKi8KLQlwcml2YXRlIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4JCV92YWxpZGF0b3JzOwotCXByb3RlY3RlZCBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IAltYW51YWxWYWxpZGF0b3JzOwotCXByb3RlY3RlZCBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IAlidWlsZFZhbGlkYXRvcnM7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBVU0VSX1BSRUZFUkVOQ0UgCQk9ICJVU0VSX1BSRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBVU0VSX01BTlVBTF9QUkVGRVJFTkNFID0gIlVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBVU0VSX0JVSUxEX1BSRUZFUkVOQ0UgCT0gIlVTRVJfQlVJTERfUFJFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIERFTEVHQVRFU19QUkVGRVJFTkNFIAk9ICJERUxFR0FURVNfUFJFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IGlzIHRoZSB0YXJnZXQgaWQsIHRoYXQgaXMgdGhlIGlkIG9mIHRoZSBwbGFjZSBob2xkZXIgdmFsaWRhdG9yLiBUaGUgdmFsdWUgaXMgdGhlIGlkIAotCSAqIG9mIHRoZSByZWFsIHZhbGlkYXRvci4gCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IF9kZWxlZ2F0ZXNCeVRhcmdldDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVmYXVsdFZhbHVlID0gImRlZmF1bHRfdmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmFibGVkRWxlbWVudHNBc1N0cmluZyhTZXQgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCgoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKFZhbGlkYXRvck1ldGFEYXRhW10gZWxlbWVudHMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBlbGVtZW50cykgewotCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50cyhTdHJpbmcgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiByZXN1bHQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudHMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGVsZW0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZWxlbSk7Ci0JCQlpZiAodm1kICE9IG51bGwpcmVzdWx0LmFkZCh2bWQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoU3RyaW5nIGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKXJldHVybiBudWxsOwotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGVsZW0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZWxlbSk7Ci0JCQlpZiAodm1kICE9IG51bGwpcmVzdWx0W2NvdW50KytdID0gdm1kOwotCQl9Ci0KLQkJaWYgKGNvdW50ICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdHJpbVJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdHJpbVJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHRyaW1SZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlfdmFsaWRhdG9ycyA9IG5ldyBIYXNoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPigpOwotCQlfZGVsZWdhdGVzQnlUYXJnZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oSVJlc291cmNlIHJlc291cmNlLCBWYWxpZGF0b3JNZXRhRGF0YVtdIHZhbGlkYXRvcnMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdGhpcygpOwotCi0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihudWxsLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX05VTExDUkVBVEUpKTsKLQkJfQotCi0JCXNldFJlc291cmNlKHJlc291cmNlKTsKLQkJc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCV9yZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZGlzYWJsZUFsbFZhbGlkYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oYm9vbGVhbiBhbGxWYWxpZGF0aW9uKSB7Ci0JCWRpc2FibGVBbGxWYWxpZGF0aW9uID0gYWxsVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcnModHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIElmICJpbmNyZW1lbnRhbCIgaXMgdHJ1ZSwgcmV0dXJuIHRoZSBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMuIElmICJpbmNyZW1lbnRhbCIgaXMKLQkgKiBmYWxzZSwgcmV0dXJuIHRoZSBlbmFibGVkIG5vbi1pbmNyZW1lbnRhbCB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoYm9vbGVhbiBpbmNyZW1lbnRhbCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoIWluY3JlbWVudGFsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiAiZnVsbEJ1aWxkIiBpcyB0cnVlLCByZXR1cm4gdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyB0aGF0IHN1cHBvcnQgZnVsbCBidWlsZHMuIElmCi0JICogImZ1bGxCdWlsZCIgaXMgZmFsc2UsIHJldHVybiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHRoYXQgZG8gbm90IHN1cHBvcnQgZnVsbCBidWlsZHMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbiBmdWxsQnVpbGQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGZ1bGxCdWlsZCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGJvb2xlYW4gZnVsbEJ1aWxkLCBib29sZWFuIG9ubHlSZWZlcmVuY2VkKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0KLQkJaW50IGNvdW50ID0gMDsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBudWxsOwotCQkgCi0JCWlmKCAhaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpICl7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbnVtYmVyT2ZWYWxpZGF0b3JzKCldOwotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkua2V5U2V0KCkpIHsKLQkJCQlCb29sZWFuIGJ2YWx1ZSA9IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5nZXQodm1kKTsKLQkJCQlpZiAoYnZhbHVlKSB7Ci0JCQkJCS8vIElmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZAotCQkJCQlpZiAodm1kID09IG51bGwpY29udGludWU7Ci0JCQkJCWlmICggdm1kLmlzQnVpbGRWYWxpZGF0aW9uKCkgKSB7Ci0JCQkJCQlpZiAoIW9ubHlSZWZlcmVuY2VkIHx8IHZtZC5pc0RlcGVuZGVudFZhbGlkYXRvcigpKQotCQkJCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJfQotCQllbHNlIHsKLQkJCSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMF07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHsKLQkJLy8gRmlyc3QsICJkaXNhYmxlIiBhbGwgdmFsaWRhdG9ycwotCQlNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IGFsbCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogYWxsLmtleVNldCgpKSB7Ci0JCQlhbGwucHV0KHZtZCwgQm9vbGVhbi5GQUxTRSk7Ci0JCX0KLQotCQkvLyBUaGVuIGVuYWJsZSBvbmx5IHRoZSB2YWxpZGF0b3JzIGluIHRoZSBhcnJheQotCQlpZiAoKHZtZHMgPT0gbnVsbCkgfHwgKHZtZHMubGVuZ3RoID09IDApKXJldHVybjsKLQkJCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdm1kcykgewotCQkJYWxsLnB1dCh2bWQsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gbWFudWFsRW5hYmxlZFZNRHMgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4odm1kcy5sZW5ndGgpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpbWFudWFsRW5hYmxlZFZNRHMuYWRkKHZtZCk7Ci0JCQotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IGdldFZhbGlkYXRvcnMoKSkgewotCQkJaWYobWFudWFsRW5hYmxlZFZNRHMuY29udGFpbnMoZGF0YSkpCi0JCQkJZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5UUlVFKTsKLQkJCWVsc2UKLQkJCQlnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLkZBTFNFKTsKLQkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2bWRzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IGdldFZhbGlkYXRvcnMoKSkgewotCQkJaWYodm1kcy5jb250YWlucyhkYXRhKSlnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLlRSVUUpOwotCQkJZWxzZSBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLkZBTFNFKTsJCQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGJ1aWxkRW5hYmxlZFZNRHMgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4odm1kcy5sZW5ndGgpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpYnVpbGRFbmFibGVkVk1Ecy5hZGQodm1kKTsKLQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIGRhdGEgOiBnZXRWYWxpZGF0b3JzKCkpIHsKLQkJCWlmKGJ1aWxkRW5hYmxlZFZNRHMuY29udGFpbnMoZGF0YSkpCi0JCQkJZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLlRSVUUpOwotCQkJZWxzZQotCQkJCWdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5GQUxTRSk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gZW5hYmxlZCBmb3IgYnVpbGQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdm1kcyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBidWlsZCB2YWxpZGF0aW9uLgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2bWRzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWZvcihWYWxpZGF0b3JNZXRhRGF0YSBkYXRhIDogZ2V0VmFsaWRhdG9ycygpKSB7Ci0JCQlpZih2bWRzLmNvbnRhaW5zKGRhdGEpKWdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5UUlVFKTsKLQkJCWVsc2UgZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLkZBTFNFKTsJCQkKLQkJfQotCX0KLQotCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3JzOwotCX0KLQkKLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldERpc2FibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcnMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBWYWxpZGF0b3JNZXRhRGF0YSAtIGlmIHZhbHVlIGlzIGZhbHNlLCByZXR1cm4gdGhlIGRpc2FibGVkIHZhbGlkYXRvcnM7IGlmCi0JICogdmFsdWUgaXMgdHJ1ZSwgcmV0dXJuIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvcnMoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbnVtYmVyT2ZWYWxpZGF0b3JzKCldOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdldFZhbGlkYXRvck1ldGFEYXRhKCkua2V5U2V0KCkpIHsKLQkJCUJvb2xlYW4gYnZhbHVlID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXQodm1kKTsKLQkJCWlmIChidmFsdWUuYm9vbGVhblZhbHVlKCkgPT0gdmFsdWUpIHsKLQkJCQl0ZW1wW2NvdW50KytdID0gdm1kOwotCQkJfQotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiBtYXAgPSBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpOwotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHNldCA9IGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkua2V5U2V0KCk7Ci0JCWlmICghc2V0LmlzRW1wdHkoKSkgewotCQkJTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IHNldCkgewotCQkJCUJvb2xlYW4gb2JqID0gbWFwLmdldChkYXRhKTsKLQkJCQlpZiAob2JqICE9IG51bGwgJiYgb2JqLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKLQkJCQkJZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMuYWRkKGRhdGEpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSkgZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIGdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQkKLQkKLQlwdWJsaWMgIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiBtYXAgPSBnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCk7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gc2V0ID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLmtleVNldCgpOwotCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkQnVpbGRWYWxpZGF0b3JzID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWlmICghc2V0LmlzRW1wdHkoKSkgewotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSBkYXRhIDogc2V0KSB7Ci0JCQkJQm9vbGVhbiBvYmogPSBtYXAuZ2V0KGRhdGEpOwotCQkJCWlmIChvYmogIT0gbnVsbCAmJiBvYmouYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJCQllbmFibGVkQnVpbGRWYWxpZGF0b3JzLmFkZChkYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGVuYWJsZWRCdWlsZFZhbGlkYXRvcnMudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbZW5hYmxlZEJ1aWxkVmFsaWRhdG9ycy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkICBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKSB7Ci0JCWlmKGJ1aWxkVmFsaWRhdG9ycyA9PSBudWxsKQotCQkJYnVpbGRWYWxpZGF0b3JzID0gbmV3IEhhc2hNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+KCk7Ci0JCXJldHVybiBidWlsZFZhbGlkYXRvcnM7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKSB7Ci0JCWlmKG1hbnVhbFZhbGlkYXRvcnMgPT0gbnVsbCltYW51YWxWYWxpZGF0b3JzID0gbmV3IEhhc2hNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+KCk7Ci0JCXJldHVybiBtYW51YWxWYWxpZGF0b3JzOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgZm9yIHRoaXMgcHJlZmVyZW5jZTsgZWl0aGVyIGV2ZXJ5IGluc3RhbGxlZCB2YWxpZGF0b3IKLQkgKiAoZ2xvYmFsKSBvciBldmVyeSB2YWxpZGF0b3IgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCAocHJvamVjdCkuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbnVtYmVyT2ZWYWxpZGF0b3JzKCldOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdldFZhbGlkYXRvck1ldGFEYXRhKCkua2V5U2V0KCkpIHsKLQkJCUJvb2xlYW4gYnZhbHVlID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXQodm1kKTsKLQkJCWlmIChidmFsdWUgJiYgdm1kLmlzSW5jcmVtZW50YWwoKSl0ZW1wW2NvdW50KytdID0gdm1kOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdmFsaWRhdG9ycyBmb3IgdGhpcyBwcmVmZXJlbmNlOyBlaXRoZXIgZXZlcnkgaW5zdGFsbGVkIHZhbGlkYXRvciAoZ2xvYmFsKSBvciBldmVyeQotCSAqIHZhbGlkYXRvciBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0IChwcm9qZWN0KS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvQXJyYXkoX3ZhbGlkYXRvcnMua2V5U2V0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlfdmFsaWRhdG9ycy5jbGVhcigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWlmICh2bWQgPT0gbnVsbCljb250aW51ZTsKLQkJCV92YWxpZGF0b3JzLnB1dCh2bWQsICh2bWQuaXNFbmFibGVkQnlEZWZhdWx0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKSk7Ci0JCX0KLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHREZWxlZ2F0ZXMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgX2RlbGVnYXRlc0J5VGFyZ2V0LmNsZWFyKCk7Ci0gICAgZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0gICAgICBpZiAodm1kID09IG51bGwpY29udGludWU7Ci0gICAgICAKLSAgICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdERlbGVnYXRlKHRhcmdldElEKTsKLSAgICAgIGlmIChkZWxlZ2F0ZUlEID09IG51bGwpY29udGludWU7Ci0gICAgICBfZGVsZWdhdGVzQnlUYXJnZXQucHV0KHRhcmdldElELCBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHREZWxlZ2F0ZSh0YXJnZXRJRCkpOwotICAgIH0KLSAgfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcHJvamVjdCBvciBpbnN0YWxsZWQgdmFsaWRhdG9ycyBpbgotCSAqIHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZlZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBfdmFsaWRhdG9ycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGludCBudW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycyhnZXRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9ycygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdm1kcykgewotCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpY291bnQrKzsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCBvciB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREaXNhYmxlZFZhbGlkYXRvcnMoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBub24tbnVsbC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChfdmVyc2lvbiA9PSBudWxsKWxvYWRWZXJzaW9uKCk7Ci0JCXJldHVybiBfdmVyc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQlfdmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwcmVmZXJlbmNlIGhhcyBiZWVuIG1pZ3JhdGVkOyBjaGFuZ2UgdGhlIHZlcnNpb24gdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrVmVyc2lvbkN1cnJlbnQoKSB7Ci0JCS8vIFRoZSB2ZXJzaW9uIHNob3VsZCBub3QgYmUgbWFya2VkIGN1cnJlbnQgdW50aWwgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZQotCQkvLyAoaS5lLiwgVmFsaWRhdGlvbk1pZ3JhdG9yIGhhcyBiZWVuIGludm9rZWQuKSBNaWdyYXRpbmcgdGhlIHVzZXIncyBjb25maWd1cmF0aW9uCi0JCS8vIGlzIG9ubHkgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIG1pZ3JhdGlvbi4KLQkJc2V0VmVyc2lvbihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNVUlJFTlRfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uQ3VycmVudCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZlcnNpb24oKS5lcXVhbHMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5DVVJSRU5UX1ZFUlNJT04pOwotCX0KLQotCS8vIElSZXNvdXJjZSBjb3VsZCBiZSBhbiBJUHJvamVjdCBvciBhbiBJV29ya3NwYWNlUm9vdAotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIG9uIHRoaXMgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodmFsaWRhdG9yQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlyZXR1cm4gaXNFbmFibGVkKHZtZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIG9uIHRoaXMgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh2bWQgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0KLQkJQm9vbGVhbiB2YWx1ZSA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0KHZtZCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogT25jZSBhbGwgb2YgdGhlIGZpZWxkcyBoYXZlIGJlZW4gdXBkYXRlZCBvbiB0aGlzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGluc3RhbmNlLCB0aGlzCi0JICogcHJlZmVyZW5jZSBzaG91bGQgYmUgc3RvcmVkIGJhY2sgb24gdGhlIElSZXNvdXJjZSBmb3IgbGF0ZXIgdXNlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAotCSAqIG1hbnVhbGx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmNlIHRoZSBmaWVsZHMgb2YgdGhpcyB0eXBlIGhhdmUgYmVlbiB1cGRhdGVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHBhc3NpdmF0ZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihudWxsLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX05VTExTQVZFKSk7Ci0JCQl9Ci0JCQlnZXRSZXNvdXJjZSgpLnNldFNlc3Npb25Qcm9wZXJ0eShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlVTRVJfUFJFRkVSRU5DRSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU0FWRSwgbmV3IFN0cmluZ1tde2dldFJlc291cmNlKCkuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIHZhbHVlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRUb0RlZmF1bHQoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBCb29sZWFuIGNvbnZlcnRUb0Jvb2xlYW4oYm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IHRydWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBjb252ZXJ0VG9JbnRlZ2VyKGludCB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnZlcnRUb0Jvb2xlYW4oU3RyaW5nIHZhbHVlKSB7Ci0JCUJvb2xlYW4gYiA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0JCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29udmVydFRvSW50KFN0cmluZyB2YWx1ZSkgewotCQlJbnRlZ2VyIHQgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotCQlyZXR1cm4gdC5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBjb252ZXJ0VG9BcnJheShDb2xsZWN0aW9uIGMpIHsKLQkJaW50IGxlbmd0aCA9IChjID09IG51bGwpID8gMCA6IGMuc2l6ZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID09IDApcmV0dXJuIHJlc3VsdDsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGMuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXN1bHRbY291bnQrK10gPSB2bWQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBjb252ZXJ0VG9BcnJheShPYmplY3RbXSBjKSB7Ci0JCWludCBsZW5ndGggPSAoYyA9PSBudWxsKSA/IDAgOiBjLmxlbmd0aDsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGVuZ3RoXTsKLQkJaWYgKGxlbmd0aCA9PSAwKXJldHVybiByZXN1bHQ7Ci0KLQkJU3lzdGVtLmFycmF5Y29weShjLCAwLCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcyBiZWZvcmUgdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlIGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJcHJlZi5zZXRWYWx1ZShVU0VSX1BSRUZFUkVOQ0UsIHNlcmlhbGl6ZSgpKTsKLQkJCQlwcmVmLnN0b3JlKG9zLCBVU0VSX1BSRUZFUkVOQ0UpOwotCQkJCXByZWYuc2V0VmFsdWUoVVNFUl9NQU5VQUxfUFJFRkVSRU5DRSwgc2VyaWFsaXplTWFudWFsU2V0dGluZygpKTsKLQkJCQlwcmVmLnN0b3JlKG9zLCBVU0VSX01BTlVBTF9QUkVGRVJFTkNFKTsKLQkJCQlwcmVmLnNldFZhbHVlKFVTRVJfQlVJTERfUFJFRkVSRU5DRSwgc2VyaWFsaXplQnVpbGRTZXR0aW5nKCkpOwotCQkJCXByZWYuc3RvcmUob3MsIFVTRVJfQlVJTERfUFJFRkVSRU5DRSk7Ci0JCQkJcHJlZi5zZXRWYWx1ZShERUxFR0FURVNfUFJFRkVSRU5DRSwgc2VyaWFsaXplRGVsZWdhdGVzU2V0dGluZygpKTsKLQkJCQlwcmVmLnN0b3JlKG9zLCBERUxFR0FURVNfUFJFRkVSRU5DRSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgYW5kIHN0b3JlIHRoZSB2ZXJzaW9uIG51bWJlciwgYnV0IG5vdGhpbmcgZWxzZS4gVGhlIHZlcnNpb24gaXNuJ3QgYSBwcmVmZXJlbmNlLCBidXQgaXQncwotCSAqIHN0b3JlZCBhbmQgbG9hZGVkIGFzIGlmIGl0IGlzLiBCZWNhdXNlIHRoZSBsb2FkIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgYmV0d2VlbiBhbiBJUHJvamVjdAotCSAqIGFuZCB0aGUgSVdvcmtzcGFjZVJvb3QsIGtlZXAgdGhlIGxvYWQgbWVjaGFuaXNtIGluc2lkZSB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24KLQkgKiBpbXBsZW1lbnRhdGlvbiwgYnV0IGluaXRpYWxpemUgb25seSB0aGUgbWluaW11bSBhdCBmaXJzdC4gQWZ0ZXIgdGhlIHByb2plY3QgaGFzIGJlZW4KLQkgKiBtaWdyYXRlZCwgbG9hZCB0aGUgb3RoZXIgZmllbGRzIChsb2FkaW5nIHRoZSBvdGhlciBmaWVsZHMgYmVmb3JlIHRoZSBtaWdyYXRpb24gbWF5IG92ZXJ3cml0ZQotCSAqIHRoZSB2YWx1ZXMgb2YgdGhvc2UgZmllbGRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBsb2FkVmVyc2lvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24obnVsbCwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19OVUxMUkVUUklFVkUpKTsKLQkJfQotCi0JCUlNYXJrZXJbXSBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCS8vIGVpdGhlciBhIG5ldyB3b3Jrc3BhY2Ugb3IgYWxyZWFkeSBtaWdyYXRlZDsgcHJvY2VlZCBhcyBub3JtYWwKLQkJCXZlcnNpb24gPSBsb2FkVmVyc2lvbihnZXRSZXNvdXJjZSgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIG1pZ3JhdGUKLQkJCXZlcnNpb24gPSBsb2FkVmVyc2lvbihtYXJrZXIpOwotCQl9Ci0JCXNldFZlcnNpb24odmVyc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBsb2FkVmVyc2lvbihJTWFya2VyW10gbWFya2VyKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgZ2V0VmFsdWUobWFya2VyWzBdLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKQlyZXR1cm4gQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9ONF8wMzsKLQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGxvYWRWZXJzaW9uKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgaW4gb25lIG9mIHR3byBzaXR1YXRpb25zOgotCQkJLy8gICAgMS4gVGhpcyBpcyBhIG5ldyB3b3Jrc3BhY2UgYW5kIG5vIHByZWZlcmVuY2VzIGV4aXN0LgotCQkJLy8gICAgMi4gVGhpcyBpcyBhIG1pZ3JhdGVkIHdvcmtzcGFjZSBhbmQgdGhlIG9sZCBwcmVmZXJlbmNlcyBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzCi0JCQkvLyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCi0JCQlTdHJpbmcgc3RvcmVkQ29uZmlndXJhdGlvbiA9IHJlc291cmNlLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0JCQlpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQkJdmVyc2lvbiA9IGdldFZlcnNpb25EZWZhdWx0KCk7Ci0JCQl9IGVsc2UgewotCQkJCWludCB2ZXJzaW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9OKTsKLQkJCQlpZiAodmVyc2lvbkluZGV4ICE9IC0xKQotCQkJCQl2ZXJzaW9uID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcodmVyc2lvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9OLmxlbmd0aCgpKTsKLQkJCX0KLQotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWZXJzaW9uRGVmYXVsdCgpOwotCQkJfQotCi0JCQlyZXR1cm4gdmVyc2lvbjsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde2dldFJlc291cmNlKCkuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcyB3aGVuIHRoZSBwcm9qZWN0IG9yIHdvcmtzcGFjZSBpcyBvcGVuZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbG9hZCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihudWxsLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX05VTExSRVRSSUVWRSkpOwotCQkJfQotCi0JCQlJTWFya2VyW10gbWFya2VyID0gZ2V0TWFya2VyKCk7Ci0JCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCQkvLyBlaXRoZXIgYSBuZXcgd29ya3NwYWNlIG9yIGFscmVhZHkgbWlncmF0ZWQ7IHByb2NlZWQgYXMgbm9ybWFsCi0JCQkJbG9hZFByZWZlcmVuY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbWlncmF0ZQotCQkJCWxvYWQobWFya2VyKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IChnZXRSZXNvdXJjZSgpID09IG51bGwpID8gIm51bGwiIDogZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Jlc291cmNlTmFtZX0pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSU1hcmtlciB0aGF0IHVzZWQgdG8gc3RvcmUgdGhlIHByZWZlcmVuY2UgaW5mb3JtYXRpb24sIGlmIHRoZSBtYXJrZXIgZXhpc3RzLiAoSWYKLQkgKiBpdCBkb2Vzbid0IGV4aXN0LCB0aGVuIGl0J3MgYWxyZWFkeSBiZWVuIG1pZ3JhdGVkLikKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSU1hcmtlcltdIGdldE1hcmtlcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9hZChJTWFya2VyW10gbWFya2VyKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyaWJOYW1lKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cmliTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgYXR0cmliTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGdldFZhbHVlKG1hcmtlciwgYXR0cmliTmFtZSk7Ci0JCWlmIChib29sID09IG51bGwpcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQotCQlyZXR1cm4gYm9vbC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFZhbHVlKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgYXR0cmliTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZ2V0VmFsdWUobWFya2VyLCBhdHRyaWJOYW1lKTsKLQkJaWYgKGludGVnZXIgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCi0JCXJldHVybiBpbnRlZ2VyLmludFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJpYk5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGdldFZhbHVlKG1hcmtlciwgYXR0cmliTmFtZSk7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCi0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFByZWZlcmVuY2UoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGluIG9uZSBvZiB0d28gc2l0dWF0aW9uczoKLQkJLy8gMS4gVGhpcyBpcyBhIG5ldyB3b3Jrc3BhY2UgYW5kIG5vIHByZWZlcmVuY2VzIGV4aXN0LgotCQkvLyAyLiBUaGlzIGlzIGEgbWlncmF0ZWQgd29ya3NwYWNlIGFuZCB0aGUgb2xkIHByZWZlcmVuY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMKLQkJLy8gcGVyc2lzdGVudCBwcm9wZXJ0aWVzLgotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZzICE9IG51bGwpIHsKLQkJCWRlc2VyaWFsaXplQWxsUHJlZnMocHJlZnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByZWZzCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplQWxsUHJlZnMoUHJlZmVyZW5jZXMgcHJlZnMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0b3JlZENvbmZpZyA9IHByZWZzLmdldFN0cmluZyhVU0VSX1BSRUZFUkVOQ0UpOwotCQlkZXNlcmlhbGl6ZShzdG9yZWRDb25maWcpOwotCQlTdHJpbmcgc3RvcmVkTWFudWFsQ29uZmlnID0gcHJlZnMuZ2V0U3RyaW5nKFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UpOwotCQlkZXNlcmlhbGl6ZU1hbnVhbChzdG9yZWRNYW51YWxDb25maWcpOwotCQlTdHJpbmcgc3RvcmVkQnVpbGRDb25maWcgPSBwcmVmcy5nZXRTdHJpbmcoVVNFUl9CVUlMRF9QUkVGRVJFTkNFKTsKLQkJZGVzZXJpYWxpemVCdWlsZChzdG9yZWRCdWlsZENvbmZpZyk7Ci0JCVN0cmluZyBzdG9yZWREZWxlZ2F0ZXNDb25maWd1cmF0aW9uID0gcHJlZnMuZ2V0U3RyaW5nKERFTEVHQVRFU19QUkVGRVJFTkNFKTsKLQkJZGVzZXJpYWxpemVEZWxlZ2F0ZXMoc3RvcmVkRGVsZWdhdGVzQ29uZmlndXJhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSAoUHJlZmVyZW5jZXMpIGV2ZW50LmdldFNvdXJjZSgpOwotCQlpZiAocHJlZnMgIT0gbnVsbCAmJiAhZXZlbnQuZ2V0T2xkVmFsdWUoKS5lcXVhbHMoZXZlbnQuZ2V0TmV3VmFsdWUoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJZGVzZXJpYWxpemVBbGxQcmVmcyhldmVudCk7Ci0JCQkJcGFzc2l2YXRlKCk7Ci0JCQkgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplQWxsUHJlZnMoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmcgc3RvcmVkQ29uZmlnID0gKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiggZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVVNFUl9QUkVGRVJFTkNFKSApewotCQkJZGVzZXJpYWxpemUoc3RvcmVkQ29uZmlnKTsKLQkJfWVsc2UgaWYoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVVNFUl9NQU5VQUxfUFJFRkVSRU5DRSkpewotCQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkQ29uZmlnKTsKLQkJfWVsc2UgaWYoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVVNFUl9CVUlMRF9QUkVGRVJFTkNFKSl7Ci0JCQlkZXNlcmlhbGl6ZUJ1aWxkKHN0b3JlZENvbmZpZyk7Ci0JCX1lbHNlIGlmKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKERFTEVHQVRFU19QUkVGRVJFTkNFKSl7Ci0JCQlkZXNlcmlhbGl6ZURlbGVnYXRlcyhzdG9yZWRDb25maWcpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplQnVpbGQoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID09IDAgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5lcXVhbHMoRGVmYXVsdFZhbHVlKSkgewotCQkJLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGJ1aWxkVmFsaWRhdGlvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9CVUlMRF9WQUxJREFUT1JTKTsKLQotCQlTdHJpbmcgbWFudWFsVmFsaWRhdGlvbiA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKGJ1aWxkVmFsaWRhdGlvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMubGVuZ3RoKCksc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShtYW51YWxWYWxpZGF0aW9uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemVNYW51YWwoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID09IDAgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5lcXVhbHMoRGVmYXVsdFZhbHVlKSkgewotCQkJLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG1hbnVhbFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfTUFOVUFMX1ZBTElEQVRPUlMpOwotCi0JCVN0cmluZyBtYW51YWxWYWxpZGF0aW9uID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcobWFudWFsVmFsaWRhdGlvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTLmxlbmd0aCgpLHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkpOwotCQlzZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KG1hbnVhbFZhbGlkYXRpb24pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXNlcmlhbGl6ZURlbGVnYXRlcyhTdHJpbmcgc3RvcmVkQ29uZmlndXJhdGlvbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0gICAgaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID09IDAgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5lcXVhbHMoRGVmYXVsdFZhbHVlKSkgewotCSAgICAvLyBBc3N1bWUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBoYXMgbmV2ZXIgYmVlbiBzZXQgKG5ldyB3b3Jrc3BhY2UpLgotCSAgICByZXNldFRvRGVmYXVsdCgpOwotCSAgICByZXR1cm47Ci0JICB9Ci0KLQkgIGludCBkZWxlZ2F0ZXNJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFX1ZBTElEQVRPUlMpOwotCi0JICBTdHJpbmcgZGVsZWdhdGVzID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoZGVsZWdhdGVzSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFX1ZBTElEQVRPUlMubGVuZ3RoKCksc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSk7Ci0KLQkgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbCkgewotCSAgICByZXR1cm47Ci0JICB9Ci0KLQkgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlbGVnYXRlcywgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCSAgICBTdHJpbmcgZGVsZWdhdGVDb25maWd1cmF0aW9uID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCSAgICBpbnQgc2VwYXJhdG9ySW5kZXggPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFU19TRVBBUkFUT1IpOwotCSAgICBTdHJpbmcgdGFyZ2V0SUQgPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KTsKLQkgICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7Ci0gICAgICBfZGVsZWdhdGVzQnlUYXJnZXQucHV0KHRhcmdldElELCBkZWxlZ2F0ZUlEKTsKLQkgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG8oVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdXApIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdXAuc2V0VmVyc2lvbihnZXRWZXJzaW9uKCkpOwotCQl1cC5zZXRSZXNvdXJjZShnZXRSZXNvdXJjZSgpKTsKLQkJdXAuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JzKCkpOwotCQl1cC5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkpOwotCQl1cC5zZXRFbmFibGVkVmFsaWRhdG9ycyhnZXRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJdXAuc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXVwLnNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLSAgICB1cC5zZXREZWxlZ2F0aW5nVmFsaWRhdG9ycyhnZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IGlzIHRoZSBpZCBvZiB0aGUgcGxhY2UgaG9sZGVyIHZhbGlkYXRvciwgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgaWQgb2YgdmFsaWRhdG9yCi0JICogdGhhdCB3aWxsIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uIAotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gX2RlbGVnYXRlc0J5VGFyZ2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdWYWxpZGF0b3JzKE1hcDxTdHJpbmcsIFN0cmluZz4gc291cmNlKQotCXsKLQkJLy8gSXQgaXMgc2FmZSB0byBjb3B5IHRoaXMgbWFwIGFzIGl0IGNvbnRhaW5zIG9ubHkgaW1tdXRhYmxlIHN0cmluZ3MuCi0JCV9kZWxlZ2F0ZXNCeVRhcmdldC5wdXRBbGwoc291cmNlKTsKLQl9Ci0KLSAgLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBoYXZlIG5vdCBjaGFuZ2VkIHNpbmNlIHRoaXMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gd2FzCi0JICogY29uc3RydWN0ZWQsIGZhbHNlIG90aGVyd2lzZS4gKFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBmb3IgdGhlIFByb3BlcnRpZXMgYW5kIFByZWZlcmVuY2UgcGFnZXM7Ci0JICogaWYgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBoYXNuJ3QgY2hhbmdlZCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgdGFzayBsaXN0OwotCSAqIHVwZGF0aW5nIHRoZSB0YXNrIGxpc3QgaXMgYSBjb3N0bHkgb3BlcmF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFbmFibGVkVmFsaWRhdG9yc0NoYW5nZWQoVmFsaWRhdG9yTWV0YURhdGFbXSBvbGRFbmFibGVkVm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0IGNoZWNrIHRoZSBvYnZpb3VzOiBpcyBldmVyeSBlbmFibGVkIHZhbGlkYXRvciBzdGlsbCBlbmFibGVkLCBhbmQgaXMKLQkJLy8gdGhlIG51bWJlciBvZiBlbmFibGVkIHZhbGlkYXRvcnMgdGhlIHNhbWUgYXMgaXQgd2FzIGJlZm9yZT8gSWYgbm90LCByZXR1cm4gdHJ1ZS4KLQkJaWYgKG9sZEVuYWJsZWRWbWQgPT0gbnVsbCkgewotCQkJLy8gU29tZXRoaW5nJ3MgZ29uZSB3cm9uZy4uLgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEVuYWJsZWRWbWQubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IG9sZEVuYWJsZWRWbWRbaV07Ci0JCQlpZiAoIWlzRW5hYmxlZCh2bWQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBFdmVyeXRoaW5nIHRoYXQgd2FzIGVuYWJsZWQgaXMgc3RpbGwgZW5hYmxlZDsgaGF2ZSBhbnkgYWRkaXRpb25hbAotCQkvLyB2YWxpZGF0b3JzIGJlZW4gZW5hYmxlZD8KLQkJaWYgKG51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKSAhPSBvbGRFbmFibGVkVm1kLmxlbmd0aCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgZGVsZWdhdGUgdmFsaWRhdG9ycy4KLSAgICogQHBhcmFtIG9sZERlbGVnYXRlcyBhIE1hcCB3aXRoIHRoZSBvbGQgZGVsZWdhdGVzIElEIGJ5IHRhcmdldCBJRC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZURlbGVnYXRlc0NoYW5nZWQoTWFwIG9sZERlbGVnYXRlcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIAotICAgIGlmIChvbGREZWxlZ2F0ZXMgPT0gbnVsbClyZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9sZERlbGVnYXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHRhcmdldElEID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgU3RyaW5nIG9sZERlbGVnYXRlSUQgPSAoU3RyaW5nKSBvbGREZWxlZ2F0ZXMuZ2V0KHRhcmdldElEKTsKLSAgICAgIFN0cmluZyBuZXdEZWxlZ2F0ZUlEID0gX2RlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJRCk7Ci0gICAgICAKLSAgICAgIGlmIChvbGREZWxlZ2F0ZUlEID09IG51bGwgfHwgbmV3RGVsZWdhdGVJRCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgICAKLSAgICAgIGlmICghbmV3RGVsZWdhdGVJRC5lcXVhbHMob2xkRGVsZWdhdGVJRCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChvbGREZWxlZ2F0ZXMuc2l6ZSgpICE9IF9kZWxlZ2F0ZXNCeVRhcmdldC5zaXplKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2VyaWFsaXplKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRElTQUJMRV9BTExfVkFMSURBVElPTl9TRVRUSU5HKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkpKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQlidWZmZXIuYXBwZW5kKGdldFZlcnNpb24oKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJpYWxpemVNYW51YWxTZXR0aW5nKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RW5hYmxlZEVsZW1lbnRzQXNTdHJpbmcoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc2VyaWFsaXplQnVpbGRTZXR0aW5nKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9CVUlMRF9WQUxJREFUT1JTKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRFbmFibGVkRWxlbWVudHNBc1N0cmluZyhnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcmlhbGl6ZURlbGVnYXRlc1NldHRpbmcoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVMRUdBVEVfVkFMSURBVE9SUyk7Ci0gICAgYnVmZmVyLmFwcGVuZChnZXREZWxlZ2F0ZXNBc1N0cmluZyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpKSk7Ci0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGEgU3RyaW5nIHdoaWNoIGNvbnRhaW5zIHBhaXJzIG9mIHRhcmdldElEPWRlbGVnYXRlSUQgc2VwYXJhdGVkIGJ5IGEgc2VtaWNvbG9uLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yTWV0YURhdGEgYSBNYXAgd2l0aCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgdmFsaWRhdG9ycy4KLSAgICogQHJldHVybiBhIFN0cmluZy4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldERlbGVnYXRlc0FzU3RyaW5nKE1hcCB2YWxpZGF0b3JNZXRhRGF0YSkgewotICAgIAotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB2YWxpZGF0b3JNZXRhRGF0YS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAKLSAgICAgIFZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgU3RyaW5nIHRhcmdldElEID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLSAgICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKHZtZCk7Ci0gICAgICAKLSAgICAgIGlmIChkZWxlZ2F0ZUlEID09IG51bGwpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdyaXRlIG91dCBwYWlycyB0YXJnZXRJRD1kZWxlZ2F0ZUlECi0KLSAgICAgIGJ1ZmZlci5hcHBlbmQodGFyZ2V0SUQpOwotICAgICAgYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFU19TRVBBUkFUT1IpOwotICAgICAgYnVmZmVyLmFwcGVuZChkZWxlZ2F0ZUlEKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBkZWxlZ2F0ZSdzIElEIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgY29uZmlndXJlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZm9yIAotICAgKiBhIGdpdmVuIGRlbGVnYXRpbmcgdmFsaWRhdG9yLiBUaGF0IGlzIGFuc3dlciB0aGUgaWQgb2YgdmFsaWRhdG9yIHRoYXQgaXMgZ29pbmcgdG8gZG8gdGhlIHJlYWwgd29yay4KLSAgICogCi0gICAqIEBwYXJhbSB2bWQgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgbWV0YSBkYXRhLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUsIG51bGwgaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWxlZ2F0ZVVuaXF1ZU5hbWUoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0gICAgU3RyaW5nIHRhcmdldElEID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsgICAgCi0gICAgcmV0dXJuIF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotICB9Ci0gIAotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlJ3MgSUQgb2YgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSBjb25maWd1cmVkIGluIHRoaXMgY29uZmlndXJhdGlvbiBmb3IgCi0gICAqIGEgZ2l2ZW4gZGVsZWdhdGluZyB2YWxpZGF0b3IuIFRoYXQgaXMgYW5zd2VyIHRoZSBpZCBvZiB2YWxpZGF0b3IgdGhhdCBpcyBnb2luZyB0byBkbyB0aGUgcmVhbCB3b3JrLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElkIHRoZSBpZCBvZiB0aGUgdGFyZ2V0IChvciBwbGFjZSBob2xkZXIpIHZhbGlkYXRvci4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlLCBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVsZWdhdGVGb3JUYXJnZXQoU3RyaW5nIHRhcmdldElkKXsKLQkgIHJldHVybiBfZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElkKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZWxlZ2F0ZSdzIElEIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgdG8gYmUgdXNlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQotICAgKiBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSB2bWQgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgbWV0YWRhdGEuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlEIGEgU3RyaW5nIHdpdGggdGhlIHVuaXF1ZSBuYW1lIChJRCkgb2YgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlVW5pcXVlTmFtZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyBkZWxlZ2F0ZUlEKSB7Ci0gICAgU3RyaW5nIHRhcmdldElEID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsgICAgCi0gICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0gIH0KLQotICAvKioKLQkgKiBEZXNlcmlhbGl6ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgdmVyc2lvbiBudW1iZXI7IHRoZSB2ZXJzaW9uIGlzIGRlc2VyaWFsaXplZCBmaXJzdCwgaW4gdGhlCi0JICogbG9hZFZlcnNpb24oKSBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID09IDAgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5lcXVhbHMoRGVmYXVsdFZhbHVlKSkgewotCQkJLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcpOwotCQlpbnQgdmVyc2lvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCWlmKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcubGVuZ3RoKCksdmVyc2lvbkluZGV4KTsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihCb29sZWFuLnZhbHVlT2YoZGlzYWJsZUFsbFZhbGlkYXRpb24pLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihmYWxzZSk7OwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNhYmxlVmFsaWRhdGlvbkRlZmF1bHQoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRElTQUJMRV9WQUxJREFUSU9OX1NFVFRJTkc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVGQVVMVF9FTkFCTEVEX1ZBTElEQVRPUlM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXNEZWZhdWx0KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUZBVUxUX01BWE5VTU1FU1NBR0VTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb25EZWZhdWx0KCkgewotCQkvLyBJZiB0aGUgdmVyc2lvbiBjYW4ndCBiZSByZXRyaWV2ZWQsIGFzc3VtZSB0aGF0IGl0J3MgYSBuZXcgd29ya3NwYWNlLiAoQSBudWxsIHZlcnNpb24KLQkJLy8gY291bGQgYWxzbyBtZWFuIGEgNC4wMyB3b3Jrc3BhY2UsIGJ1dCB0aGF0J3MgdGFrZW4gY2FyZSBvZiBpbiB0aGUgbG9hZChJTWFya2VyW10pCi0JCS8vIG1ldGhvZC4pCi0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNVUlJFTlRfVkVSU0lPTjsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbnVhbEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5nZXQodm1kKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLmdldCh2bWQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIGludCBudW1iZXJPZk1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKS5sZW5ndGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVNpbmdsZVZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5wdXQodm1kLCBCb29sZWFuLlRSVUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlU2luZ2xlVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLnB1dCh2bWQsIEJvb2xlYW4uRkFMU0UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbmFibGVTaW5nbGVNYW51YWxWYWxpZGF0b3IoVmFsaWRhdG9yTWV0YURhdGEgIHZtZCl7Ci0JCWdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KHZtZCwgQm9vbGVhbi5UUlVFKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZGlzYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQodm1kLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBlbmFibGVTaW5nbGVCdWlsZFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dCh2bWQsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRpc2FibGVTaW5nbGVCdWlsZFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dCh2bWQsIEJvb2xlYW4uRkFMU0UpOwotCX0KLQkKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IgZGVzY3JpcHRvciBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlIGNvbmZpZ3VyZWQgCi0gICAqIGZvciB0aGUgZ2l2ZW4gZGVsZWdhdGluZyB2YWxpZGF0b3IgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBjb25maWd1cmF0aW9uLiAKLSAgICogQHBhcmFtIHZtZCB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBtZXRhIGRhdGEuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gYSBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZ2V0RGVsZWdhdGVEZXNjcmlwdG9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgdGFyZ2V0SUQgPSB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKHZtZCk7Ci0gIAotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKHRhcmdldElELCBkZWxlZ2F0ZUlEKTsgCi0gICAgcmV0dXJuIGRlc2NyaXB0b3I7ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhMmVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5WYWxpZGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uRmFjdG9yeUltcGwgaW1wbGVtZW50cyBWYWxpZGF0aW9uRmFjdG9yeSB7Ci0Jc3RhdGljIFZhbGlkYXRpb25GYWN0b3J5IGluc3QgPSBudWxsOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoaW5zdCA9PSBudWxsKQotCQkJaW5zdCA9IG5ldyBWYWxpZGF0aW9uRmFjdG9yeUltcGwoKTsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9yVW5pcXVlSWQpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJcmV0dXJuIHJlYWRlci5nZXRWYWxpZGF0b3IodmFsaWRhdG9yVW5pcXVlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTk3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25UYWdOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JUnVsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGlzIGEgc2luZ2xldG9uIHdobyByZWFkcyB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGZvciBWYWxpZGF0b3IgZXh0ZW5zaW9ucy4KLSAqIFRoZSByZWFkIGlzIGRvbmUgb25jZSAoaW4gdGhlIGNvbnN0cnVjdG9yKSwgYW5kIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IGNhbGxpbmcKLSAqICJnZXRWYWxpZGF0b3JNZXRhRGF0YShTdHJpbmcpIiBvbiB0aGlzIGNsYXNzLiBUaGUgcmVhZCBpcyB0cmlnZ2VyZWQgYnkgYSBjYWxsIGZyb20KLSAqIFZhbGlkYXRvck1hbmFnZXIncyBsb2FkVmFsaWRhdG9yTWV0YURhdGEoSVByb2plY3QpIG1ldGhvZC4gVmFsaWRhdG9yTWFuYWdlciBkZWxlZ2F0ZXMgdGhlIGxvYWQKLSAqIGNhbGwgdG8gdGhpcyBjbGFzcywgYW5kIGlmIHRoaXMgY2xhc3MgaXMgbnVsbCwgdGhlIHNpbmdsZXRvbiBpcyBuZXcnZWQgdXAsIGFuZCB0aGUgcmVnaXN0cnkgaXMKLSAqIHJlYWQuCi0gKiAKLSAqIE5vIFZhbGlkYXRvciBzaG91bGQgbmVlZCB0byBrbm93IGFib3V0IHRoaXMgY2xhc3MuIFRoZSBvbmx5IGNsYXNzIHdoaWNoIHNob3VsZCBjYWxsCi0gKiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaXMgVmFsaWRhdG9yTWFuYWdlci4KLSAqIAotICogVGhlIFZhbGlkYXRvciBpdHNlbGYgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlICJpbml0aWFsaXplVmFsaWRhdG9yIiBtZXRob2QuCi0gKiAKLSAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS52YWxpZGF0b3IiIGlkPSJFSkJWYWxpZGF0b3IiIG5hbWU9IkVKQgotICogVmFsaWRhdG9yIj4gPHZhbGlkYXRvcj48cHJvamVjdE5hdHVyZSBpZD0iY29tLmlibS5ldG9vbHMuajJlZS5FSkJOYXR1cmUiIGluY2x1ZGU9ImZhbHNlIi8+Ci0gKiA8ZmlsdGVyIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlciA9ICJlamItamFyLnhtbCIvPiA8ZmlsdGVyCi0gKiBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiIG5hbWVGaWx0ZXIgPSAiKi5qYXZhIi8+IDxoZWxwZXIKLSAqIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuZWpiLndvcmtiZW5jaGltcGwuRUpCSGVscGVyIi8+IDxydW4KLSAqIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuZWpiLkVKQlZhbGlkYXRvciIgaW5jcmVtZW50YWw9ImZhbHNlIiBlbmFibGVkPSJmYWxzZSIKLSAqIHBhc3M9ImZhc3QsZnVsbCIgYXN5bmM9ImZhbHNlIi8+IDxhZ2dyZWdhdGVWYWxpZGF0b3IgY2xhc3M9Im15LmFnZ3JlZ2F0ZS5WYWxpZGF0b3JDbGFzcyIvPgotICogPG1pZ3JhdGU+PHZhbGlkYXRvciBmcm9tPSJvbGQuY2xhc3MubmFtZSIgdG89Im5ldy5jbGFzcy5uYW1lIi8+IDwvbWlncmF0ZT4gPC92YWxpZGF0b3I+Ci0gKiA8L2V4dGVuc2lvbj4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIFJlZ2lzdHJ5Q29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaW5zdDsKLQkKLQkvKiogbGlzdCBvZiBhbGwgdmFsaWRhdG9ycyByZWdpc3RlcmVkLCB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgVmFsaWRhdG9yTWV0YURhdGEsIGluZGV4ZWQgYnkgcHJvamVjdCBuYXR1cmUgaWQgKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsU2V0PFZhbGlkYXRvck1ldGFEYXRhPj4gX3ZhbGlkYXRvcnM7Ci0JCi0JLy8gbGlzdCBvZiBhbGwgdmFsaWRhdG9ycywgaW5kZXhlZCBieSB2YWxpZGF0b3IgY2xhc3MgbmFtZSwKLQkvLyB3aXRoIHRoZSB2YWxpZGF0b3IncyBWYWxpZGF0b3JNZXRhRGF0YSBhcyB0aGUgdmFsdWUuCi0JLy8gTmVlZGVkIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlciwgYmVjYXVzZSBzb21ldGltZXMgdGhlCi0JLy8gSVZhbGlkYXRvciBpcyBub3QgZW5vdWdoIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgZnJvbSB0aGUKLQkvLyB0YXNrIGxpc3QuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBWYWxpZGF0b3JNZXRhRGF0YT4gX2luZGV4ZWRWYWxpZGF0b3JzOyAKLQkKLQlwcml2YXRlIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9yczsKLQkKLQkvLyBTaW5jZSBJUHJvamVjdCdzIGNvbnRlbnRzIGFyZSBhbGwgaW5zdGFuY2VzIG9mIElSZXNvdXJjZSwgZXZlcnkgdHlwZSBmaWx0ZXIgZm9yIGEgdmFsaWRhdG9yCi0JLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBJUmVzb3VyY2UuIFRoaXMgYXBwbGllcyB0byBib3RoIHRoZSByZWJ1aWxkQ2FjaGUgcGFzcyBhbmQgdG8gdGhlCi0JLy8gdmFsaWRhdGlvbiBwYXNzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJUkVTT1VSQ0UgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fUFJPSkVDVCA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJCAvLyBUaGlzICdwcm9qZWN0IG5hdHVyZSBpZCcgaXMgdXNlZCBhcyBhIGtleSB0byBnZXQgdGhlIHZhbGlkYXRvcnMgd2hpY2ggY2FuIHJ1biBvbiBhIHByb2plY3QgdHlwZSB3aGljaCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IGZpbHRlcmVkIGluIG9yIG91dCBieSBhbnkgdmFsaWRhdG9yLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFRF9QUk9KRUNUID0gIkVYQ0xVREVEIjsgLy8kTk9OLU5MUy0xJCAvLyBUaGlzICdwcm9qZWN0IG5hdHVyZSBpZCcgaXMgdXNlZCBhcyBhIGtleSB0byBnZXQgdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGV4Y2x1ZGVkIG9uIGNlcnRhaW4gcHJvamVjdHMuCi0JCi0JcHVibGljIEhhc2hNYXA8SVByb2plY3QsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4+IHByb2plY3RWYWxpZGF0aW9uTWV0YURhdGE7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0cnkgaXMgcmVhZCBvbmNlIC0gd2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQotCQl0cnkgewotCQkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU2V0PFZhbGlkYXRvck1ldGFEYXRhPj4oKTsKLQkJCV9pbmRleGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCQlfZGVmYXVsdEVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0KLQkJCS8vIFJlYWQgdGhlIHJlZ2lzdHJ5IGFuZCBidWlsZCBhIG1hcCBvZiB2YWxpZGF0b3JzLiBUaGUga2V5IGludG8KLQkJCS8vIHRoZSBtYXAgaXMgdGhlIElWYWxpZGF0b3IgaW5zdGFuY2UgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgVmFsaWRhdG9yTWV0YURhdGEKLQkJCS8vIHdoaWNoIGRlc2NyaWJlcyB0aGUgSVZhbGlkYXRvci4KLQkJCXJlYWRSZWdpc3RyeSgpOwotCi0JCQkvLyBPbmNlIGFsbCBvZiB0aGUgdmFsaWRhdG9ycyBoYXZlIGJlZW4gcmVhZCwgdGhlIGNhY2hlcyBvZiB0aGUKLQkJCS8vIHZhbGlkYXRvcnMgbmVlZCB0byBiZSB1cGRhdGVkLgotCQkJYnVpbGRDYWNoZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmF2ZXJzZSBvdmVyIHRoZSBsaXN0IG9mIFZNRHMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIGFuZCBjcmVhdGUgY29waWVzIG9mIGl0LiBUaGUgY29waWVzIGFyZQotCSAqIGNyZWF0ZWQgdG8gaW5jcmVhc2UgcnVudGltZSBwZXJmb3JtYW5jZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRDYWNoZSgpIHsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBfaW5kZXhlZFZhbGlkYXRvcnMudmFsdWVzKCkpIHsKLQkJCWJ1aWxkUHJvamVjdE5hdHVyZUNhY2hlKHZtZCk7Ci0JCQlidWlsZERlZmF1bHRFbmFibGVkQ2FjaGUodm1kKTsKLQkJfQotCi0JCS8vIE5vdyBhZGQgdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGNvbmZpZ3VyZWQgb24gYWxsIHByb2plY3RzLAotCQkvLyBhbmQgYWxsIHByb2plY3RzIGJ1dCBYLgotCQlhZGRSZW1haW5kZXIoKTsKLQotCQkvLyB0aGlzIHRlbXBvcmFyeSBsaXN0IGlzbid0IG5lZWRlZCBhbnkgbW9yZS4gQWxsIG9mIHRoZSBleGNsdWRlZAotCQkvLyBwcm9qZWN0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHByb2plY3QgbmF0dXJlcyB3aGljaCB0aGV5IGRvbid0IGV4Y2x1ZGUuCi0JCV92YWxpZGF0b3JzLnJlbW92ZShFWENMVURFRF9QUk9KRUNUKTsKLQotCQlpZiAoVHJhY2luZy5pc1RyYWNlVjEoKSkgewotCQkJVHJhY2luZy5sb2coZGVidWcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgY2FjaGUgb2YgVk1EcyB3aGljaCBpcyBpbmRleGVkIGJ5IHByb2plY3QgbmF0dXJlIGlkcy4gSWYgdGhlIHZhbGlkYXRvciBpcwotCSAqIHJlZ2lzdGVyZWQgb24gYWxsIHByb2plY3QgdHlwZXMsIHRoZSB2bWQncyBwcm9qZWN0IG5hdHVyZSBmaWx0ZXJzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0TmF0dXJlQ2FjaGUoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCS8vIEJ1aWxkIHRoZSBjYWNoZSB3aXRoIHRoZSBpZGVudGlmaWVkIHByb2plY3QgbmF0dXJlcyBpbiB2YWxpZGF0b3JzJwotCQkvLyBleHRlbnNpb25zLgotCQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gcHJvak5hdHVyZUlkcyA9IHZtZC5nZXRQcm9qZWN0TmF0dXJlRmlsdGVycygpOwotCQlTdHJpbmdbXSBmYWNldEZpbHRlcnMgPSB2bWQuZ2V0RmFjZXRGaWx0ZXJzKCk7Ci0JCWlmIChwcm9qTmF0dXJlSWRzID09IG51bGwpIHsKLQkJCWlmIChmYWNldEZpbHRlcnMgPT0gbnVsbCAmJiB2bWQuZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpID09IG51bGwpIHsKLQkJCQlhZGQoVU5LTk9XTl9QUk9KRUNULCB2bWQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBub25lSW5jbHVkZWQgPSB0cnVlOyAvLyBhc3N1bWUgdGhhdCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHByb2plY3QKLQkJCS8vIG5hdHVyZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvak5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgcG4gPSBwcm9qTmF0dXJlSWRzW2ldOwotCQkJCWlmIChwbi5pc0luY2x1ZGUoKSkgewotCQkJCQlub25lSW5jbHVkZWQgPSBmYWxzZTsKLQkJCQkJYWRkKHBuLmdldE5hbWVGaWx0ZXIoKSwgdm1kKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChub25lSW5jbHVkZWQpIHsKLQkJCQkvLyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgRVhDTFVERUQgcHJvamVjdHMKLQkJCQkvLyAodGhhdCBpcywgYSB2YWxpZGF0b3Igd2hpY2ggZXhjbHVkZXMgcHJvamVjdCBuYXR1cmVzIGJ1dCBkb2Vzbid0Ci0JCQkJLy8gZXhwbGljaXRseSBpbmNsdWRlIGFueS4gVGhpcyB0eXBlIG9mIHZhbGlkYXRvciBydW5zIG9uIGFueSB1bnJlY29nbml6ZWQgKFVOS05PV04pCi0JCQkJLy8gcHJvamVjdHMsIGJ1dCB0aGUgcmVzdCBvZiB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYnVpbHQgYmVmb3JlIHRoaXMgaXMgYWRkZWQKLQkJCQkvLyB0byB0aGUgVU5LTk9XTiBsaXN0LiBTZWUgYWRkRXhjbHVkZWRSZW1haW5kZXIoKS4KLQkJCQlhZGQoRVhDTFVERURfUFJPSkVDVCwgdm1kKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHdoaWNoIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRGVmYXVsdEVuYWJsZWRDYWNoZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJaWYgKHZtZCA9PSBudWxsKXJldHVybjsKLQotCQlpZiAodm1kLmlzRW5hYmxlZEJ5RGVmYXVsdCgpKV9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHZtZCB0byB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBpbmRleGVkIGJ5IHZhbGlkYXRvciBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfaW5kZXhlZFZhbGlkYXRvcnMucHV0KHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIHZtZCk7Ci0JfQotCi0JLyoKLQkgKiBTb21lIHZhbGlkYXRvcnMgY2FuIHJ1biBvbiBhbnkgdHlwZSBvZiBwcm9qZWN0LiBJbiBvcmRlciB0byBoYXZlIGEgc3RhdGljIGxpc3QsIGFkZCB0aGUgImFueQotCSAqIHByb2plY3QiIHZhbGlkYXRvcnMgdG8gZWFjaCAicHJvamVjdCBuYXR1cmUiIHZhbGlkYXRvcnMnIGxpc3QuIFRoaXMgYXZvaWRzIGFkZGluZyB0aGUgImFueQotCSAqIHByb2plY3QiIHZhbGlkYXRvcnMgdG8gdGhlICJwcm9qZWN0IG5hdHVyZSIgdmFsaWRhdG9ycyBhdCBydW50aW1lLCB3aGljaCByZXN1bHRzIGluCi0JICogcGVyZm9ybWFuY2Ugc2F2aW5ncy4KLQkgKiAKLQkgKiBTb21lIHZhbGlkYXRvcnMgcnVuIG9uIGFueSB0eXBlIG9mIHByb2plY3QgYnV0IFgsIHdoZXJlIFggaXMgYW4gZXhjbHVkZWQgcHJvamVjdCBuYXR1cmUuCi0JICogVGhvc2UgdmFsaWRhdG9ycyBzaG91bGQgYWxzbyBiZSBhZGRlZCB2aWEgdGhpcyBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJlbWFpbmRlcigpIHsKLQkJLy8gRmlyc3QsIGFkZCBhbGwgImNhbi1ydW4tb24tYW55LXByb2plY3QtdHlwZSIgdG8gZXZlcnkgcmVnaXN0ZXJlZCBwcm9qZWN0IG5hdHVyZSB0eXBlIGluCi0JCS8vIHRoZSBjYWNoZS4KLQkJYWRkQW55UmVtYWluZGVyKCk7Ci0KLQkJLy8gVGhlbiBhZGQgdGhlICJjYW4tcnVuLW9uLWFueS1wcm9qZWN0LXR5cGUtYnV0LVgiIHRvIGV2ZXJ5IG5vbi1YIHJlZ2lzdGVyZWQgcHJvamVjdCBuYXR1cmUKLQkJLy8gdHlwZSBpbiB0aGUgY2FjaGUuCi0JCWFkZEV4Y2x1ZGVkUmVtYWluZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEV4Y2x1ZGVkUmVtYWluZGVyKCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGV4Y2x1ZGVkUHJvalZtZHMgPSBfdmFsaWRhdG9ycy5nZXQoRVhDTFVERURfUFJPSkVDVCk7Ci0JCWlmIChleGNsdWRlZFByb2pWbWRzID09IG51bGwpIHsKLQkJCS8vIG5vIGV4Y2x1ZGVkIHByb2plY3QgbmF0dXJlcwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBleGNsdWRlZFByb2pWbWRzKSB7Ci0KLQkJCS8vIGFzc3VtZSB0aGF0LCBieSBkZWZhdWx0LCBpZiBzb21lb25lIGV4cGxpY2l0bHkgZXhjbHVkZXMKLQkJCS8vIGEgcHJvamVjdCBuYXR1cmUgdGhlbiB0aGV5IGRvbid0IGluY2x1ZGUgYW55IHByb2plY3QgbmF0dXJlcwotCQkJYm9vbGVhbiBub25lSW5jbHVkZWQgPSB0cnVlOwotCQkJCi0JCQkvLyBhIHByb2plY3QgbmF0dXJlIHRoZW4gdGhleSBkb24ndCBpbmNsdWRlIGFueSBwcm9qZWN0IG5hdHVyZXMKLQkJCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQkJaWYgKHByb2pJZC5lcXVhbHMoVU5LTk9XTl9QUk9KRUNUKSB8fCBwcm9qSWQuZXF1YWxzKEVYQ0xVREVEX1BST0pFQ1QpKSB7Ci0JCQkJCS8vIERvbid0IGFkZCBsaXN0IHRvIGEgcHJvamVjdCBuYXR1cmUgd2hpY2ggaXMgZXhjbHVkZWQgb3IgYXBwbGljYWJsZSB0byBhbGwuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgZmlsdGVyID0gdm1kLmZpbmRQcm9qZWN0TmF0dXJlKHByb2pJZCk7Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCS8vIERvbid0IGFkZCBsaXN0IHRvIGl0c2VsZiAoZmlsdGVyLmlzSW5jbHVkZWQoKSA9PSB0cnVlKSBvcgotCQkJCQkvLyB0byBhIGxpc3QgZnJvbSB3aGljaCBpdCdzIGV4Y2x1ZGVkIChmaWx0ZXIuaXNJbmNsdWRlZCgpID09IGZhbHNlKQotCQkJCQlpZiAoZmlsdGVyLmlzSW5jbHVkZSgpKSB7Ci0JCQkJCQlub25lSW5jbHVkZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlhZGQocHJvaklkLCB2bWQpOwotCQkJfQotCi0JCQlpZiAobm9uZUluY2x1ZGVkKSB7Ci0JCQkJLy8gQXQgdGhpcyBwb2ludCwgdGhlICJjYW4tcnVuLW9uLWFueS1wcm9qZWN0IiBiZWNvbWVzCi0JCQkJLy8gIm5vdC1leGNsdWRlZC1vbi10aGVzZS1wcm9qZWN0cyIuIFRoYXQgaXMsIGlmIHRoZSBwcm9qZWN0Ci0JCQkJLy8gbmF0dXJlIGlkIGlzbid0IGluIHRoZSBsaXN0IG9mIF92YWxpZGF0b3JzLCB0aGVuIGl0IGlzbid0Ci0JCQkJLy8gaW5jbHVkZWQgb3IgZXhjbHVkZWQgYnkgYW55IHZhbGlkYXRvcnMsIHNvIGFsbCB2YWxpZGF0b3JzCi0JCQkJLy8gd2hpY2ggY2FuIHJ1biBvbiBhbnkgcHJvamVjdCBBTkQgYWxsIHZhbGlkYXRvcnMgd2hpY2ggY2FuCi0JCQkJLy8gcnVuIG9uIGFueSBidXQgY2VydGFpbiBleGNsdWRlZCBwcm9qZWN0cyBjYW4gcnVuIG9uIHRoZQotCQkJCS8vIGdpdmVuIElQcm9qZWN0LgotCQkJCWFkZChVTktOT1dOX1BST0pFQ1QsIHZtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQW55UmVtYWluZGVyKCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGFueVByb2pWbWRzID0gX3ZhbGlkYXRvcnMuZ2V0KFVOS05PV05fUFJPSkVDVCk7Ci0JCWlmIChhbnlQcm9qVm1kcyA9PSBudWxsKSB7Ci0JCQkvLyBubyB2YWxpZGF0b3JzIHJ1biBvbiBhbGwgcHJvamVjdHMKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQlpZiAocHJvaklkLmVxdWFscyhVTktOT1dOX1BST0pFQ1QpIHx8IHByb2pJZC5lcXVhbHMoRVhDTFVERURfUFJPSkVDVCkpIHsKLQkJCQkvLyBEb24ndCBhZGQgbGlzdCB0byBpdHNlbGYgb3IgdG8gYSBwcm9qZWN0IG5hdHVyZSB3aGljaCBpcyBleGNsdWRlZC4KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYWRkKHByb2pJZCwgYW55UHJvalZtZHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChTdHJpbmcgcHJvamVjdE5hdHVyZUlkLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZExpc3QpIHsKLQkJaWYgKCh2bWRMaXN0ID09IG51bGwpIHx8ICh2bWRMaXN0LnNpemUoKSA9PSAwKSlyZXR1cm47Ci0KLQkJLy8gd2hldGhlciB0aGUgdmFsaWRhdG9yIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIHRoaXMKLQkJLy8gcHJvamVjdCBuYXR1cmUgaWQsIG1ha2Ugc3VyZSB0aGF0IGFuIGVudHJ5IGlzIGNyZWF0ZWQgZm9yIGl0IGluIHRoZSB0YWJsZQotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHBuVmFsID0gY3JlYXRlU2V0KHByb2plY3ROYXR1cmVJZCk7IAotCQlwblZhbC5hZGRBbGwodm1kTGlzdCk7Ci0JCV92YWxpZGF0b3JzLnB1dChwcm9qZWN0TmF0dXJlSWQsIHBuVmFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBwcm9qZWN0TmF0dXJlSWQsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlpZiAodm1kID09IG51bGwpcmV0dXJuOwotCi0JCS8vIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpbmNsdWRlcyBvciBleGNsdWRlcyB0aGlzCi0JCS8vIHByb2plY3QgbmF0dXJlIGlkLCBtYWtlIHN1cmUgdGhhdCBhbiBlbnRyeSBpcyBjcmVhdGVkIGZvciBpdCBpbiB0aGUgdGFibGUKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBwblZhbCA9IGNyZWF0ZVNldChwcm9qZWN0TmF0dXJlSWQpOyAKLQkJcG5WYWwuYWRkKHZtZCk7Ci0JCV92YWxpZGF0b3JzLnB1dChwcm9qZWN0TmF0dXJlSWQsIHBuVmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGEgdmFsaWRhdG9yJ3MgY2xhc3Mgb3IgaGVscGVyIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQsIHRoZSB2bWQgY2FsbHMgdGhpcyBtZXRob2QgdG8KLQkgKiBkaXNhYmxlIHRoZSB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3Igd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcwotCSAqIHBhZ2UsIGFuZCBlbmFibGVkIGxpc3Qgb2YgYW55IHByb2plY3QgdGhlcmVhZnRlciB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX2luZGV4ZWRWYWxpZGF0b3JzLnJlbW92ZSh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycy5yZW1vdmUodm1kKTsKLQotCQkvLyBUaGUgd2hvbGUgIm9uLWFueS1wcm9qZWN0IiBhbmQgImV4Y2x1ZGUtdGhpcy1wcm9qZWN0LW5hdHVyZSIgd291bGQgdGFrZQotCQkvLyBhIGxvdCBvZiBwcm9jZXNzaW5nIHRpbWUuLi4gSW5zdGVhZCwgdHJhdmVyc2UgdGhlIGxpc3Qgb2YgcHJvaiBuYXR1cmUgaWRzLAotCQkvLyBhbmQgc2VhcmNoIHRoZSBTZXQgb2YgdGhhdCBwcm9qIG5hdHVyZSBpZCwgYW5kIHJlbW92ZSB0aGUgdm1kIGlmIGl0J3MgaW4gdGhlCi0JCS8vIFNldC4KLQkJZm9yIChTdHJpbmcgcHJvaklkIDogX3ZhbGlkYXRvcnMua2V5U2V0KCkpIHsKLQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsdWUgPSBfdmFsaWRhdG9ycy5nZXQocHJvaklkKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKWNvbnRpbnVlOwotCi0JCQlpZiAodmFsdWUuY29udGFpbnModm1kKSkgewotCQkJCXZhbHVlLnJlbW92ZSh2bWQpOwotCQkJCV92YWxpZGF0b3JzLnB1dChwcm9qSWQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBjcmVhdGVTZXQoU3RyaW5nIHByb2pOYXR1cmUpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2ID0gX3ZhbGlkYXRvcnMuZ2V0KHByb2pOYXR1cmUpOwotCQlpZiAodiA9PSBudWxsKSB7Ci0JCQl2ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBpZiBpdCBoYXMgYSBwcm9qZWN0IG5hdHVyZShzKSBzcGVjaWZpZWQsIHJldHVybiB0aGUKLQkgKiBWYWxpZGF0b3JOYW1lRmlsdGVycyB3aGljaCByZXByZXNlbnQgdGhvc2UgbmF0dXJlcy4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIEEgcHJvamVjdCBuYXR1cmUgY2FuIGJlIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIHRvIGluZGljYXRlIHdoYXQgdHlwZXMgb2YgSVByb2plY3RzIGEKLQkgKiB2YWxpZGF0b3IgY2FuIHJ1biBvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGdldEFnZ3JlZ2F0ZVZhbGlkYXRvcnNOYW1lcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmaWx0ZXJzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfQUdHUkVHQVRFX1ZBTElEQVRPUlMpOwotCQlpZiAoZmlsdGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tmaWx0ZXJzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIEluIG9yZGVyIHRvIHNwZWVkIHVwIG91ciBTdHJpbmcgY29tcGFyaXNvbnMsIGxvYWQgdGhlc2UKLQkJCS8vIG5hbWVzIGludG8gSmF2YSdzIGNvbnN0YW50cyBzcGFjZS4gVGhpcyB3YXksIHdlJ2xsIGJlIGFibGUgdG8KLQkJCS8vIHVzZSBwb2ludGVyIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgdHJhZGl0aW9uYWwKLQkJCS8vIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY29tcGFyaXNvbi4gU2luY2UgdGhlc2UgbmFtZXMgc2hvdWxkCi0JCQkvLyBuZXZlciBiZSBzZXQgYnkgYW55b25lIG90aGVyIHRoYW4gdGhpcyBjbGFzcywgYW5kIHRoaXMgY2xhc3MKLQkJCS8vIHNldHMgdGhlbSBvbmx5IG9uY2UsIGl0IGlzIHNhZmUgdG8gZGVjbGFyZSB0aGVzZSBTdHJpbmdzCi0JCQkvLyBjb25zdGFudHMuCi0JCQkvLwotCQkJLy8gVG8gbG9hZCBhIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UsIGNhbGwgaW50ZXJuKCkgb24gdGhlIFN0cmluZy4KLQkJCS8vCi0JCQlTdHJpbmcgbmFtZUZpbHRlciA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJbmFtZUZpbHRlciA9IG5hbWVGaWx0ZXIuaW50ZXJuKCk7Ci0JCQl9Ci0JCQluYW1lc1tpXSA9IG5hbWVGaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlQmluZGluZ3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBiaW5kaW5ncyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0NPTlRFTlRUWVBFKTsKLQkJaWYoYmluZGluZ3MubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gY1R5cGVJRHMgPSBuZXcgU3RyaW5nW2JpbmRpbmdzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpICsrKXsKLQkJCQotCQkJY1R5cGVJRHNbaV0gPSBiaW5kaW5nc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRUWVBFSUQpOwotCQl9Ci0JCQotCQlyZXR1cm4gY1R5cGVJRHM7Ci0JCQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIGlmIGl0IGhhcyBhbnkgZmlsdGVyIHRhZ3MsIGNvbnN0cnVjdCB0aGUKLQkgKiBhcHByb3ByaWF0ZSBWYWxpZGF0b3JGaWx0ZXJzIHRvIHJlcHJlc2VudCB0aG9zZSB0YWdzOyBlbHNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIEEgZmlsdGVyIGNhbiBiZSBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCB0byBmaWx0ZXIgb3V0IGNlcnRhaW4gcmVzb3VyY2VzLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yRmlsdGVyW10gZ2V0RmlsdGVycyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmaWx0ZXJzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfRklMVEVSKTsKLQkJaWYgKGZpbHRlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlWYWxpZGF0b3JGaWx0ZXJbXSB2ZiA9IG5ldyBWYWxpZGF0b3JGaWx0ZXJbZmlsdGVycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZmW2ldID0gbmV3IFZhbGlkYXRvckZpbHRlcihJUkVTT1VSQ0UpOwotCi0JCQkvLyBJbiBvcmRlciB0byBzcGVlZCB1cCBvdXIgU3RyaW5nIGNvbXBhcmlzb25zLCBsb2FkIHRoZXNlCi0JCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCQkvLyB1c2UgcG9pbnRlciBjb21wYXJpc29uIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsCi0JCQkvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNvbXBhcmlzb24uIFNpbmNlIHRoZXNlIG5hbWVzIHNob3VsZAotCQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCQkvLyBzZXRzIHRoZW0gb25seSBvbmNlLCBpdCBpcyBzYWZlIHRvIGRlY2xhcmUgdGhlc2UgU3RyaW5ncwotCQkJLy8gY29uc3RhbnRzLgotCQkJLy8KLQkJCS8vIFRvIGxvYWQgYSBTdHJpbmcgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLCBjYWxsIGludGVybigpIG9uIHRoZSBTdHJpbmcuCi0JCQkvLwotCQkJU3RyaW5nIG5hbWVGaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfTkFNRV9GSUxURVIpOwotCQkJaWYgKG5hbWVGaWx0ZXIgIT0gbnVsbCkgewotCQkJCW5hbWVGaWx0ZXIgPSBuYW1lRmlsdGVyLmludGVybigpOwotCQkJfQotCQkJU3RyaW5nIGlzQ2FzZVNlbnNpdGl2ZSA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9DQVNFX1NFTlNJVElWRSk7Ci0JCQl2ZltpXS5zZXROYW1lRmlsdGVyKG5hbWVGaWx0ZXIsIGlzQ2FzZVNlbnNpdGl2ZSk7Ci0KLQkJCVN0cmluZyBvYmplY3RDbGFzcyA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9PQkpFQ1RfQ0xBU1MpOwotCQkJaWYgKG9iamVjdENsYXNzICE9IG51bGwpIHsKLQkJCQlvYmplY3RDbGFzcyA9IG9iamVjdENsYXNzLmludGVybigpOwotCQkJfQotCQkJdmZbaV0uc2V0VHlwZUZpbHRlcihvYmplY3RDbGFzcyk7Ci0KLQkJCVN0cmluZyBhY3Rpb25GaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfQUNUSU9OX0ZJTFRFUik7Ci0JCQlpZiAoYWN0aW9uRmlsdGVyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25GaWx0ZXIgPSBhY3Rpb25GaWx0ZXIuaW50ZXJuKCk7Ci0JCQl9Ci0JCQl2ZltpXS5zZXRBY3Rpb25GaWx0ZXIoYWN0aW9uRmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gdmY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVwZW5kZW50VmFsaWRhdG9yVmFsdWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVwVmFsaWRhdG9yRWxlbWVudCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oREVQX1ZBTElEQVRPUik7Ci0JCWlmIChkZXBWYWxpZGF0b3JFbGVtZW50Lmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZGVwVmFsdWUgPSBkZXBWYWxpZGF0b3JFbGVtZW50WzBdLmdldEF0dHJpYnV0ZShERVBfVkFMX1ZBTFVFKTsKLQkJYm9vbGVhbiBkZXBCb29sVmFsdWUgPSAobmV3IEJvb2xlYW4oZGVwVmFsdWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGRlcEJvb2xWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1hcmtlciBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIElWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1hcmtlcklkc1ZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1hcmtlcklkID0gZWxlbWVudC5nZXRDaGlsZHJlbihNQVJLRVJfSUQpOwotCQlpZiAobWFya2VySWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG1hcmtlcklkc1tdID0gbmV3IFN0cmluZ1ttYXJrZXJJZC5sZW5ndGhdOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbWFya2VySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQltYXJrZXJJZHNbaV0gPSBtYXJrZXJJZFtpXS5nZXRBdHRyaWJ1dGUoTUFSS0VSX0lEX1ZBTFVFKTsKLQkJfQotCQlyZXR1cm4gbWFya2VySWRzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmFjZXRJZHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjZXRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihGQUNFVCk7Ci0JCWlmIChmYWNldHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gZmFjZXRJZHMgPSBuZXcgU3RyaW5nW2ZhY2V0cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0cy5sZW5ndGg7IGkrKykgewotCQkJZmFjZXRJZHNbaV0gPSBmYWNldHNbaV0uZ2V0QXR0cmlidXRlKEZBQ0VUX0lEKTsKLQkJfQotCQlyZXR1cm4gZmFjZXRJZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVmFsaWRhdG9yLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEhlbHBlck5hbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaGVscGVycyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0hFTFBFUl9DTEFTUyk7Ci0JCWlmIChoZWxwZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGhlbHBlcnNbMF0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JfQotCi0Jc3RhdGljIElXb3JrYmVuY2hDb250ZXh0IGNyZWF0ZUhlbHBlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGhlbHBlckNsYXNzTmFtZSkgewotCQlJV29ya2JlbmNoQ29udGV4dCB3aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3aCA9IChJV29ya2JlbmNoQ29udGV4dCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFRBR19IRUxQRVJfQ0xBU1MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRSksIAotCQkJCW5ldyBPYmplY3RbXXtoZWxwZXJDbGFzc05hbWV9KTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCByZXN1bHQpOwkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB3aDsKLQl9Ci0KLQlzdGF0aWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQl0cnkgewotCQkJdmFsaWRhdG9yID0gKElWYWxpZGF0b3IpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9USFJPV0FCTEUpLCAKLQkJCQluZXcgT2JqZWN0W117dmFsaWRhdG9yQ2xhc3NOYW1lfSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgcmVzdWx0KTsJCi0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQlUcmFjaW5nLmxvZyhOTFMuYmluZChWYWxNZXNzYWdlcy5WYmZFeGNTeW50YXhOb1ZhbE51bGwsIHZhbGlkYXRvckNsYXNzTmFtZSkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIGlzCi0JICogZW5hYmxlZCBieSBkZWZhdWx0LgotCSAqIAotCSAqIElmIG5vIGVuYWJsZWQgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQsIHRydWUgKGkuZS4sIGVuYWJsZWQpIGlzIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRFbmFibGVkQnlEZWZhdWx0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBydW5DaGlsZHJlbiBpcyBudWxsIG9yIGVtcHR5LCBiZWNhdXNlIHRoYXQgd2FzIGNoZWNrZWQgaW4gdGhlCi0JCS8vIGluaXRpYWxpemVWYWxpZGF0b3IgbWV0aG9kLgotCi0JCVN0cmluZyBpbmMgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX0VOQUJMRUQpOwotCQlpZiAoaW5jID09IG51bGwpIHsKLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfRU5BQkxFRF9ERUZBVUxUOwotCQl9Ci0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihpbmMudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmJvb2xlYW5WYWx1ZSgpOyAvLyB0aGlzIHdpbGwgcmV0dXJuIHRydWUKLQkJLy8gaWYsIGFuZCBvbmx5IGlmLCB0aGUKLQkJLy8gYXR0cmlidXRlIHZhbHVlIGlzCi0JCS8vICJ0cnVlIi4gRm9yIGV4YW1wbGUsCi0JCS8vICJ5ZXMiIHdpbGwgYmUgY29uc2lkZXJlZAotCQkvLyAiZmFsc2UiLgotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIHN1cHBvcnRzCi0JICogaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBJZiBubyBpbmNyZW1lbnRhbCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCwgdHJ1ZSAoaS5lLiwgaW5jcmVtZW50YWwgaXMgc3VwcG9ydGVkKQotCSAqIGlzIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRJbmNyZW1lbnRhbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgcnVuQ2hpbGRyZW4gaXMgbnVsbCBvciBlbXB0eSwgYmVjYXVzZSB0aGF0IHdhcyBjaGVja2VkIGluIHRoZQotCQkvLyBpbml0aWFsaXplVmFsaWRhdG9yIG1ldGhvZC4KLQotCQlTdHJpbmcgaW5jID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9JTkNSRU1FTlRBTCk7Ci0JCWlmIChpbmMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9JTkNSRU1FTlRBTF9ERUZBVUxUOwotCQl9Ci0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihpbmMudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmJvb2xlYW5WYWx1ZSgpOyAvLyB0aGlzIHdpbGwgcmV0dXJuIHRydWUKLQkJLy8gaWYsIGFuZCBvbmx5IGlmLCB0aGUKLQkJLy8gYXR0cmlidXRlIHZhbHVlIGlzCi0JCS8vICJ0cnVlIi4gRm9yIGV4YW1wbGUsCi0JCS8vICJ5ZXMiIHdpbGwgYmUgY29uc2lkZXJlZAotCQkvLyAiZmFsc2UiLgotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIHN1cHBvcnRzCi0JICogZnVsbCBidWlsZCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIG5vIGluY3JlbWVudGFsIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0LCB0cnVlIChpLmUuLCBpbmNyZW1lbnRhbCBpcyBzdXBwb3J0ZWQpCi0JICogaXMgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEZ1bGxCdWlsZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgcnVuQ2hpbGRyZW4gaXMgbnVsbCBvciBlbXB0eSwgYmVjYXVzZSB0aGF0IHdhcyBjaGVja2VkIGluIHRoZQotCQkvLyBpbml0aWFsaXplVmFsaWRhdG9yIG1ldGhvZC4KLQotCQlTdHJpbmcgZmIgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX0ZVTExCVUlMRCk7Ci0JCWlmIChmYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX0ZVTExCVUlMRF9ERUZBVUxUOwotCQl9Ci0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihmYi50cmltKCkudG9Mb3dlckNhc2UoKSkuYm9vbGVhblZhbHVlKCk7IC8vIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiwKLQkJLy8gYW5kIG9ubHkgaWYsIHRoZQotCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkJLy8gInRydWUiLiBGb3IgZXhhbXBsZSwKLQkJLy8gInllcyIgd2lsbCBiZSBjb25zaWRlcmVkCi0JCS8vICJmYWxzZSIuCi0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZyb20gcGx1Z2luLnhtbCwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMKLQkgKiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBJZiBubyBhc3luYyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCwgdHJ1ZSAoaS5lLiwgdGhlIHZhbGlkYXRvciBpcyB0aHJlYWQtc2FmZSkgaXMKLQkgKiByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0QXN5bmMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHJ1bkNoaWxkcmVuIGlzIG51bGwgb3IgZW1wdHksIGJlY2F1c2UgdGhhdCB3YXMgY2hlY2tlZCBpbiB0aGUKLQkJLy8gaW5pdGlhbGl6ZVZhbGlkYXRvciBtZXRob2QuCi0KLQkJU3RyaW5nIGFzeW5jID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9BU1lOQyk7Ci0JCWlmIChhc3luYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX0FTWU5DX0RFRkFVTFQ7Ci0JCX0KLQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGFzeW5jLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKTsgLy8gdGhpcyB3aWxsIHJldHVybiB0cnVlCi0JCS8vIGlmLCBhbmQgb25seSBpZiwgdGhlCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCQkvLyAidHJ1ZSIuIEZvciBleGFtcGxlLAotCQkvLyAieWVzIiB3aWxsIGJlCi0JCS8vIGNvbnNpZGVyZWQgImZhbHNlIi4KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCByZXR1cm4gdGhlIHR5cGVzIG9mIHZhbGlkYXRpb24gcGFzc2VzLCBhcwotCSAqIGRlZmluZWQgaW4gSVJ1bGVHcm91cCwgdGhhdCB0aGUgdmFsaWRhdG9yIHBlcmZvcm1zLgotCSAqIAotCSAqIElmIG5vIHBhc3MgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQsIElSdWxlR3JvdXAuUEFTU19GVUxMLCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRSdWxlR3JvdXAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHJ1bkNoaWxkcmVuIGlzIG51bGwgb3IgZW1wdHksIGJlY2F1c2UgdGhhdCB3YXMgY2hlY2tlZCBpbiB0aGUKLQkJLy8gaW5pdGlhbGl6ZVZhbGlkYXRvciBtZXRob2QuCi0KLQkJU3RyaW5nIHBhc3MgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX1JVTEVfR1JPVVApOwotCQlpZiAocGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsKLQkJfQotCi0JCWZpbmFsIFN0cmluZyBDT01NQSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXNzLCBDT01NQSwgZmFsc2UpOyAvLyBmYWxzZSBtZWFucyBkb24ndAotCQkvLyByZXR1cm4gdGhlIGNvbW1hIGFzCi0JCS8vIHBhcnQgb2YgdGhlIHN0cmluZwotCQlpbnQgcmVzdWx0ID0gMDsgLy8gbm8gcGFzc2VzIGlkZW50aWZpZWQKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBuZXh0QWN0aW9uID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmIChuZXh0QWN0aW9uLmVxdWFscyhJUnVsZUdyb3VwLlBBU1NfRkFTVF9OQU1FKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCB8IElSdWxlR3JvdXAuUEFTU19GQVNUOwotCQkJfSBlbHNlIGlmIChuZXh0QWN0aW9uLmVxdWFscyhJUnVsZUdyb3VwLlBBU1NfRlVMTF9OQU1FKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCB8IElSdWxlR3JvdXAuUEFTU19GVUxMOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkvLyBObyByZWNvZ25pemVkIHBhc3Nlcy4gUmV0dXJuIHRoZSBkZWZhdWx0LgotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEuTWlncmF0aW9uTWV0YURhdGEgZ2V0TWlncmF0aW9uTWV0YURhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX01JR1JBVEUpOwotCQlpZiAoKHJ1bkNoaWxkcmVuID09IG51bGwpIHx8IChydW5DaGlsZHJlbi5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gT25seSBzdXBwb3NlZCB0byBiZSBvbmUgIm1pZ3JhdGUiIHNlY3Rpb24gaW4gYSB2YWxpZGF0b3IsIHNvIGlnbm9yZSB0aGUgcmVzdAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWlncmF0ZSA9IHJ1bkNoaWxkcmVuWzBdOwotCi0JCS8vIE5vdyBsb29rIGZvciB0aGUgInZhbGlkYXRvciIgZWxlbWVudHMuIFplcm8gb3IgbW9yZSBjYW4gYmUgc3BlY2lmaWVkLgotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtaWdyYXRlQ2hpbGRyZW4gPSBtaWdyYXRlLmdldENoaWxkcmVuKFRBR19WQUxJREFUT1IpOwotCQlpZiAoKG1pZ3JhdGVDaGlsZHJlbiA9PSBudWxsKSB8fCAobWlncmF0ZUNoaWxkcmVuLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YS5NaWdyYXRpb25NZXRhRGF0YSBtbWQgPSB2bWQubmV3IE1pZ3JhdGlvbk1ldGFEYXRhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWlncmF0ZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWlncmF0ZUNoaWxkID0gbWlncmF0ZUNoaWxkcmVuW2ldOwotCQkJU3RyaW5nIGZyb20gPSBtaWdyYXRlQ2hpbGQuZ2V0QXR0cmlidXRlKEFUVF9GUk9NKTsKLQkJCWlmIChmcm9tID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJU3RyaW5nIHRvID0gbWlncmF0ZUNoaWxkLmdldEF0dHJpYnV0ZShBVFRfVE8pOwotCQkJaWYgKHRvID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW1tZC5hZGRJZChmcm9tLCB0byk7Ci0JCX0KLQkJcmV0dXJuIG1tZDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIGlmIGl0IGhhcyBhIHByb2plY3QgbmF0dXJlKHMpIHNwZWNpZmllZCwgcmV0dXJuIHRoZQotCSAqIFZhbGlkYXRvck5hbWVGaWx0ZXJzIHdoaWNoIHJlcHJlc2VudCB0aG9zZSBuYXR1cmVzLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogCi0JICogQSBwcm9qZWN0IG5hdHVyZSBjYW4gYmUgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgdG8gaW5kaWNhdGUgd2hhdCB0eXBlcyBvZiBJUHJvamVjdHMgYQotCSAqIHZhbGlkYXRvciBjYW4gcnVuIG9uLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yTmFtZUZpbHRlcltdIGdldFByb2plY3ROYXR1cmVGaWx0ZXJzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbHRlcnMgPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19QUk9KRUNUX05BVFVSRSk7Ci0JCWlmIChmaWx0ZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhbGlkYXRvck5hbWVGaWx0ZXJbXSB2ZiA9IG5ldyBWYWxpZGF0b3JOYW1lRmlsdGVyW2ZpbHRlcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2ZltpXSA9IG5ldyBWYWxpZGF0b3JOYW1lRmlsdGVyKCk7Ci0JCQkvLyBJbiBvcmRlciB0byBzcGVlZCB1cCBvdXIgU3RyaW5nIGNvbXBhcmlzb25zLCBsb2FkIHRoZXNlCi0JCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCQkvLyB1c2UgcG9pbnRlciBjb21wYXJpc29uIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsCi0JCQkvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNvbXBhcmlzb24uIFNpbmNlIHRoZXNlIG5hbWVzIHNob3VsZAotCQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCQkvLyBzZXRzIHRoZW0gb25seSBvbmNlLCBpdCBpcyBzYWZlIHRvIGRlY2xhcmUgdGhlc2UgU3RyaW5ncwotCQkJLy8gY29uc3RhbnRzLgotCQkJLy8KLQkJCS8vIFRvIGxvYWQgYSBTdHJpbmcgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLCBjYWxsIGludGVybigpIG9uIHRoZSBTdHJpbmcuCi0JCQkvLwotCQkJU3RyaW5nIG5hbWVGaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJaWYgKG5hbWVGaWx0ZXIgIT0gbnVsbCkgewotCQkJCW5hbWVGaWx0ZXIgPSBuYW1lRmlsdGVyLmludGVybigpOwotCQkJfQotCQkJdmZbaV0uc2V0TmFtZUZpbHRlcihuYW1lRmlsdGVyKTsKLQotCQkJU3RyaW5nIGluY2x1ZGUgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfSU5DTFVERSk7Ci0JCQl2ZltpXS5zZXRJbmNsdWRlKGluY2x1ZGUpOwotCQl9Ci0JCXJldHVybiB2ZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGdldFJlYWRlcigpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIoKTsKLQotCQkJRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZhdGVkKCkgewotCQkvLyBXaGV0aGVyIHRoZSByZWdpc3RyeSBoYXMgYmVlbiByZWFkIG9yIG5vdCBpcyBrZXB0IGluIHRoZSBFdmVudE1hbmFnZXIKLQkJLy8gY2xhc3MgaW5zdGVhZCBvZiB0aGlzIGNsYXNzIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIGEgc2h1dGRvd24gcHJvYmxlbS4KLQkJLy8gU2VlIHRoZSBjb21tZW50IGluIHRoZSBpc0FjdGl2ZSgpIG1ldGhvZCBvZiB0aGUgRXZlbnRNYW5hZ2VyIGNsYXNzCi0JCS8vIGZvciBkZXRhaWxzLgotCQlyZXR1cm4gRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0FjdGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRWYWxpZGF0b3JFeHRlbnNpb25Qb2ludCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBWQUxJREFUT1JfRVhUX1BUX0lEKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCS8vIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyB0aGF0IHNvbWVvbmUgcmVtb3ZlZCB0aGUgInZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBkZWNsYXJhdGlvbiBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQlpZiAoVHJhY2luZy5pc1RyYWNlVjEoKSkgewotCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX01JU1NJTkdfVkFMSURBVE9SX0VQKSwKLQkJCQkJCW5ldyBPYmplY3RbXXtWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9FWFRfUFRfSUR9KTsgLy8kTk9OLU5MUy0xJAotCQkJCVRyYWNpbmcubG9nKHJlc3VsdCk7CQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXh0ZW5zaW9uUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogSXQncyBva2F5IHRvIHJldHVybiBhIGhhbmRsZSB0byB0aGUgVmFsaWRhdG9yTWV0YURhdGEgYmVjYXVzZSB0aGUgdm1kIGNhbid0IGJlIG1vZGlmaWVkIGJ5Ci0JICogYW55IGNvZGUgbm90IGluIHRoaXMgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJLy8gcmV0cmlldmFsIHdpbGwgYmUgaW4gbG9nKG4pIHRpbWUKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19PUlBIQU5fSVZBTElEQVRPUiwgbmV3IFN0cmluZ1tdeyJudWxsIn0pOyAvLyROT04tTkxTLTEkCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gdmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlpZiAodm1kICE9IG51bGwpIHsKLQkJCXJldHVybiB2bWQ7Ci0JCX0KLQotCQkvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB2bWQgaXMgbmVpdGhlciBhIHJvb3Qgbm9yIGFuIGFnZ3JlZ2F0ZSB2YWxpZGF0b3IsCi0JCS8vIHlldCB0aGUgSVZhbGlkYXRvciBleGlzdHMuIEludGVybmFsIGVycm9yLgotCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IsIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFZhbGlkYXRvck1ldGFEYXRhKElXb3Jrc3BhY2VSb290IHJvb3QpIHsKLQkJLy8gRXZlcnkgdmFsaWRhdG9yIG9uIHRoZSBQcmVmZXJlbmNlcyBwYWdlIG11c3QgYmUgcmV0dXJuZWQKLQkJU2V0IGNvcHkgPSBuZXcgSGFzaFNldCgpOwotCQljbG9uZShfaW5kZXhlZFZhbGlkYXRvcnMudmFsdWVzKCksIGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIgUHJvamVjdAotCSAqIHZzLiBXZWIgUHJvamVjdCkuCi0JICogCi0JICogVGhpcyBpcyBhIGxvbmctcnVubmluZyBwcm9jZXNzLiBJZiB5b3UgY2FuLCBjYWNoZSB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBjb3B5ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWdldFZhbGlkYXRvck1ldGFEYXRhKHByb2plY3QsIGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBzZXQgb2YgY29uZmlndXJlZCB2YWxpZGF0b3IgbWV0YWRhdGEgaW50byB0aGUgU2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgewotCQlpZiAodm1kcyA9PSBudWxsKXJldHVybjsKLQkJdm1kcy5jbGVhcigpOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQl0cnkgewotCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiSVByb2plY3QgaXMgIiArIFN0cmluZy52YWx1ZU9mKHByb2plY3QpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQkJLy8gdm1kcyBpcyBhbHJlYWR5IGNsZWFyCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nW10gcHJvamVjdE5hdHVyZXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwcm9qZWN0TmF0dXJlcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDI7Ci0JCQkJLy8gdm1kcyBpcyBhbHJlYWR5IGNsZWFyCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gSWYgdGhlcmUgYXJlIG5vIHByb2plY3QgbmF0dXJlcyBvbiBhIHBhcnRpY3VsYXIgcHJvamVjdCwKLQkJCS8vIG9yIGlmIHRoaXMgcHJvamVjdCBuYXR1cmUgaGFzIG5vIHZhbGlkYXRvcnMgY29uZmlndXJlZAotCQkJLy8gb24gaXQsIHJldHVybiB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgY29uZmlndXJlZCBvbiBhbGwKLQkJCS8vIHByb2plY3RzLgotCQkJaWYgKChwcm9qZWN0TmF0dXJlcyA9PSBudWxsKSB8fCAocHJvamVjdE5hdHVyZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCQkKLQkJCQkvLyBBbHNvIGluY2x1ZGUgdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGVuYWJsZWQgdGhyb3VnaCBlbmFibGVtZW50Ci0JCQkJLy8gZXhwcmVzc2lvbiBmb3IgdGhpcyBwcm9qZWN0LgotCQkJCS8vIE5vdGUgdGhhdCB0aGUgQVBJIGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkgd29ya3MgcHJvcGVybHkgCi0JCQkJLy8gb25seSB3aGVuIHRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgcHJvcGVydHkgdGVzdGVyIGlzIGFjdGl2YXRlZC4KLQkJCQkvLyBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIG1heSBiZSBuZWVkZWQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIAotCQkJCS8vIHRoZSBlbmFibGVtZW50IGluIHRoZSB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgotCQkgICAgICAgIC8vIDxlbmFibGVtZW50PgotCQkgICAgICAgIC8vICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIHByb3BlcnR5PSJmb28udGVzdFByb3BlcnR5Ii8+Ci0JCSAgICAgICAgLy8gPC9lbmFibGVtZW50PiAKLQkJCQkKLQkJCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnNXaXRoRW5hYmxlbWVudEV4cHJlc3Npb24gPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdldEFsbFZhbGlkYXRvcnMoKSkgewotCQkJCQlpZiAoaXNGYWNldEVuYWJsZWQodm1kLCBwcm9qZWN0KSkgewotCQkJCQkJdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbi5hZGQodm1kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2YWxpZGF0b3JzV2l0aEVuYWJsZW1lbnRFeHByZXNzaW9uLnNpemUoKSA+IDAgKXsKLQkJCQkJdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbi5hZGRBbGwoIGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSk7Ci0JCQkJCWNsb25lKHZhbGlkYXRvcnNXaXRoRW5hYmxlbWVudEV4cHJlc3Npb24sIHZtZHMpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNsb25lKGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSwgdm1kcyk7Ci0KLQotCQkJfSBlbHNlIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg4OwotCQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJCVRyYWNpbmcubG9nKHByb2plY3ROYXR1cmVzLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQljYWxjdWxhdGVWbWRzRm9yTmF0dXJlQW5kRmFjZXRzKHZtZHMsIHByb2plY3ROYXR1cmVzLHByb2plY3QpOwotCQkJCS8vIE5vdyBmaWx0ZXIgb3V0IHRoZSB2YWxpZGF0b3JzIHdoaWNoIG11c3Qgbm90IHJ1biBvbiB0aGlzIHByb2plY3QKLQkJCQlyZW1vdmVFeGNsdWRlZFByb2plY3RzKHByb2plY3QsIHZtZHMpOwotCQkJCWlmICh2bWRzLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDIwOwotCQkJCQljbG9uZShnZXRWYWxpZGF0b3JNZXRhRGF0YVVua25vd25Qcm9qZWN0KCksIHZtZHMpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlUcmFjaW5nLmxvZyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB2bWRzCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVZtZHNGb3JOYXR1cmVBbmRGYWNldHMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2bWRzLCBTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcywgSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHByb2pWbWRzOwotCQlTdHJpbmdbXSBwcm9qZWN0RmFjZXRJZHMgPSBnZXRQcm9qZWN0RmFjZXRJZHMocHJvamVjdCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZ2V0QWxsVmFsaWRhdG9ycygpKSB7Ci0JCQlpZiAoY29udGFpbnNQcm9qZWN0RmFjZXQodm1kLCBwcm9qZWN0RmFjZXRJZHMpIHx8IGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkpIHsKLQkJCQl2bWRzLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JCWZvciAoU3RyaW5nIHByb2plY3ROYXR1cmVJZCA6IHByb2plY3ROYXR1cmVzKSB7Ci0JCQlwcm9qVm1kcyA9IF92YWxpZGF0b3JzLmdldChwcm9qZWN0TmF0dXJlSWQpOwotCQkJaWYgKHByb2pWbWRzID09IG51bGwpY29udGludWU7Ci0KLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogcHJvalZtZHMpIHsKLQkJCQlpZiAoIXZtZHMuY29udGFpbnModm1kKSAmJiAodm1kLmdldEZhY2V0RmlsdGVycygpID09IG51bGwgfHwgdm1kLmdldEZhY2V0RmlsdGVycygpLmxlbmd0aCA9PSAwKSkgewotCQkJCQlpZiAodm1kLmdldEVuYWJsZW1lbnRFeHByZXNpb24oKSA9PSBudWxsKXZtZHMuYWRkKHZtZCk7Ci0JCQkJCWVsc2UgaWYgKGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkpdm1kcy5hZGQodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNQcm9qZWN0RmFjZXQoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmdbXSBwcm9qZWN0RmFjZXRJZHMpIHsKLQkJU3RyaW5nW10gdmFsaWRhdG9yRmFjZXRzID0gdm1kLmdldEZhY2V0RmlsdGVycygpOwotCQlpZiAodmFsaWRhdG9yRmFjZXRzICE9IG51bGwgJiYgdmFsaWRhdG9yRmFjZXRzLmxlbmd0aCA+IDApIHsKLQkJCWlmIChwcm9qZWN0RmFjZXRJZHMgIT0gbnVsbCAmJiBwcm9qZWN0RmFjZXRJZHMubGVuZ3RoID4gMCkgewotCQkJCWlmIChBcnJheXMuYXNMaXN0KHByb2plY3RGYWNldElkcykuY29udGFpbnNBbGwoQXJyYXlzLmFzTGlzdCh2YWxpZGF0b3JGYWNldHMpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNGYWNldEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2bWQuZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewotCQkJCUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcHJvamVjdCk7Ci0JCQkJY29udGV4dC5zZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSBleHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpOwotCQkJCXJldHVybiByZXN1bHQgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0UHJvamVjdEZhY2V0SWRzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gcHJvamVjdEZhY2V0cyA9IGZQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKS50b0FycmF5KCk7Ci0JCQkJU3RyaW5nW10gcHJvamVjdEZhY2V0SWRzID0gbmV3IFN0cmluZ1twcm9qZWN0RmFjZXRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RmFjZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gKChJUHJvamVjdEZhY2V0VmVyc2lvbikgcHJvamVjdEZhY2V0c1tpXSkuZ2V0UHJvamVjdEZhY2V0KCk7Ci0JCQkJCXByb2plY3RGYWNldElkc1tpXSA9IHByb2plY3RGYWNldC5nZXRJZCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJvamVjdEZhY2V0SWRzOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIElmIG9uZSBwcm9qZWN0IG5hdHVyZSBvbiB0aGUgcHJvamVjdCBpbmNsdWRlcyBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBidXQgYW5vdGhlciBwcm9qZWN0Ci0JICogbmF0dXJlIGV4Y2x1ZGVzIHRoYXQgdmFsaWRhdG9yLCB0aGVuIHRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB2bWQgc2V0LgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBpZiBBVmFsaWRhdG9yIGNhbiBydW4gb24gYW55IGphdmEgcHJvamVjdCBidXQgbm90IG9uIGEgSjJFRSBwcm9qZWN0LCB3aGljaCBpcyBhbgotCSAqIGluc3RhbmNlIG9mIGEgamF2YSBwcm9qZWN0LCB0aGVuIHRoZSBBVmFsaWRhdG9yIGlzIGluY2x1ZGVkIGJ5IHRoZSBqYXZhIG5hdHVyZSBhbmQgZXhjbHVkZWQKLQkgKiBieSB0aGUgSjJFRSBuYXR1cmUuIFRoZSBBVmFsaWRhdG9yIHdvdWxkIGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2x1ZGVkUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2bWRzKSB7Ci0JCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXG5CZWZvcmU6XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlUcmFjaW5nLmxvZyhidWZmZXIpOwotCQl9Ci0KLQkJU3RyaW5nW10gcHJvamVjdE5hdHVyZXMgPSBudWxsOwotCQl0cnkgewotCQkJcHJvamVjdE5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChwcm9qZWN0TmF0dXJlcyA9PSBudWxsKSB8fCAocHJvamVjdE5hdHVyZXMubGVuZ3RoID09IDApKSB7Ci0JCQkvLyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdAotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYXR1cmUgPSBwcm9qZWN0TmF0dXJlc1tpXTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdm1kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXJbXSBuYXR1cmVGaWx0ZXJzID0gdm1kLmdldFByb2plY3ROYXR1cmVGaWx0ZXJzKCk7Ci0JCQkJaWYgKG5hdHVyZUZpbHRlcnMgPT0gbnVsbCkgewotCQkJCQkvLyBDYW4gcnVuIG9uIGFueSBwcm9qZWN0Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmF0dXJlRmlsdGVycy5sZW5ndGg7IGorKykgewotCQkJCQlWYWxpZGF0b3JOYW1lRmlsdGVyIHBuID0gbmF0dXJlRmlsdGVyc1tqXTsKLQkJCQkJaWYgKG5hdHVyZS5lcXVhbHMocG4uZ2V0TmFtZUZpbHRlcigpKSAmJiAhcG4uaXNJbmNsdWRlKCkpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoVHJhY2luZy5pc1RyYWNlVjEoKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlxuQWZ0ZXI6XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlUcmFjaW5nLmxvZyhidWZmZXIpOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNsb25lKENvbGxlY3Rpb24gaW5wdXQsIENvbGxlY3Rpb24gY29weSkgewotCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBjb3B5ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCWNvcHkuY2xlYXIoKTsKLQkJY29weS5hZGRBbGwoaW5wdXQpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlYnVnKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJQcm9qZWN0IG5hdHVyZSA9PiB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJwcm9qSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHByb2pJZCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMgPSBfdmFsaWRhdG9ycy5nZXQocHJvaklkKTsKLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdmFsaWRhdG9ycykgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYnVmZmVyLmFwcGVuZCgiRW5hYmxlL2Rpc2FibGUgdmFsaWRhdG9yIGJ5IGRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiIGVuYWJsZWQ/ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHZtZC5pc0VuYWJsZWRCeURlZmF1bHQoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkT25Qcm9qZWN0KFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSA9PSBudWxsKQotCQkJcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+PigpOwotCi0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcyA9IHByb2plY3RWYWxpZGF0aW9uTWV0YURhdGEuZ2V0KHByb2plY3QpOwotCQlpZiAodm1kcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdm1kcy5jb250YWlucyh2bWQpOwotCQl9IGVsc2UgewotCQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBwcmpWbWRzID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEocHJvamVjdCk7Ci0JCQlpZiAocHJqVm1kcyA9PSBudWxsIHx8IHByalZtZHMuc2l6ZSgpID09IDApcmV0dXJuIGZhbHNlOwotCQkJcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YS5wdXQocHJvamVjdCwgcHJqVm1kcyk7Ci0JCQlyZXR1cm4gcHJqVm1kcy5jb250YWlucyh2bWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIFZhbGlkYXRvck1ldGFEYXRhIHdoaWNoIGFyZSBjb25maWd1cmVkIG9uIGFsbCBwcm9qZWN0cyBvciB3aGljaCBydW4gb24gYW55Ci0JICogcHJvamVjdHMgZXhjZXB0IGNlcnRhaW4gcHJvamVjdCB0eXBlcy4KLQkgKiAKLQkgKiBVbmxpa2Ugb3RoZXIgZ2V0IG1ldGhvZHMsIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSBpdCBkb2Vzbid0IHJldHVybiBhIGNsb25lLgotCSAqIAotCSAqIEBzZWUgYWRkRXhjbHVkZWRSZW1haW5kZXIoKQotCSAqLwotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRWYWxpZGF0b3JNZXRhRGF0YVVua25vd25Qcm9qZWN0KCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHByb2pWbWRzID0gX3ZhbGlkYXRvcnMuZ2V0KFVOS05PV05fUFJPSkVDVCk7Ci0JCWlmIChwcm9qVm1kcyA9PSBudWxsKSB7Ci0JCQlwcm9qVm1kcyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQl9Ci0JCXJldHVybiBwcm9qVm1kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgb2YgVmFsaWRhdG9yTWV0YURhdGEgd2hpY2ggYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldFZhbGlkYXRvck1ldGFEYXRhRW5hYmxlZEJ5RGVmYXVsdCgpIHsKLQkJU2V0IGNvcHkgPSBuZXcgSGFzaFNldCgpOwotCQljbG9uZShfZGVmYXVsdEVuYWJsZWRWYWxpZGF0b3JzLCBjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9yTWV0YURhdGFBcnJheUVuYWJsZWRCeURlZmF1bHQoKSB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW19kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMuc2l6ZSgpXTsKLQkJX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgVUksIG9yIFRWVCBwbHVnaW4uIEluIGdlbmVyYWwsCi0JICogb25seSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgYW5kIHRoZSB2YWxpZGF0aW9uIFRWVCBzaG91bGQgaGFuZGxlIFZhbGlkYXRvck1ldGFEYXRhIG9iamVjdHMuCi0JICogCi0JICogR2l2ZW4gYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyBhIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgdmFsaWRhdG9yLCByZXR1cm4gdGhlCi0JICogVmFsaWRhdG9yTWV0YURhdGEgdGhhdCB1c2VzIGEgdmFsaWRhdG9yIG9mIHRoYXQgbmFtZSwgaWYgaXQgZXhpc3RzLgotCSAqIAotCSAqIEl0J3Mgb2theSB0byByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIFZhbGlkYXRvck1ldGFEYXRhIGJlY2F1c2UgdGhlIHZtZCBjYW4ndCBiZSBtb2RpZmllZCBieQotCSAqIGFueSBjb2RlIG5vdCBpbiB0aGlzIHBhY2thZ2UuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJaWYgKHZhbGlkYXRvckNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZDIgPSBfaW5kZXhlZFZhbGlkYXRvcnMuZ2V0KHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCWlmICh2bWQyICE9IG51bGwpcmV0dXJuIHZtZDI7Ci0KLQkJLy8gQ2hlY2sgZm9yIGFuIGFnZ3JlZ2F0ZSB2YWxpZGF0b3IKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBfaW5kZXhlZFZhbGlkYXRvcnMudmFsdWVzKCkpIHsKLQkJCWlmICh2bWQgPT0gbnVsbCljb250aW51ZTsKLQotCQkJaWYgKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkuZXF1YWxzKHZhbGlkYXRvckNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdm1kOwotCQkJfQotCi0JCQlTdHJpbmdbXSBhZ2dyZWdhdGVOYW1lcyA9IHZtZC5nZXRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoKTsKLQkJCWlmIChhZ2dyZWdhdGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZ2dyZWdhdGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgYWdncmVnYXRlTmFtZSA9IGFnZ3JlZ2F0ZU5hbWVzW2ldOwotCQkJCQlpZiAodmFsaWRhdG9yQ2xhc3NOYW1lLmVxdWFscyhhZ2dyZWdhdGVOYW1lKSkgewotCQkJCQkJcmV0dXJuIHZtZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ3VycmVudCBuYW1lIG9mIHZhbGlkYXRvciBkb2Vzbid0IG1hdGNoOyBoYXMgdGhpcyB2YWxpZGF0b3IgYmVlbgotCQkJLy8gbWlncmF0ZWQgZnJvbSBhbm90aGVyIHBhY2thZ2U/Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YS5NaWdyYXRpb25NZXRhRGF0YSBtbWQgPSB2bWQuZ2V0TWlncmF0aW9uTWV0YURhdGEoKTsKLQkJCWlmIChtbWQgPT0gbnVsbCkgewotCQkJCS8vIFZhbGlkYXRvciBjbGFzcyBuYW1lIGhhc24ndCBiZWVuIG1pZ3JhdGVkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVNldCBpZExpc3QgPSBtbWQuZ2V0SWRzKCk7Ci0JCQlpZiAoaWRMaXN0ID09IG51bGwpIHsKLQkJCQkvLyBJbnZhbGlkIDxtaWdyYXRlPiBlbGVtZW50LgotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlJdGVyYXRvciBpZEl0ZXJhdG9yID0gaWRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmdbXSBpZHMgPSAoU3RyaW5nW10pIGlkSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChpZHMubGVuZ3RoICE9IDIpIHsKLQkJCQkJLy8gbG9nCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBmcm9tID0gaWRzWzBdOwotCQkJCWlmIChmcm9tID09IG51bGwpIHsKLQkJCQkJLy8gbG9nCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChmcm9tLmVxdWFscyh2YWxpZGF0b3JDbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiB2bWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIG5vIHZhbGlkYXRvciB1c2luZyB0aGF0IGNsYXNzIG5hbWUgaXMgbG9hZGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZWQgdmFsaWRhdG9yIGlzIGluc3RhbGxlZCwgb3RoZXJ3aXNlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdWYWxpZGF0b3IoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkgewotCQlyZXR1cm4gKGdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzTmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIHdpdGggdGhlIHN0YXRpYyBtZXRhZGF0YSAocnVudGltZSBtZXRhZGF0YSBpcyBpbml0aWFsaXplZCBpbiB0aGUKLQkgKiBWYWxpZGF0aW9uT3BlcmF0aW9uIGNsYXNzKS4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGluaXRpYWxpemVWYWxpZGF0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWxpZGF0b3JOYW1lLCBTdHJpbmcgcGx1Z2luSWQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQlpZiAoKHJ1bkNoaWxkcmVuID09IG51bGwpIHx8IChydW5DaGlsZHJlbi5sZW5ndGggPCAxKSkgewotCQkJLy8gSG93IGNhbiBhbiBJVmFsaWRhdG9ySW1wbCBiZSBjcmVhdGVkIHdoZW4gdGhlcmUgbm8gY2xhc3MgbmFtZSB0byBpbnN0YW50aWF0ZT8KLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJVHJhY2luZy5sb2coTkxTLmJpbmQoVmFsTWVzc2FnZXMuVmJmRXhjU3ludGF4Tm9WYWxSdW4sIHZhbGlkYXRvck5hbWUpKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vV1RQIEJ1Z3ppbGxhIGRlZmVjdDogODIzMzgKLQkJLy9Vc2luZyB0aGUgVW5pcXVlIElkZW50aWZpZXIgZ2l2ZSB0aGUgZmxleGliaWxpdHkgb2YgdGhlIHNhbWUgdmFsaWRhdG9yIGNsYXNzIHVzZWQgYnkgb3RoZXIgdmFsaWRhdG9yIGV4dGVuc2lvbnMgd2l0aG91dCB3cml0aW5nIGEgbmV3IHZhbGlkYXRpb24gY2xhc3MKLQkJLy9SZXZlcnRpbmcgdGhlIGZpeCBiYWNrIGFzIHRoZSBjbGFzcyBuYW1lIGRlZmluZWQgaW4gdGhlIGV4dCBpcyB1bmlxdWUgdG8gdGhpcyB2YWxpZGF0b3IgYW5kIGhhcyB0byBiZSB1c2VkIGZvciB0aGUgdW5pcXVlIGlkIGluIHRoZSB2YWxpZGF0aW9uIG1ldGFkYXRhCi0JCVN0cmluZyB2YWxpZGF0b3JJbXBsTmFtZSA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkKLQkJaWYgKHZhbGlkYXRvckltcGxOYW1lID09IG51bGwpIHsKLQkJCS8vIFNhbWUgYXMgYmVmb3JlOyBob3cgY2FuIHdlIGluc3RhbnRpYXRlIHdoZW4uLi4KLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJVHJhY2luZy5sb2coTkxTLmJpbmQoVmFsTWVzc2FnZXMuVmJmRXhjU3ludGF4Tm9WYWxDbGFzcywgdmFsaWRhdG9yTmFtZSkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaGVscGVySW1wbE5hbWUgPSBnZXRIZWxwZXJOYW1lKGVsZW1lbnQpOwotCQlpZiAoaGVscGVySW1wbE5hbWUgPT0gbnVsbCkgewotCQkJLy8gU2FtZSBhcyBiZWZvcmU7IGhvdyBjYW4gd2UgaW5zdGFudGlhdGUgd2hlbi4uLgotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZyhOTFMuYmluZChWYWxNZXNzYWdlcy5WYmZFeGNTeW50YXhOb1ZhbFJ1biwgdmFsaWRhdG9ySW1wbE5hbWUpKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gSW4gb3JkZXIgdG8gc3BlZWQgdXAgb3VyIFN0cmluZyBjb21wYXJpc29ucywgbG9hZCB0aGVzZQotCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCS8vIHVzZSBwb2ludGVyIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgdHJhZGl0aW9uYWwKLQkJLy8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjb21wYXJpc29uLiBTaW5jZSB0aGVzZSBuYW1lcyBzaG91bGQKLQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCS8vIHNldHMgdGhlbSBvbmx5IG9uY2UsIGl0IGlzIHNhZmUgdG8gZGVjbGFyZSB0aGVzZSBTdHJpbmdzCi0JCS8vIGNvbnN0YW50cy4KLQkJLy8KLQkJLy8gVG8gbG9hZCBhIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UsIGNhbGwgaW50ZXJuKCkgb24gdGhlIFN0cmluZy4KLQkJLy8KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCXZtZC5hZGRGaWx0ZXJzKGdldEZpbHRlcnMoZWxlbWVudCkpOyAvLyB2YWxpZGF0b3IgbWF5LCBvciBtYXkgbm90LCBoYXZlIGZpbHRlcnMKLQkJdm1kLmFkZFByb2plY3ROYXR1cmVGaWx0ZXJzKGdldFByb2plY3ROYXR1cmVGaWx0ZXJzKGVsZW1lbnQpKTsgLy8gdmFsaWRhdG9yIG1heSwgb3IgbWF5IG5vdCwgc3BlY2lmeSBhIHByb2plY3QgbmF0dXJlCi0JCXZtZC5hZGRGYWNldEZpbHRlcnMoZ2V0RmFjZXRJZHMoZWxlbWVudCkpOy8vdmFsaWRhdG9yIG1heSBvciBtYXkgbm90IHNwZWNpZnkgdGhlIGZhY2V0Ci0JCXZtZC5zZXRFbmFibGVtZW50RWxlbWVudChnZXRFbmFibGVtZW50RWxlbWVudChlbGVtZW50KSk7Ci0JCXZtZC5hZGRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoZ2V0QWdncmVnYXRlVmFsaWRhdG9yc05hbWVzKGVsZW1lbnQpKTsgLy8gaWYgYSB2YWxpZGF0b3IKLQkJLy8gYWdncmVnYXRlZCBhbm90aGVyIHZhbGlkYXRvciwgaXQgc2hvdWxkIGlkZW50aWZ5Ci0JCS8vIHRoZSBzdWItdmFsaWRhdG9yKHMpJyBjbGFzcyBuYW1lCi0JCXZtZC5zZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSh2YWxpZGF0b3JOYW1lLmludGVybigpKTsgLy8gdmFsaWRhdG9yIG11c3QgaGF2ZSBhIGRpc3BsYXkgbmFtZS4KLQkJdm1kLnNldFZhbGlkYXRvclVuaXF1ZU5hbWUodmFsaWRhdG9ySW1wbE5hbWUuaW50ZXJuKCkpOwotCQl2bWQuc2V0UGx1Z2luSWQocGx1Z2luSWQpOwotCQl2bWQuc2V0SW5jcmVtZW50YWwoZ2V0SW5jcmVtZW50YWwoZWxlbWVudCkpOwotCQl2bWQuc2V0RnVsbEJ1aWxkKGdldEZ1bGxCdWlsZChlbGVtZW50KSk7Ci0JCXZtZC5zZXRBc3luYyhnZXRBc3luYyhlbGVtZW50KSk7Ci0JCXZtZC5zZXRSdWxlR3JvdXAoZ2V0UnVsZUdyb3VwKGVsZW1lbnQpKTsKLQkJdm1kLnNldEVuYWJsZWRCeURlZmF1bHQoZ2V0RW5hYmxlZEJ5RGVmYXVsdChlbGVtZW50KSk7Ci0JCXZtZC5zZXRNaWdyYXRpb25NZXRhRGF0YShnZXRNaWdyYXRpb25NZXRhRGF0YShlbGVtZW50LCB2bWQpKTsKLQkJdm1kLnNldEhlbHBlckNsYXNzKGVsZW1lbnQsIGhlbHBlckltcGxOYW1lKTsKLQkJdm1kLnNldFZhbGlkYXRvckNsYXNzKHJ1bkNoaWxkcmVuWzBdKTsgLy8gYXNzb2NpYXRlIHRoZSBhYm92ZSBhdHRyaWJ1dGVzIHdpdGggdGhlIHZhbGlkYXRvcgotCQl2bWQuYWRkRGVwZW5kZW50VmFsaWRhdG9yKGdldERlcGVuZGVudFZhbGlkYXRvclZhbHVlKGVsZW1lbnQpKTsKLQkJdm1kLnNldENvbnRlbnRUeXBlSWRzKGdldENvbnRlbnRUeXBlQmluZGluZ3MoZWxlbWVudCkpOwotCQlpbml0aWFsaXplVmFsaWRhdG9yQ3VzdG9tTWFya2VycyhlbGVtZW50LCBwbHVnaW5JZCwgdm1kKTsKLQkJCi0JCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQlUcmFjaW5nLmxvZygidmFsaWRhdG9yIGxvYWRlZDogIiArIHZhbGlkYXRvckltcGxOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHZtZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEBwYXJhbSB2bWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRvckN1c3RvbU1hcmtlcnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwbHVnaW5JZCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCVN0cmluZ1tdIGN1c3RvbU1hcmtlcklkcyA9IGdldE1hcmtlcklkc1ZhbHVlKGVsZW1lbnQpOwotCQlpZiAoY3VzdG9tTWFya2VySWRzICE9IG51bGwgJiYgY3VzdG9tTWFya2VySWRzLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZ1tdIHF1YWxpZmllZE1hcmtlcklkcyA9IG5ldyBTdHJpbmdbY3VzdG9tTWFya2VySWRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU1hcmtlcklkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBtYXJrZXJpZCA9IGN1c3RvbU1hcmtlcklkc1tpXTsKLQkJCQlpZiAobWFya2VyaWQubGFzdEluZGV4T2YoIi4iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBwbHVnaW5JRCA9IG1hcmtlcmlkLnN1YnN0cmluZygwLCBtYXJrZXJpZC5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJCQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJCQkJcXVhbGlmaWVkTWFya2VySWRzW2ldID0gcGx1Z2luSWQgKyAiLiIgKyBjdXN0b21NYXJrZXJJZHNbaV07IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJcXVhbGlmaWVkTWFya2VySWRzW2ldID0gY3VzdG9tTWFya2VySWRzW2ldOwotCQkJCX0gZWxzZQotCQkJCQlxdWFsaWZpZWRNYXJrZXJJZHNbaV0gPSBwbHVnaW5JZCArICIuIiArIGN1c3RvbU1hcmtlcklkc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdm1kLnNldE1hcmtlcklkcyhxdWFsaWZpZWRNYXJrZXJJZHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFeHByZXNzaW9uIGdldEVuYWJsZW1lbnRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVuYWJsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCWlmIChlbmFibGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudHNbMF0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBCWSBUSEUgVkFMSURBVElPTiBGUkFNRVdPUkshIFRoZSB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzCi0JICogdXNlZCB0byBwb3B1bGF0ZSB0aGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlIHBhZ2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248VmFsaWRhdG9yTWV0YURhdGE+IGdldEFsbFZhbGlkYXRvcnMoKSB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPig1MCk7Ci0JCWNsb25lKF9pbmRleGVkVmFsaWRhdG9ycy52YWx1ZXMoKSwgdmFsaWRhdG9ycyk7Ci0JCXJldHVybiB2YWxpZGF0b3JzOwotCX0KLQotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX2luZGV4ZWRWYWxpZGF0b3JzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQlTdHJpbmcgbGFiZWwgPSBleHRlbnNpb24uZ2V0TGFiZWwoKTsKLQkJCWlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKX07Ci0JCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1ZBTElEQVRPUk5BTUVfSVNfTlVMTCksCi0JCQkJCQkJKE9iamVjdFtdKW1zZ1Bhcm0pOwotCQkJCQlUcmFjaW5nLmxvZyhyZXN1bHQpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiBnZXRMYWJlbCgpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGlzIGlzIGFuIGlsbGVnYWwgdmFsaWRhdG9yLgotCQkJCS8vIFRoZSBQcm9wZXJ0eVBhZ2UsIGFuZCBvdGhlciBzdGF0dXMgbWVzc2FnZXMsIG5lZWQgdG8gaGF2ZSBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yCi0JCQkJLy8gdGhlIHZhbGlkYXRvci4KLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gaW5pdGlhbGl6ZVZhbGlkYXRvcihlbGVtZW50LCBsYWJlbCwgcGx1Z2luSWQpOwotCi0JCQkJaWYgKHZtZCAhPSBudWxsKSB7Ci0JCQkJCS8vIEFkZCB0aGlzIHZhbGlkYXRvciB0byB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzOyBpZiB2bWQgaXMgbnVsbCwgdGhlIHZhbGlkYXRvcgotCQkJCQkvLyBjb3VsZG4ndCBiZSBjcmVhdGVkLgotCQkJCQlhZGQodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgVmFsaWRhdG9ycyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJX3ZhbGlkYXRvcnMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIGV4dGVuc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0VmFsaWRhdG9yRXh0ZW5zaW9uUG9pbnQoKTsKLQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkvLyBmaW5kIGFsbCBydW50aW1lIGltcGxlbWVudGF0aW9ucwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLSAgICAKLSAgICAvLyBGb3JjZSB0aGUgZGVsZWdhdGUgdmFsaWRhdG9ycyByZWdpc3RyeSB0byBiZSByZWFkIGVhcmx5IHRvIGF2b2lkCi0gICAgLy8gdGhlIG5vbi1zeW5jaHJvbml6ZWQgc2luZ2xldG9uIGlzc3VlIHdoaWNoIG9jY3VycyB3aGVuIHR3byBkZWxlZ2F0aW5nCi0gICAgLy8gdmFsaWRhdG9ycyByYWNlIHRvIGxvYWQgdGhlIHJlZ2lzdHJ5LgotICAgIAotICAgIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gX2luZGV4ZWRWYWxpZGF0b3JzLmdldCh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlpZih2bWQgIT0gbnVsbCkKLQkJCXJldHVybiB2bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0M2U5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1NFTEVDVElPTl9IQU5ETEVSID0gInZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogaGFuZGxlckNsYXNzIC0gKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IQU5ETEVSX0NMQVNTID0gImhhbmRsZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TRUxFQ1RJT05fVFlQRSA9ICJzZWxlY3Rpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIgSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBMaXN0PElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcj4gX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyczsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIGV4dGVuc2lvbiBwb2ludCBhbmQgcGFyc2UgaXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0JCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIFZBTElEQVRJT05fU0VMRUNUSU9OX0hBTkRMRVIpOwotCQlpZiAocG9pbnQgPT0gbnVsbClyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsUmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmICghcmVjb2duaXplZCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogTG9ncyB0aGUgZXJyb3IgaW4gdGhlIGRlc2t0b3AgbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBidWYudG9TdHJpbmcoKSk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhWQUxJREFUSU9OX1NFTEVDVElPTl9IQU5ETEVSKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0vLwkJU3RyaW5nIGhhbmRsZXJDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9IQU5ETEVSX0NMQVNTKTsKLQkJU3RyaW5nIHNlbGVjdGlvblR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0VMRUNUSU9OX1RZUEUpOyAKLQkJCi0JCUlWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhhbmRsZXIgPSAoSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0hBTkRMRVJfQ0xBU1MpOwotCQkJaGFuZGxlci5zZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhzZWxlY3Rpb25UeXBlKTsKLQkJCWdldFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycygpLmFkZChoYW5kbGVyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCSAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcj4gZ2V0VmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzKCkgewotCQlpZiAoX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycyA9PSBudWxsKQotCQkJX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyPigpOwotCQlyZXR1cm4gX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRFeHRlbmRlZFR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgaGFuZGxlciA6IGdldFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycygpKSB7Ci0JCQlyZXN1bHQgPSBoYW5kbGVyLmdldEJhc2VWYWxpZGF0aW9uVHlwZShzZWxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JBY3Rpb25GaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yQWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjQxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlICJhY3Rpb24iIGF0dHJpYnV0ZSBpbiB0aGUgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBjb250cmlidXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOyAvLyROT04tTkxTLTEkIC8vIGlmIHRoZSByZXNvdXJjZSBkZWx0YSBpcyBhbiBhZGRpdGlvbjsgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHBsdWdpbi54bWwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsgLy8kTk9OLU5MUy0xJCAvLyBpZiB0aGUgcmVzb3VyY2UgZGVsdGEgaXMgYSBjaGFuZ2U7IHRoaXMgdmFsdWUgaXMgdXNlZCBpbiBwbHVnaW4ueG1sCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQgLy8gaWYgdGhlIHJlc291cmNlIGRlbHRhIGlzIGEgcmVtb3ZhbDsgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHBsdWdpbi54bWwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQUNUSU9OUyA9IChJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKLQotCXByaXZhdGUgaW50IF9hY3Rpb25UeXBlID0gMDsgLy8gRGVmYXVsdCB0byAwLCBzbyB0aGF0IGlmIGFuIGludmFsaWQgZmlsdGVyIGlzIHNwZWNpZmllZCwgdGhlbiBubwotCi0JLy8gbWF0dGVyIHdoYXQgdGhlIElSZXNvdXJjZURlbHRhIGlzLCB0aGUgZGVsdGEgJiBfYWN0aW9uVHlwZSB3aWxsCi0JLy8gYWx3YXlzID09IDAuIChpLmUuLCB0aGUgcmVzb3VyY2Ugd2lsbCBuZXZlciBiZSBmaWx0ZXJlZCBpbikKLQotCXB1YmxpYyBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCBudW1iZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgdHlwZShzKSBvZiBhY3Rpb25zIHdoaWNoIHRoaXMgZmlsdGVyCi0JICogYWxsb3dzIGluLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWN0aW9uVHlwZSgpIHsKLQkJLy8gU2luY2UgSVJlc291cmNlRGVsdGEncyBjb25zdGFudHMgYXJlIGhleGFkZWNpbWFsIG51bWJlcnMsCi0JCS8vIGl0J3MgbmljZXIgdG8gcmV0dXJuIGEgY29ycmVzcG9uZGluZyBoZXhhZGVjaW1hbCwgZm9yIGJpdHdpc2UgT1IsCi0JCS8vIHRoYW4gaXQgaXMgdG8gaGF2ZSB0aHJlZSBib29sZWFuIG1ldGhvZHMgb24gdGhpcyBjbGFzcywgaS5lLiwKLQkJLy8gaXNBZGQsIGlzQ2hhbmdlLCBpc0RlbGV0ZS4KLQkJcmV0dXJuIF9hY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFBhcnNlIHRoZSBpbmNvbWluZyBzdHJpbmcsIHdoaWNoIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHRvIGRldGVybWluZSB0aGUKLQkgKiB2YWx1ZSBvZiB0aGUgYWN0aW9uVHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgc3RyaW5nIGNhbiBjb250YWluIG9uZSwgdHdvLCBvciB0aHJlZSBjb25zdGFudHMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29uc3RhbnQsIHRoZQotCSAqIGNvbnN0YW50cyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi0JICogPHA+Ci0JICogVGhlc2UgYXJlIHRoZSB0aHJlZSBjb25zdGFudHM6IGFkZCwgY2hhbmdlLCBkZWxldGUuIFRoZSBvcmRlciB0aGF0IHRoZSBjb25zdGFudHMgYXJlCi0JICogc3BlY2lmaWVkIGluIGRvZXMgbm90IG1hdHRlci4gVGhlIGNvbnN0YW50cyBhcmUgY2FzZS1zZW5zaXRpdmU7IGkuZS4sIEFERCBpcyBub3QgY29uc2lkZXJlZAotCSAqIHRoZSBzYW1lIGFzIGFkZC4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGZpbHRlciBpbiBhbGwgdHlwZXMgb2YKLQkgKiBhY3Rpb25zOiBhZGQsIGNoYW5nZSwgZGVsZXRlLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nICJhZGQsCi0JICogY2hhbmdlLCBkZWxldGUiIGFzIHRoZSBhY3Rpb24gYXR0cmlidXRlJ3MgdmFsdWUuCi0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYW5kIG5vbmUgb2YgdGhlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCwgdGhlbiB0aGUgZmlsdGVyIGlzCi0JICogaW52YWxpZCwgYW5kIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsuIChJZiBub25lIG9mIHRoZSBhY3Rpb25zIHNob3VsZCBiZQotCSAqIGZpbHRlcmVkIGluLCB0aGVuIHRoZSBmaWx0ZXIgaXRzZWxmIHNob3VsZCBub3QgZXhpc3QuKQotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBvbmUgb2YgdGhlIGNvbnN0YW50cyBpcyBkZWZpbmVkLCB0aGVuIHRoZSBmb3JtIG9mIHRoZQotCSAqIGFjdGlvbiBzaG91bGQgYmUgbGlrZSB0aGlzOiA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJhZGQiLz4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBhbmQgbW9yZSB0aGFuIG9uZSBjb25zdGFudCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBmb3JtIG9mCi0JICogdGhlIGFjdGlvbiBzaG91bGQgYmUgbGlrZSB0aGlzOiA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJhZGQsIGRlbGV0ZSIvPgotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBhbiB1bmtub3duIGNvbnN0YW50IGlzIGRlZmluZWQsIHRoZW4gdGhlIHVua25vd24KLQkgKiBjb25zdGFudCB3aWxsIGJlIGlnbm9yZWQuIEZvciBleGFtcGxlLCA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJBREQsIGRlbGV0ZSIvPiA8YnI+Ci0JICogaXMgdGhlIHNhbWUgYXMgc3BlY2lmeWluZyA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJkZWxldGUiLz4gPGJyPgotCSAqIGFuZCBpZiBhbGwgb2YgdGhlIGNvbnN0YW50cyBhcmUgdW5rbm93biwgdGhlIGZpbHRlciBpcyBpbnZhbGlkLCBhbmQgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZQotCSAqIFZhbGlkYXRpb24gRnJhbWV3b3JrLiBlLmcuLCA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJBREQsIERFTEVURSIvPiA8YnI+Ci0JICogaXMgdGhlIHNhbWUgYXMgbm90IHNwZWNpZnlpbmcgYSBmaWx0ZXIuCi0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYW5kIGEgY29uc3RhbnQgaXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSwgdGhlIGV4dHJhCi0JICogY29uc3RhbnQgaXMgaWdub3JlZC4gRm9yIGV4YW1wbGUsIDxicj4KLQkgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZmlsdGVyIC4uLiBhY3Rpb249ImFkZCwgY2hhbmdlLCBhZGQiLz4gPGJyPgotCSAqIGlzIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcgPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iYWRkLCBjaGFuZ2UiLz4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25UeXBlcyhTdHJpbmcgYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkvLyB1c2VyIGhhcyBub3QgZGVmaW5lZCB0aGUgImFjdGlvbiIgZWxlbWVudCwgc28gZGVmYXVsdCB0byBldmVyeXRoaW5nCi0JCQlfYWN0aW9uVHlwZSA9IEFMTF9BQ1RJT05TOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFjdGlvbnMsIENPTU1BLCBmYWxzZSk7IC8vIGZhbHNlIG1lYW5zIGRvbid0Ci0JCS8vIHJldHVybiB0aGUgY29tbWEKLQkJLy8gYXMgcGFydCBvZiB0aGUKLQkJLy8gc3RyaW5nCi0JCWludCBpc0FkZCA9IDA7Ci0JCWludCBpc0NoYW5nZSA9IDA7Ci0JCWludCBpc0RlbGV0ZSA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbmV4dEFjdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAobmV4dEFjdGlvbi5lcXVhbHMoQUREKSkgewotCQkJCWlzQWRkID0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JCQl9IGVsc2UgaWYgKG5leHRBY3Rpb24uZXF1YWxzKENIQU5HRSkpIHsKLQkJCQlpc0NoYW5nZSA9IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQl9IGVsc2UgaWYgKG5leHRBY3Rpb24uZXF1YWxzKERFTEVURSkpIHsKLQkJCQlpc0RlbGV0ZSA9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQl9Ci0JCX0KLQkJX2FjdGlvblR5cGUgPSBpc0FkZCB8IGlzQ2hhbmdlIHwgaXNEZWxldGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJZmluYWwgU3RyaW5nIE9OID0gIm9uIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgT0ZGID0gIm9mZiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiICAgICBBY3Rpb25GaWx0ZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICAgICAgIGFkZDogIiArICgoKGdldEFjdGlvblR5cGUoKSAmIElSZXNvdXJjZURlbHRhLkFEREVEKSAhPSAwKSA/IE9OIDogT0ZGKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICAgICAgIGNoYW5nZTogIiArICgoKGdldEFjdGlvblR5cGUoKSAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpICE9IDApID8gT04gOiBPRkYpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCIgICAgICAgICAgZGVsZXRlOiAiICsgKCgoZ2V0QWN0aW9uVHlwZSgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgPyBPTiA6IE9GRikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWEyMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHBsdWdpbi54bWwgdGFncywgZm9yIGEgdmFsaWRhdG9yLCBmb3IgYm90aCBuYW1lIGZpbHRlcnMgYW5kIHR5cGUKLSAqIGZpbHRlcnMuIGkuZS4sIGlmIGFuIG9iamVjdCBoYXMgbmFtZSBmaWx0ZXIgYW5kIHR5cGUgZmlsdGVyIHNwZWNpZmllZCwgdGhlIGZpbHRlciBmaWx0ZXJzIG91dAotICogb2JqZWN0cyB3aGljaCBhcmUgbm90IGJvdGggb2YgdGhhdCB0eXBlIGFuZCBuYW1lZCBsaWtlIHRoZSBmaWx0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGaWx0ZXIgewotCXByaXZhdGUgVmFsaWRhdG9yTmFtZUZpbHRlciBfbmFtZUZpbHRlcjsKLQlwcml2YXRlIFZhbGlkYXRvclR5cGVGaWx0ZXIgX3R5cGVGaWx0ZXI7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIgX2FjdGlvbkZpbHRlcjsKLQotCVZhbGlkYXRvckZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJX25hbWVGaWx0ZXIgPSBuZXcgVmFsaWRhdG9yTmFtZUZpbHRlcigpOwotCQlfdHlwZUZpbHRlciA9IG5ldyBWYWxpZGF0b3JUeXBlRmlsdGVyKCk7Ci0JCV9hY3Rpb25GaWx0ZXIgPSBuZXcgVmFsaWRhdG9yQWN0aW9uRmlsdGVyKCk7Ci0JfQotCi0JVmFsaWRhdG9yRmlsdGVyKFN0cmluZyBtdXN0SW1wbGVtZW50Q2xhc3MpIHsKLQkJdGhpcygpOwotCQlfbmFtZUZpbHRlciA9IG5ldyBWYWxpZGF0b3JOYW1lRmlsdGVyKCk7Ci0JCV90eXBlRmlsdGVyLnNldE11c3RJbXBsZW1lbnRDbGFzcyhtdXN0SW1wbGVtZW50Q2xhc3MpOwotCQlfYWN0aW9uRmlsdGVyID0gbmV3IFZhbGlkYXRvckFjdGlvbkZpbHRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUFjdGlvbihpbnQgcmVzb3VyY2VEZWx0YSkgewotCQlyZXR1cm4gKChyZXNvdXJjZURlbHRhICYgX2FjdGlvbkZpbHRlci5nZXRBY3Rpb25UeXBlKCkpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UncyBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgZmlsdGVyLgotCSAqIAotCSAqIGUuZy4gaWYgdGhlIG5hbWUgZmlsdGVyIGlzICIqLmphdmEiLCBhbmQgdGhpcyByZXNvdXJjZSBpcyAicmVhZG1lLnR4dCIsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZXR1cm4gZmFsc2UuIElmIHRoZSByZXNvdXJjZSBpcyBuYW1lZCAicmVhZG1lLmphdmEiLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gaXNBcHBsaWNhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIF9uYW1lRmlsdGVyLmlzQXBwbGljYWJsZU5hbWUocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UncyB0eXBlIG1hdGNoZXMgdGhlIHR5cGUgZmlsdGVyLgotCSAqIAotCSAqIGUuZy4gaWYgdGhlIHR5cGUgZmlsdGVyIGlzICJJRmlsZSIsIGFuZCB0aGlzIHJlc291cmNlIGlzICJJUHJvamVjdCIsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCi0JICogZmFsc2UuIElmIHRoZSByZXNvdXJjZSBpcyBhbiBJRmlsZSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZVR5cGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBfdHlwZUZpbHRlci5pc0FwcGxpY2FibGVUeXBlKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25GaWx0ZXIoU3RyaW5nIGFjdGlvbnMpIHsKLQkJX2FjdGlvbkZpbHRlci5zZXRBY3Rpb25UeXBlcyhhY3Rpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIGZpbHRlci4KLQkgKi8KLQl2b2lkIHNldE5hbWVGaWx0ZXIoU3RyaW5nIGZpbHRlciwgU3RyaW5nIGlzQ2FzZVNlbnNpdGl2ZVN0cmluZykgewotCQlfbmFtZUZpbHRlci5zZXROYW1lRmlsdGVyKGZpbHRlcik7Ci0JCWlmKGZpbHRlciAhPSBudWxsKQotCQkJICBfbmFtZUZpbHRlci5zZXROYW1lRmlsdGVyRXh0ZW5zaW9uKGdldEZpbHRlckV4dChmaWx0ZXIpKTsKLQkJX25hbWVGaWx0ZXIuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmVTdHJpbmcpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGaWx0ZXJFeHQoU3RyaW5nIGZpbHRlcikgewotCQlyZXR1cm4gZmlsdGVyLnN1YnN0cmluZyhmaWx0ZXIuaW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIGZpbHRlci4KLQkgKi8KLQl2b2lkIHNldFR5cGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQlfdHlwZUZpbHRlci5zZXRUeXBlRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJZmluYWwgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiVmFsaWRhdG9yRmlsdGVyOiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobGluZVNlcCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgbmFtZUZpbHRlciA9ICIgKyBfbmFtZUZpbHRlcik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLQkJYnVmZmVyLmFwcGVuZCgiICAgICB0eXBlRmlsdGVyID0gIiArIF90eXBlRmlsdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXApOwotCQlidWZmZXIuYXBwZW5kKCIgICAgIGFjdGlvbkZpbHRlciA9ICIgKyBfYWN0aW9uRmlsdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXApOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBfbmFtZUZpbHRlci4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTmFtZUZpbHRlciBnZXRfbmFtZUZpbHRlcigpIHsKLQkJcmV0dXJuIF9uYW1lRmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjYzQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgaW5mb3JtYXRpb24sIGFzIHNwZWNpZmllZCBieSBhIHZhbGlkYXRvcidzIHBsdWdpbi54bWwgdGFncy4gVGhlcmUgaXMgb25lCi0gKiBWYWxpZGF0b3JNZXRhRGF0YSBmb3IgZWFjaCBWYWxpZGF0b3IuIE5vIFZhbGlkYXRvciBzaG91bGQgYXR0ZW1wdCB0byBhY2Nlc3MgaXRzCi0gKiBWYWxpZGF0b3JNZXRhRGF0YTsgaXQgaXMgZm9yIHVzZSBieSB0aGUgYmFzZSBmcmFtZXdvcmsgb25seS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvck1ldGFEYXRhIHsKLQlwcml2YXRlIFZhbGlkYXRvckZpbHRlcltdIAkJX2ZpbHRlcnM7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JOYW1lRmlsdGVyW10gCV9wcm9qZWN0TmF0dXJlRmlsdGVyczsKLQlwcml2YXRlIFN0cmluZ1tdIAkJCQlfZmFjZXRGaWx0ZXJzOwotCXByaXZhdGUgSVZhbGlkYXRvciAJCQkJX3ZhbGlkYXRvcjsKLQlwcml2YXRlIElXb3JrYmVuY2hDb250ZXh0IAkJX2hlbHBlcjsKLQlwcml2YXRlIFN0cmluZyAJCQkJCV92YWxpZGF0b3JEaXNwbGF5TmFtZTsKLQlwcml2YXRlIFN0cmluZyAJCQlfdmFsaWRhdG9yVW5pcXVlTmFtZTsKLQlwcml2YXRlIFN0cmluZ1tdIAkJX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzOwotICAgIHByaXZhdGUgU3RyaW5nW10gCQlfY29udGVudFR5cGVJZHMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gCQlfdmFsaWRhdG9yTmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgCQkJX3BsdWdpbklkOwotCXByaXZhdGUgYm9vbGVhbiAJCV9zdXBwb3J0c0luY3JlbWVudGFsID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX0lOQ1JFTUVOVEFMX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBib29sZWFuIAkJX3N1cHBvcnRzRnVsbEJ1aWxkID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX0ZVTExCVUlMRF9ERUZBVUxUOwotCXByaXZhdGUgYm9vbGVhbiAJCV9pc0VuYWJsZWRCeURlZmF1bHQgPSBSZWdpc3RyeUNvbnN0YW50cy5BVFRfRU5BQkxFRF9ERUZBVUxUOwotCXByaXZhdGUgTWlncmF0aW9uTWV0YURhdGEgX21pZ3JhdGlvbk1ldGFEYXRhOwotCXByaXZhdGUgaW50IAkJCV9ydWxlR3JvdXAgPSBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxUOwotCXByaXZhdGUgYm9vbGVhbiAJCV9hc3luYyA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9BU1lOQ19ERUZBVUxUOwotCXByaXZhdGUgYm9vbGVhbiAJCV9kZXBlbmRlbnRWYWxpZGF0b3IgPSBSZWdpc3RyeUNvbnN0YW50cy5ERVBfVkFMX1ZBTFVFX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSAJCV9tYXJrZXJJZHM7Ci0JcHJpdmF0ZSBTdHJpbmcgCQkJX2hlbHBlckNsYXNzTmFtZTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBfaGVscGVyQ2xhc3NFbGVtZW50OwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IF92YWxpZGF0b3JDbGFzc0VsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIAkJX2Nhbm5vdExvYWQ7Ci0JcHJpdmF0ZSBib29sZWFuIAkJX21hbnVhbFZhbGlkYXRpb24gPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiAJCV9idWlsZFZhbGlkYXRpb24gPSB0cnVlOwotCXByaXZhdGUgTWFwPElWYWxpZGF0b3JKb2IsIElXb3JrYmVuY2hDb250ZXh0PiBfaGVscGVycyA9IAotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPElWYWxpZGF0b3JKb2IsIElXb3JrYmVuY2hDb250ZXh0PigpICk7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIAkJX2VuYWJsZW1lbnRFeHByZXNzaW9uOwotCi0JVmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRvIHRoZSBsaXN0IG9mIGNsYXNzIG5hbWVzIG9mIGV2ZXJ5IHZhbGlkYXRvciB3aGljaCB0aGlzIHZhbGlkYXRvciBhZ2dyZWdhdGVzLiBGb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgRUpCIFZhbGlkYXRvciBpbnN0YW50aWF0ZWQgYW5vdGhlciB2YWxpZGF0b3IsIGFuZCBzdGFydGVkIGl0cyB2YWxpZGF0ZQotCSAqIG1ldGhvZCwgdGhlbiB0aGF0IGluc3RhbnRpYXRlZCBjbGFzcycgbmFtZSBzaG91bGQgYmUgaW4gdGhpcyBsaXN0LgotCSAqLwotCXZvaWQgYWRkQWdncmVnYXRlZFZhbGlkYXRvck5hbWVzKFN0cmluZ1tdIHZhbCkgewotCQlfYWdncmVnYXRlZFZhbGlkYXRvcnMgPSB2YWw7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lL3R5cGUgZmlsdGVyIHBhaXIocykuCi0JICovCi0Jdm9pZCBhZGRGaWx0ZXJzKFZhbGlkYXRvckZpbHRlcltdIGZpbHRlcnMpIHsKLQkJX2ZpbHRlcnMgPSBmaWx0ZXJzOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvamVjdCBuYXR1cmUgZmlsdGVyKHMpLgotCSAqLwotCXZvaWQgYWRkUHJvamVjdE5hdHVyZUZpbHRlcnMoVmFsaWRhdG9yTmFtZUZpbHRlcltdIGZpbHRlcnMpIHsKLQkJX3Byb2plY3ROYXR1cmVGaWx0ZXJzID0gZmlsdGVyczsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBmYWNldCAgZmlsdGVyKHMpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZhY2V0RmlsdGVycyhTdHJpbmdbXSBmaWx0ZXJzKSB7Ci0JCV9mYWNldEZpbHRlcnMgPSBmaWx0ZXJzOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmFjZXRGaWx0ZXJzKCkgewotCQlyZXR1cm4gX2ZhY2V0RmlsdGVyczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVGaWx0ZXJzKCkgewotCQlMaXN0PFN0cmluZz4gbmFtZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKF9maWx0ZXJzICE9IG51bGwgJiYgX2ZpbHRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChWYWxpZGF0b3JGaWx0ZXIgZmlsdGVyIDogX2ZpbHRlcnMpIHsKLQkJCQlWYWxpZGF0b3JOYW1lRmlsdGVyIG5hbWVGaWx0ZXIgPSBmaWx0ZXIuZ2V0X25hbWVGaWx0ZXIoKTsKLQkJCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCW5hbWVGaWx0ZXJzLmFkZChuYW1lRmlsdGVyLmdldE5hbWVGaWx0ZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lRmlsdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgY2xhc3MgbmFtZXMgb2YgdGhlIHByaW1hcnkgdmFsaWRhdG9yIGFuZCBpdHMgYWdncmVnYXRlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoKSB7Ci0JCWlmIChfdmFsaWRhdG9yTmFtZXMgPT0gbnVsbCkgewotCQkJaW50IGFMZW5ndGggPSAoX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzID09IG51bGwpID8gMCA6IF9hZ2dyZWdhdGVkVmFsaWRhdG9ycy5sZW5ndGg7Ci0JCQlfdmFsaWRhdG9yTmFtZXMgPSBuZXcgU3RyaW5nW2FMZW5ndGggKyAxXTsgLy8gYWRkIDEgZm9yIHRoZSBwcmltYXJ5IHZhbGlkYXRvciBuYW1lCi0JCQlfdmFsaWRhdG9yTmFtZXNbMF0gPSBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JCQlpZiAoX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KF9hZ2dyZWdhdGVkVmFsaWRhdG9ycywgMCwgX3ZhbGlkYXRvck5hbWVzLCAxLCBhTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3ZhbGlkYXRvck5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBjbGFzcyBuYW1lcyBvZiBldmVyeSB2YWxpZGF0b3Igd2hpY2ggdGhpcyB2YWxpZGF0b3IgYWdncmVnYXRlcy4gRm9yCi0JICogZXhhbXBsZSwgaWYgdGhlIEVKQiBWYWxpZGF0b3IgaW5zdGFudGlhdGVkIGFub3RoZXIgdmFsaWRhdG9yLCBhbmQgc3RhcnRlZCBpdHMgdmFsaWRhdGUKLQkgKiBtZXRob2QsIHRoZW4gdGhhdCBpbnN0YW50aWF0ZWQgY2xhc3MnIG5hbWUgc2hvdWxkIGJlIGluIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWdncmVnYXRlZFZhbGlkYXRvck5hbWVzKCkgewotCQlyZXR1cm4gX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZS90eXBlIGZpbHRlciBwYWlycy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yRmlsdGVyW10gZ2V0RmlsdGVycygpIHsKLQkJcmV0dXJuIF9maWx0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgdm1kJ3MgaGVscGVyIGFuZCB2YWxpZGF0b3IgaGF2ZSBiZWVuIGluc3RhbnRpYXRlZCwgYW5kIGFsc28gaWYgdGhpcwotCSAqIHZhbGlkYXRvcidzIHBsdWdpbiBpcyBhY3RpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCWlmIChfaGVscGVyQ2xhc3NFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChfdmFsaWRhdG9yQ2xhc3NFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoX3BsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgaGVscGVyIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGUuZy4sCi0JICogaWYgdGhlIGhlbHBlcidzIHBsdWdpbiBpcyBkaXNhYmxlZCBmb3Igc29tZSByZWFzb24uIEJlZm9yZSB0aGUgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpcwotCSAqIHRocm93biwgdGhpcyB2YWxpZGF0b3Igd2lsbCBiZSBkaXNhYmxlZC4KLQkgKiAKLQkgKiBUaGUgSVdvcmtiZW5jaENvbnRleHQgbXVzdCBBTFdBWVMgaGF2ZSBpdHMgcHJvamVjdCBzZXQgYmVmb3JlIGl0IGlzIHVzZWQ7IGJ1dCBpdCBjYW4ndCBiZQotCSAqIGNyZWF0ZWQgd2l0aCB0aGUgSVByb2plY3QuIFNvLCBiZWZvcmUgdXNpbmcgdGhlIHNpbmdsZSBpbnN0YW5jZSwgYWx3YXlzIGluaXRpYWxpemUgdGhhdAotCSAqIGluc3RhbmNlIHdpdGggdGhlIElQcm9qZWN0LgotCSAqIAotCSAqIElmIHRoaXMgdmFsaWRhdG9yIHN1cHBvcnRzIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uLCB0aGVuIGluc3RlYWQgb2YgbWFpbnRhaW5pbmcgYSBzaW5nbGUgdGhlCi0JICogaGVscGVyIGluc3RhbmNlLCBjcmVhdGUgYSBuZXcgSVdvcmtiZW5jaENvbnRleHQgaW5zdGFuY2UgZXZlcnkgdGltZSB0aGF0IHRoZSBoZWxwZXIgaXMgbmVlZGVkLgotCSAqIFRoaXMgZmVhdHVyZSBpcyBwcm92aWRlZCBiZWNhdXNlIHNldmVyYWwgdmFsaWRhdGlvbiBSdW5uYWJsZXMgbWF5IGJlIHF1ZXVlZCB0byBydW4sIGFuZCBpZgotCSAqIHRob3NlIFJ1bm5hYmxlcydzIHByb2plY3QgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgdmFsaWRhdGlvbidzIHByb2plY3QsIHRoZW4gdGhlCi0JICogY3VycmVudCB2YWxpZGF0aW9uIHdpbGwgc3VkZGVubHkgc3RhcnQgdmFsaWRhdGluZyBhbm90aGVyIHByb2plY3QuCi0JICovCi0JLy9UT0RPIGp1c3Qgd2FudCB0byByZW1lbWJlciB0byBmaWd1cmUgb3V0IHRoZSBtYW55LXRlbXBvcmFyeS1vYmplY3RzIHByb2JsZW0gaWYgdGhpcyBtZXRob2QKLQkvLyBjb250aW51ZXMgdG8gbmV3IGFuIElWYWxpZGF0aW9uQ29udGV4dCBldmVyeSB0aW1lIC0gUnV0aAotCXB1YmxpYyBJV29ya2JlbmNoQ29udGV4dCBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlpZiAoX2hlbHBlciA9PSBudWxsKSB7Ci0JCQlfaGVscGVyID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmNyZWF0ZUhlbHBlcihfaGVscGVyQ2xhc3NFbGVtZW50LCBfaGVscGVyQ2xhc3NOYW1lKTsKLQkJCWlmIChfaGVscGVyID09IG51bGwpIHsKLQkJCQlfaGVscGVyID0gbmV3IFdvcmtiZW5jaENvbnRleHQoKTsKLQkJCQkvL3NldENhbm5vdExvYWQoKTsKLQkJCQkvL3Rocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfRElTQUJMRUgsIG5ldyBTdHJpbmdbXXtfaGVscGVyQ2xhc3NOYW1lLCBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCl9KSk7Ci0JCQl9Ci0JCQkvLyBXb24ndCBiZSB1c2luZyB0aGUgZWxlbWVudCAmIG5hbWUgYWdhaW4sIHNvIGNsZWFyIHRoZW0uCi0JCQkvL19oZWxwZXJDbGFzc0VsZW1lbnQgPSBudWxsOwotCQkJLy9faGVscGVyQ2xhc3NOYW1lID0gbnVsbDsKLQkJfQotCQlpZiAoKF9oZWxwZXIuZ2V0UHJvamVjdCgpID09IG51bGwpIHx8ICEoX2hlbHBlci5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSkgewotCQkJLy8gSW5pdGlhbGl6ZSBoZWxwZXIgd2l0aCB0aGUgbmV3IHByb2plY3QKLQkJCV9oZWxwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gX2hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBjYW5ub3RMb2FkIGlzIGZhbHNlIGlmIGJvdGggdGhlIElWYWxpZGF0b3IgYW5kIElXb3JrYmVuY2hDb250ZXh0IGluc3RhbmNlIGNhbiBiZSBpbnN0YW50aWF0ZWQuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgYW5kIG9ubHkgaWYgYW4KLQkgKiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHdhcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGNhbgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDYW5ub3RMb2FkKCkgewotCQlfY2Fubm90TG9hZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZhbHNlIGlmIGJvdGggdGhlIElWYWxpZGF0b3IgYW5kIElXb3JrYmVuY2hDb250ZXh0IGluc3RhbmNlIGNhbiBiZSBpbnN0YW50aWF0ZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2Fubm90TG9hZCgpIHsKLQkJcmV0dXJuIF9jYW5ub3RMb2FkOwotCX0KLQotCXB1YmxpYyBNaWdyYXRpb25NZXRhRGF0YSBnZXRNaWdyYXRpb25NZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF9taWdyYXRpb25NZXRhRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElSdWxlR3JvdXAgaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGdyb3VwcyBvZiBydWxlcyB0aGlzIHZhbGlkYXRvciByZWNvZ25pemVzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbHRlcnMgd2hpY2ggaWRlbnRpZnkgd2hpY2ggcHJvamVjdChzKSB0aGlzIHZhbGlkYXRvciBtYXkgcnVuIG9uLgotCSAqLwotCVZhbGlkYXRvck5hbWVGaWx0ZXJbXSBnZXRQcm9qZWN0TmF0dXJlRmlsdGVycygpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmF0dXJlRmlsdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB2YWxpZGF0b3IgaWYgaXQgY2FuIGJlIGxvYWRlZDsgaWYgdGhlIHZhbGlkYXRvciBjYW5ub3QgYmUgbG9hZGVkLAotCSAqIGUuZy4sIGlmIGl0cyBwbHVnaW4gaXMgZGlzYWJsZWQgZm9yIHNvbWUgcmVhc29uLCB0aGVuIHRoaXMgbWV0aG9kIHRocm93cyBhbgotCSAqIEluc3RhbnRpYXRpb25FeGNlcHRpb24uIEJlZm9yZSB0aGUgQ29yZUV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoaXMgdmFsaWRhdG9yIGlzIGRpc2FibGVkLgotCSAqIAotCSAqIEByZXR1cm4gSVZhbGlkYXRvcgotCSAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKF92YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJX3ZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5jcmVhdGVWYWxpZGF0b3IoX3ZhbGlkYXRvckNsYXNzRWxlbWVudCwgZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQotCQkJLy8gU2luY2UgdGhlIGVsZW1lbnQgd29uJ3QgYmUgdXNlZCBhbnkgbW9yZSwgY2xlYXIgaXQuCi0JCQkvL192YWxpZGF0b3JDbGFzc0VsZW1lbnQgPSBudWxsOwotCi0JCQlpZiAoX3ZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQkJc2V0Q2Fubm90TG9hZCgpOwotCQkJCXRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfRElTQUJMRVYsIG5ldyBTdHJpbmdbXXtnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCl9KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3JEaXNwbGF5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yVW5pcXVlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgYXBwbGljYWJsZSB0byB0aGUgVmFsaWRhdG9yIHdoaWNoIHRoaXMgVmFsaWRhdG9yTWV0YURhdGEgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgsIHJldHVybiB0cnVlOyBlbHNlIHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBBIHJlc291cmNlIGlzIGFwcGxpY2FibGUgaWYgaXQgcGFzc2VzIHRoZSBuYW1lL3R5cGUgZmlsdGVycy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHRoZXJlCi0JICogaXMgbm8gcmVzb3VyY2UgZGVsdGEgKGkuZS4sIGEgZnVsbCB2YWxpZGF0aW9uKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzQXBwbGljYWJsZVRvKHJlc291cmNlLCBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIuQUxMX0FDVElPTlMpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSByZXNvdXJjZSBpcyBhcHBsaWNhYmxlIHRvIHRoZSBWYWxpZGF0b3Igd2hpY2ggdGhpcyBWYWxpZGF0b3JNZXRhRGF0YSBpcyBhc3NvY2lhdGVkCi0JICogd2l0aCwgcmV0dXJuIHRydWU7IGVsc2UgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEEgcmVzb3VyY2UgaXMgYXBwbGljYWJsZSBpZiBpdCBwYXNzZXMgdGhlIG5hbWUvdHlwZSBmaWx0ZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZVRvKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlc291cmNlRGVsdGEpIHsKLQkJLy8gSWYgbm8gZmlsdGVycyBhcmUgc3BlY2lmaWVkLCB0aGVuIGV2ZXJ5IHR5cGUgb2YgcmVzb3VyY2Ugc2hvdWxkIGJlIHZhbGlkYXRlZC90cmlnZ2VyIGEKLQkJLy8gcmVidWlsZCBvZiB0aGUgbW9kZWwgY2FjaGUKLQkJaWYgKF9maWx0ZXJzID09IG51bGwpcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGlzQXBwbGljYWJsZVRvKHJlc291cmNlLCByZXNvdXJjZURlbHRhLCBfZmlsdGVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc291cmNlIHBhc3NlcyB0aGUgbmFtZS90eXBlIGZpbHRlcnMgZm9yIHRoaXMgdmFsaWRhdG9yLgotCSAqLwotCWJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVzb3VyY2VEZWx0YSwgVmFsaWRhdG9yRmlsdGVyW10gZmlsdGVycykgewotCQkvLyBBcmUgYW55IG9mIHRoZSBmaWx0ZXJzIHNhdGlzZmllZD8gKGkuZS4sIE9SIHRoZW0sIG5vdCBBTkQgdGhlbS4pCi0JCWlmIChjaGVja0lmVmFsaWRTb3VyY2VGaWxlKHJlc291cmNlKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yRmlsdGVyIGZpbHRlciA9IGZpbHRlcnNbaV07Ci0JCQkJaWYgKGZpbHRlci5pc0FwcGxpY2FibGVUeXBlKHJlc291cmNlKQotCQkJCQkJJiYgZmlsdGVyLmlzQXBwbGljYWJsZU5hbWUocmVzb3VyY2UpCi0JCQkJCQkmJiBmaWx0ZXIuaXNBcHBsaWNhYmxlQWN0aW9uKHJlc291cmNlRGVsdGEpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCWlmIChnZXRDb250ZW50VHlwZUlkcygpICE9IG51bGwpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJCQlkZXNjcmlwdGlvbiA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vUmVzb3VyY2UgZXhjZXB0aW9ucwotCQkJfQotCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGlzQXBwbGljYWJsZUNvbnRlbnRUeXBlKGRlc2NyaXB0aW9uKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZWYWxpZFNvdXJjZUZpbGUoSVJlc291cmNlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlJUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgaGVscGVyID0gVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0VmFsaWRhdGlvbkhlbHBlcigpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKGhlbHBlciA9PSBudWxsIHx8IHByb2plY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCUlDb250YWluZXJbXSBvdXRwdXRDb250YWluZXJzID0gaGVscGVyLmdldE91dHB1dENvbnRhaW5lcnMocHJvamVjdCk7Ci0JCQlJQ29udGFpbmVyW10gc291cmNlQ29udGFpbmVycyA9IGhlbHBlci5nZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQkJZm9yIChpbnQgaT0wOyBpPG91dHB1dENvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgb3V0cHV0UGF0aCA9IG91dHB1dENvbnRhaW5lcnNbaV0uZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJCQlpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChvdXRwdXRQYXRoKSkgewotCQkJCQkvL1RoZSBmaWxlIGlzIGluIGFuIG91dHB1dCBjb250YWluZXIuCi0JCQkJCS8vSWYgaXQgaXMgYSBzb3VyY2UgY29udGFpbmVyIHJldHVybiB0cnVlIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JCQkJCWZvciAoaW50IGo9MDtqPHNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoOyBqKyspIHsKLQkgICAgICAgICAgICAgICAgICAgIGlmKG91dHB1dENvbnRhaW5lcnNbaV0uZXF1YWxzKHNvdXJjZUNvbnRhaW5lcnNbal0pKXsKLQkgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCQkKLQkvKioKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciByZWNvZ25pemVzIHRoZSBwcm9qZWN0IG5hdHVyZSwgd2hldGhlciBpbmNsdWRlZCBvciBleGNsdWRlZCwgcmV0dXJuIHRoZQotCSAqIG5hbWUgZmlsdGVyIHdoaWNoIGRlc2NyaWJlcyB0aGUgbmF0dXJlLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JVmFsaWRhdG9yTmFtZUZpbHRlciBmaW5kUHJvamVjdE5hdHVyZShTdHJpbmcgcHJvaklkKSB7Ci0JCWlmIChwcm9qSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoX3Byb2plY3ROYXR1cmVGaWx0ZXJzID09IG51bGwpIHsKLQkJCS8vIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQsIHRoaXMgdmFsaWRhdG9yIGlzIGNvbmZpZ3VyZWQgb24gYWxsIElQcm9qZWN0cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9wcm9qZWN0TmF0dXJlRmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTmFtZUZpbHRlciBmaWx0ZXIgPSBfcHJvamVjdE5hdHVyZUZpbHRlcnNbaV07Ci0JCQkvLyBJbiB0aGlzIGNhc2UsIHdlJ3JlIG5vdCBjaGVja2luZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmlsdGVyIGNsYXNzLAotCQkJLy8gYnV0IGlmIGl0IGhhcyB0aGUgTmF0dXJlIHNwZWNpZmllZCBpbiB0aGUgZmlsdGVyIGNsYXNzLgotCQkJU3RyaW5nIHByb2plY3ROYXR1cmVJRCA9IGZpbHRlci5nZXROYW1lRmlsdGVyKCk7Ci0JCQlpZiAocHJvaklkLmVxdWFscyhwcm9qZWN0TmF0dXJlSUQpKSB7Ci0JCQkJcmV0dXJuIGZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFJhdGhlciB0aGFuIHN0b3JlIHRoZSBpcy10aGlzLXZtZC1jb25maWd1cmVkLW9uLXRoaXMtSVByb2plY3QgYWxnb3JpdGhtCi0JICogaW4gdHdvIHBsYWNlcywgcmVmZXIgYmFjayB0byB0aGUgcmVhZGVyJ3MgY2FjaGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkT25Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3QodGhpcywgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0KCkgewotCQlyZXR1cm4gX2lzRW5hYmxlZEJ5RGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudGFsKCkgewotCQlyZXR1cm4gX3N1cHBvcnRzSW5jcmVtZW50YWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGdWxsQnVpbGQoKSB7Ci0JCXJldHVybiBfc3VwcG9ydHNGdWxsQnVpbGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpcyB0aHJlYWQtc2FmZSBhbmQgY2FuIGJlIHJ1biBhc3luY2hyb25vdXNseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jKCkgewotCQlyZXR1cm4gX2FzeW5jOwotCX0KLQotCXZvaWQgc2V0SGVscGVyQ2xhc3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBoZWxwZXJDbGFzc05hbWUpIHsKLQkJX2hlbHBlckNsYXNzRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCV9oZWxwZXJDbGFzc05hbWUgPSBoZWxwZXJDbGFzc05hbWU7Ci0JfQotCi0Jdm9pZCBzZXRFbmFibGVkQnlEZWZhdWx0KGJvb2xlYW4gZW5hYmxlZEJ5RGVmYXVsdCkgewotCQlfaXNFbmFibGVkQnlEZWZhdWx0ID0gZW5hYmxlZEJ5RGVmYXVsdDsKLQl9Ci0KLQl2b2lkIHNldEluY3JlbWVudGFsKGJvb2xlYW4gaXNJbmNyZW1lbnRhbCkgewotCQlfc3VwcG9ydHNJbmNyZW1lbnRhbCA9IGlzSW5jcmVtZW50YWw7Ci0JfQotCi0Jdm9pZCBzZXRGdWxsQnVpbGQoYm9vbGVhbiBmdWxsQnVpbGQpIHsKLQkJX3N1cHBvcnRzRnVsbEJ1aWxkID0gZnVsbEJ1aWxkOwotCX0KLQotCXZvaWQgc2V0QXN5bmMoYm9vbGVhbiBpc0FzeW5jKSB7Ci0JCV9hc3luYyA9IGlzQXN5bmM7Ci0JfQotCi0Jdm9pZCBzZXRNaWdyYXRpb25NZXRhRGF0YShNaWdyYXRpb25NZXRhRGF0YSBtbWQpIHsKLQkJX21pZ3JhdGlvbk1ldGFEYXRhID0gbW1kOwotCX0KLQotCXZvaWQgc2V0UnVsZUdyb3VwKGludCBydWxlR3JvdXApIHsKLQkJX3J1bGVHcm91cCA9IHJ1bGVHcm91cDsKLQl9Ci0KLQl2b2lkIHNldFZhbGlkYXRvckNsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCV92YWxpZGF0b3JDbGFzc0VsZW1lbnQgPSBlbGVtZW50OwotCQkvLyB2YWxpZGF0b3IgY2xhc3MgbmFtZSA9PSB2YWxpZGF0b3JVbmlxdWVOYW1lCi0JfQotCi0Jdm9pZCBzZXRWYWxpZGF0b3JEaXNwbGF5TmFtZShTdHJpbmcgdmFsaWRhdG9yTmFtZSkgewotCQlfdmFsaWRhdG9yRGlzcGxheU5hbWUgPSB2YWxpZGF0b3JOYW1lOwotCX0KLQotCXZvaWQgc2V0VmFsaWRhdG9yVW5pcXVlTmFtZShTdHJpbmcgdmFsaWRhdG9yVW5pcXVlTmFtZSkgewotCQlfdmFsaWRhdG9yVW5pcXVlTmFtZSA9IHZhbGlkYXRvclVuaXF1ZU5hbWU7Ci0JfQotCi0Jdm9pZCBzZXRQbHVnaW5JZChTdHJpbmcgdmFsaWRhdG9yUGx1Z2luSWQpIHsKLQkJX3BsdWdpbklkID0gdmFsaWRhdG9yUGx1Z2luSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTWlncmF0aW9uTWV0YURhdGEgewotCQlwcml2YXRlIFNldCBfaWRzID0gbnVsbDsKLQotCQlwdWJsaWMgTWlncmF0aW9uTWV0YURhdGEoKSB7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHZvaWQgYWRkSWQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHsKLQkJCWlmIChvbGRJZCA9PSBudWxsKXJldHVybjsKLQkJCWlmIChuZXdJZCA9PSBudWxsKXJldHVybjsKLQotCQkJU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tde29sZElkLCBuZXdJZH07Ci0JCQlnZXRJZHMoKS5hZGQoaWRzKTsKLQkJfQotCi0JCXB1YmxpYyBTZXQgZ2V0SWRzKCkgewotCQkJaWYgKF9pZHMgPT0gbnVsbClfaWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXJldHVybiBfaWRzOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVwZW5kZW50VmFsaWRhdG9yKGJvb2xlYW4gYikgewotCQlfZGVwZW5kZW50VmFsaWRhdG9yID0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVudFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF9kZXBlbmRlbnRWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXJrZXJJZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFya2VySWRzKCkgewotCQlyZXR1cm4gX21hcmtlcklkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFya2VySWQKLQkgKiAgICAgICAgICAgIFRoZSBtYXJrZXJJZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya2VySWRzKFN0cmluZ1tdIG1hcmtlcklkKSB7Ci0JCXRoaXMuX21hcmtlcklkcyA9IG1hcmtlcklkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQnVpbGRWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gX2J1aWxkVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsKLQkJdGhpcy5fYnVpbGRWYWxpZGF0aW9uID0gYnVpbGRWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFudWFsVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIF9tYW51YWxWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uKSB7Ci0JCXRoaXMuX21hbnVhbFZhbGlkYXRpb24gPSBtYW51YWxWYWxpZGF0aW9uOwotCX0KLSAgCi0JLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIHZhbGlkYXRvciBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSBvYmplY3QgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4gCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIG9iamVjdCBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGluZygpIHsKLSAgICBTdHJpbmcgdGFyZ2V0SUQgPSBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgcmV0dXJuIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuaGFzRGVsZWdhdGVzKHRhcmdldElEKTsKLSAgfQotICAKLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuICBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlVmFsaWRhdG9yKF92YWxpZGF0b3JDbGFzc0VsZW1lbnQsIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBJV29ya2JlbmNoQ29udGV4dCBjcmVhdGVIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlSGVscGVyKF9oZWxwZXJDbGFzc0VsZW1lbnQsIF9oZWxwZXJDbGFzc05hbWUpOwotCQlpZiAoaGVscGVyID09IG51bGwpIHsKLQkJCWhlbHBlciA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCX0KLQkJaGVscGVyLnNldFByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQkgIAotCQotICAgcHVibGljIHZvaWQgYWRkSGVscGVyKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyICl7Ci0JICAgX2hlbHBlcnMucHV0KCB2YWxpZGF0b3IsIGhlbHBlciApOwotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCByZW1vdmVIZWxwZXIoIElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yICl7Ci0JICAgX2hlbHBlcnMucmVtb3ZlKCB2YWxpZGF0b3IgKTsKLSAgIH0KLSAgIAotICAgcHJpdmF0ZSBJV29ya2JlbmNoQ29udGV4dCBnZXRIZWxwZXIoIElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yICl7Ci0JICAgcmV0dXJuIF9oZWxwZXJzLmdldCggdmFsaWRhdG9yICk7Ci0gICB9ICAgCi0gICAKLSAgIHB1YmxpYyBJV29ya2JlbmNoQ29udGV4dCBnZXRIZWxwZXIoIElQcm9qZWN0IHByb2plY3QsIElWYWxpZGF0b3IgdmFsaWRhdG9yICl7Ci0JICAgCi0JICAgaWYoIHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJICAgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gZ2V0SGVscGVyKCAoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IgKTsKLQkJICAgaWYoIGhlbHBlciA9PSBudWxsICl7Ci0JCQkgICB0cnl7Ci0JCQkJaGVscGVyID0gIGdldEhlbHBlciggcHJvamVjdCApOwotCQkJCXJldHVybiBoZWxwZXI7Ci0JCQkgICB9Y2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0JCQkgICAKLQkJICAgfQotCSAgIAlyZXR1cm4gaGVscGVyOwotCSAgIH0KLQkgICBlbHNlewotCQkgICB0cnkgewotCQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gIGdldEhlbHBlciggcHJvamVjdCApOwotCQkJcmV0dXJuIGhlbHBlcjsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JICAgfQotCSAgIAotCSAgIHJldHVybiBudWxsOwotICAgfSAgIAotICAgCi0gICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbmFibGVtZW50RXhwcmVzaW9uKCkgewotCQlyZXR1cm4gX2VuYWJsZW1lbnRFeHByZXNzaW9uOwotCX0KLQotICAgcHVibGljIHZvaWQgc2V0RW5hYmxlbWVudEVsZW1lbnQoRXhwcmVzc2lvbiBlbmFibGVtZW50RWxlbWVudCkgewotCSBfZW5hYmxlbWVudEV4cHJlc3Npb24gPSBlbmFibGVtZW50RWxlbWVudDsKLQl9Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZUlkcygpIHsKLQlyZXR1cm4gX2NvbnRlbnRUeXBlSWRzOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZUlkcyhTdHJpbmdbXSBjb250ZW50VHlwZUlkcykgewotCXRoaXMuX2NvbnRlbnRUeXBlSWRzID0gY29udGVudFR5cGVJZHM7Ci19Ci0KLSAKLXByaXZhdGUgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZW50VHlwZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2MpewotCQotCUlDb250ZW50VHlwZSBjdCA9IGRlc2MuZ2V0Q29udGVudFR5cGUoKTsKLQlTdHJpbmdbXSBhcHBsaWNhYmxlQ29udGVudFR5cGVzID0gZ2V0Q29udGVudFR5cGVJZHMoKTsKLQlpZiAoYXBwbGljYWJsZUNvbnRlbnRUeXBlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwbGljYWJsZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkgKyspewotCQkJaWYoYXBwbGljYWJsZUNvbnRlbnRUeXBlc1tpXS5lcXVhbHMoY3QuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck5hbWVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTmFtZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDZjZmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBuYW1lIGZpbHRlciB0YWcgaW4gYSB2YWxpZGF0b3IncyBwbHVnaW4ueG1sIGZpbGUuIGUuZy4gJmx0O2ZpbHRlciBuYW1lPSIqLioiPiBUaGVuCi0gKiB0aGlzIGNsYXNzIHdvdWxkIHN0b3JlIHRoZSAiKi4qIiwgYW5kIHByb3ZpZGUgdGhlIHdpbGRjYXJkIG1hdGNoaW5nIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JOYW1lRmlsdGVyIHsKLQlwcml2YXRlIFN0cmluZyBfbmFtZUZpbHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lRmlsdGVyRXh0ZW5zaW9uOwotCXByaXZhdGUgYm9vbGVhbiBfaW5jbHVkZSA9IHRydWU7IC8vIGJ5IGRlZmF1bHQsIGZpbHRlciBpbiB0aGUgSUZpbGUgc3BlY2lmaWVkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdJTERDQVJEID0gIioiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIF9pc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOyAvLyBieSBkZWZhdWx0LCB0aGUgZmlsdGVyIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzQvMDAgMTE6MDg6NDEgQU0pCi0JICovCi0JVmFsaWRhdG9yTmFtZUZpbHRlcigpIHsKLQkJLy9kZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWx0ZXIsIGFzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sCi0JICovCi0JU3RyaW5nIGdldE5hbWVGaWx0ZXIoKSB7Ci0JCXJldHVybiBfbmFtZUZpbHRlcjsKLQl9Ci0KLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIF9pc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JYm9vbGVhbiBpc0luY2x1ZGUoKSB7Ci0JCXJldHVybiBfaW5jbHVkZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYm90aCBhcHBsaWNhYmxlIGFuZCBpbmNsdWRlPSJ0cnVlIi4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZVRvKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKGlzQXBwbGljYWJsZU5hbWUocmVzb3VyY2UpICYmIGlzSW5jbHVkZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZUZpbHRlckV4dGVuc2lvbihTdHJpbmcgZmlsdGVyRXh0KSB7Ci0JCW5hbWVGaWx0ZXJFeHRlbnNpb24gPSBmaWx0ZXJFeHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBtYXRjaGVzIHRoZSBmaWx0ZXIsIG9yIGlmIHRoZXJlIGlzIG5vIGZpbHRlcgotCSAqIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBJZiBuYW1lIGZpbHRlciBpcyBudWxsLCBtZWFucyBmaWx0ZXIgb3V0IG5vIG5hbWVzLgotCQkvLyBPdGhlcndpc2UsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGdpdmVuIG5hbWUgbWF0Y2hlcwotCQkvLyB0aGUgbmFtZSBmaWx0ZXIuCi0JCWlmIChfbmFtZUZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBuYW1lIGlzIGV4YWN0IG1hdGNoIG9mIHRoZSBfbmFtZUZpbHRlcgotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKF9uYW1lRmlsdGVyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCWludCBpbmRleE9mU3RhckRvdCA9IF9uYW1lRmlsdGVyLmluZGV4T2YoIiouIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvL3JldHVybiB2YWx1ZSBpZiB0aGUgZmlsdGVyIG5hbWUgZXh0ZW5zaW9uIG1hdGNoZXMgdGhlIGV4dGVuc2lvbgotCQkvL29mIHRoZSByZXNvdXJjZSAKLQkJaWYgKGluZGV4T2ZTdGFyRG90ICE9IC0xKSB7Ci0JCQlTdHJpbmcgbmFtZUV4dGVuc2lvbiA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZUZpbHRlckV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKG5hbWVFeHRlbnNpb24pOwotCQl9Ci0KLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCi0JCXJldHVybiB2ZXJpZnlOYW1lTWF0Y2goX25hbWVGaWx0ZXIsIG5hbWUpOwotCX0KLQotCXZvaWQgc2V0SW5jbHVkZShTdHJpbmcgaW5jbHVkZVZhbHVlKSB7Ci0JCWlmIChpbmNsdWRlVmFsdWUgIT0gbnVsbCkgewotCQkJc2V0SW5jbHVkZShCb29sZWFuLnZhbHVlT2YoaW5jbHVkZVZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldEluY2x1ZGUoYm9vbGVhbiBpbmNsdWRlQm9vbCkgewotCQlfaW5jbHVkZSA9IGluY2x1ZGVCb29sOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmlsdGVyLCBhcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbAotCSAqLwotCXZvaWQgc2V0TmFtZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCV9uYW1lRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShTdHJpbmcgaXNDYXNlU2Vuc2l0aXZlU3RyaW5nKSB7Ci0JCWlmIChpc0Nhc2VTZW5zaXRpdmVTdHJpbmcgIT0gbnVsbCkgewotCQkJLy8gb25seSBjaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgaWYgdGhlIGNhc2Utc2Vuc2l0aXZlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkCi0JCQlfaXNDYXNlU2Vuc2l0aXZlID0gQm9vbGVhbi52YWx1ZU9mKGlzQ2FzZVNlbnNpdGl2ZVN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJOYW1lRmlsdGVyOlxuXHRuYW1lRmlsdGVyID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChfbmFtZUZpbHRlcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBmaWx0ZXIuCi0JICogCi0JICogVGhlIG9ubHkgZmlsdGVyIHdpbGRjYXJkIGFsbG93ZWQgaXMgJyonLgotCSAqLwotCXN0YXRpYyBib29sZWFuIHZlcmlmeU5hbWVNYXRjaChmaW5hbCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgbmFtZSkgewotCQkvKgotCQkgKiBUaGVyZSBhcmUgZWlnaHQgcG9zc2libGUgd2lsZGNhcmQgY29tYmluYXRpb25zLCBnaXZlbiB0aGF0IGEgd2lsZGNhcmQgbWF5LCBpZiBwcmVzZW50LCBiZQotCQkgKiBhdCB0aGUgYmVnaW5uaW5nLCBtaWRkbGUsIG9yIGVuZCBvZiBhIG5hbWU7IG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aG9zZSBwb3NpdGlvbnMuIGkuZS4sCi0JCSAqIAotCQkgKiBiZWdpbm5pbmcgbWlkZGxlIGVuZCAwIDAgMCAwIDAgMSAwIDEgMCAwIDEgMSAxIDAgMCAxIDAgMSAxIDEgMCAxIDEgMQotCQkgKiAgCi0JCSAqLwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWx0ZXIsIFdJTERDQVJELCB0cnVlKTsKLQkJYm9vbGVhbiB3aWxkY2FyZEZsYWcgPSBmYWxzZTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2tlbi5lcXVhbHMoV0lMRENBUkQpKSB7Ci0JCQkJd2lsZGNhcmRGbGFnID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdpbGRjYXJkRmxhZykgewotCQkJCQlpbnQgdG9rZW5JbmRleCA9IG5hbWUuaW5kZXhPZih0b2tlbik7Ci0JCQkJCWlmICh0b2tlbkluZGV4ID49IDApIHsKLQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyh0b2tlbkluZGV4ICsgdG9rZW4ubGVuZ3RoKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCh0b2tlbikpIHsKLQkJCQkJCWludCB0b2tlbkluZGV4ID0gdG9rZW4ubGVuZ3RoKCk7Ci0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcodG9rZW5JbmRleCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd2lsZGNhcmRGbGFnID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCF3aWxkY2FyZEZsYWcpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JUeXBlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclR5cGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiNDYxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclR5cGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSB0eXBlIGZpbHRlciB0YWcgaW4gYSB2YWxpZGF0b3IncyBwbHVnaW4ueG1sIGZpbGUuIGUuZy4gJmx0O2ZpbHRlcgotICogb2JqZWN0Q2xhc3M9ImNvbS5pYm0uZm9vLk15Q2xhc3MiPiBUaGVuIHRoaXMgY2xhc3Mgd291bGQgc3RvcmUgdGhlICJjb20uaWJtLmZvby5NeUNsYXNzIiwgYW5kCi0gKiBwcm92aWRlIHRoZSAiaW5zdGFuY2VvZiIgbWF0Y2hpbmcgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclR5cGVGaWx0ZXIgewotCXByaXZhdGUgQ2xhc3MgX3R5cGVGaWx0ZXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX211c3RJbXBsZW1lbnRDbGFzcyA9IG51bGw7IC8vIHRoZSB0eXBlIHNldCBpbiBzZXRUeXBlRmlsdGVyIG11c3QgaW1wbGVtZW50IHRoZQotCi0JLy8gY2xhc3MvaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgdGhpcyBmdWxseS1xdWFsaWZpZWQKLQkvLyBKYXZhIHN0cmluZy4KLQotCVZhbGlkYXRvclR5cGVGaWx0ZXIoKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCVZhbGlkYXRvclR5cGVGaWx0ZXIoU3RyaW5nIG11c3RJbXBsZW1lbnRDbGFzcykgewotCQlzZXRNdXN0SW1wbGVtZW50Q2xhc3MobXVzdEltcGxlbWVudENsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBlIGZpbHRlcnMgYXJlIGFsbG93ZWQgb25seSBmb3IgY2VydGFpbiB0eXBlcyBvZiBjbGFzc2VzLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mCi0JICogdGhlIGNsYXNzIHdoaWNoIHRoaXMgdHlwZSBtdXN0IGltcGxlbWVudCBiZWZvcmUgaXQgY2FuIGJlIGEgZmlsdGVyLgotCSAqLwotCVN0cmluZyBnZXRNdXN0SW1wbGVtZW50Q2xhc3MoKSB7Ci0JCXJldHVybiBfbXVzdEltcGxlbWVudENsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBmaWx0ZXIgYXMgYSBqYXZhLmxhbmcuQ2xhc3Mgb2JqZWN0LgotCSAqLwotCUNsYXNzIGdldFR5cGVGaWx0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIF90eXBlRmlsdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXNvdXJjZSBwYXNzZWQgaW4gZWl0aGVyIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIGZpbHRlciBjbGFzcywgb3IgaWYKLQkgKiB0aGVyZSBpcyBubyB0eXBlIGZpbHRlciBjbGFzcyBkZWZpbmVkIGluIHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVHlwZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gSWYgdHlwZSBmaWx0ZXIgaXMgbnVsbCwgbWVhbnMgZmlsdGVyIG91dCBubyB0eXBlcy4KLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0eXBlIGlzIGFuIGluc3RhbmNlIG9mCi0JCS8vIHRoZSB0eXBlIGZpbHRlci4KLQkJaWYgKF90eXBlRmlsdGVyQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIElmIHRoZSByZXNvdXJjZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBmaWx0ZXIgY2xhc3MuCi0JCXJldHVybiBpc0luc3RhbmNlKHJlc291cmNlLmdldENsYXNzKCksIF90eXBlRmlsdGVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWx0ZXJDbGFzcyBpcyBhIHBhcmVudCAoaW50ZXJmYWNlIG9yIHN1cGVyY2xhc3MpIG9mIG9iamVjdENsYXNzLgotCSAqLwotCWJvb2xlYW4gaXNJbnN0YW5jZShDbGFzcyBvYmplY3RDbGFzcywgQ2xhc3MgZmlsdGVyQ2xhc3MpIHsKLQkJLy8gVGhlIGphdmEubGFuZy5DbGFzcy5pc0luc3RhbmNlIGNhbGwgZG9lc24ndCBjaGVjayBpbnRlcmZhY2VzIGZ1bGx5LgotCQkvLyBpLmUuLCBpZiBJIGhhdmUgdHdvIGludGVyZmFjZXMsIEEgYW5kIEIsIGFuZCBCIGV4dGVuZHMgQSBidXQKLQkJLy8gZG9lc24ndCBpbXBsZW1lbnQgQSwgdGhlbiB0aGUgaXNJbnN0YW5jZSBjYWxsIHdpbGwgcmV0dXJuIGZhbHNlLgotCQkvLwotCQkvLyBTbywgaW5zdGVhZCBvZiB1c2luZyBDbGFzcy5pc0luc3RhbmNlLCBkbyB0aGUgY2hlY2tpbmcgbXlzZWxmLgotCQlmb3IgKENsYXNzIGNsID0gb2JqZWN0Q2xhc3M7IGNsICE9IG51bGw7IGNsID0gY2wuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlpZiAoY2wuZ2V0TmFtZSgpLmVxdWFscyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlDbGFzc1tdIGNsSW50ZXJmYWNlcyA9IGNsLmdldEludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNsSW50ZXJmYWNlc1tpXS5nZXROYW1lKCkuZXF1YWxzKGZpbHRlckNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBpc0luc3RhbmNlKGNsSW50ZXJmYWNlc1tpXSwgZmlsdGVyQ2xhc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBlIGZpbHRlcnMgYXJlIGFsbG93ZWQgb25seSBmb3IgY2VydGFpbiB0eXBlcyBvZiBjbGFzc2VzLiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoZQotCSAqIGNsYXNzIHdoaWNoIHRoaXMgdHlwZSBtdXN0IGltcGxlbWVudCBiZWZvcmUgaXQgY2FuIGJlIGEgZmlsdGVyLgotCSAqLwotCXZvaWQgc2V0TXVzdEltcGxlbWVudENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJX211c3RJbXBsZW1lbnRDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgZmlsdGVyIGltcGxlbWVudHMgdGhlIG11c3RJbXBsZW1lbnRDbGFzcyAoaW4gVmFsaWRhdG9yRmlsdGVyJ3MgY2FzZSwgSVJlc291cmNlKSwgdGhlbgotCSAqIHRoaXMgaXMgYSB2YWxpZCBmaWx0ZXIsIGFuZCBzdG9yZSB0aGUgZmlsdGVyIHZhbHVlLgotCSAqLwotCXZvaWQgc2V0VHlwZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCUNsYXNzIGZpbHRlckNsYXNzID0gbnVsbDsKLQkJQ2xhc3MgbXVzdEltcGxlbWVudENsYXNzID0gbnVsbDsKLQotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCV90eXBlRmlsdGVyQ2xhc3MgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZpbHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShmaWx0ZXIpOwotCQkJaWYgKGdldE11c3RJbXBsZW1lbnRDbGFzcygpICE9IG51bGwpIHsKLQkJCQltdXN0SW1wbGVtZW50Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGdldE11c3RJbXBsZW1lbnRDbGFzcygpKTsKLQotCQkJCS8vIElmIHRoZSBmaWx0ZXIgY2xhc3MgaXMgbm90IGFuIGluc3RhbmNlIG9mIG11c3RJbXBsZW1lbnRDbGFzcwotCQkJCWlmICghaXNJbnN0YW5jZShmaWx0ZXJDbGFzcywgbXVzdEltcGxlbWVudENsYXNzKSkgewotCQkJCQlfdHlwZUZpbHRlckNsYXNzID0gbnVsbDsKLQkJCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVkFMSURfVFlQRV9GSUxURVIpLCAKLQkJCQkJCQluZXcgT2JqZWN0W117ZmlsdGVyLCBnZXRNdXN0SW1wbGVtZW50Q2xhc3MoKX0pOwotCQkJCQkJVHJhY2luZy5sb2cocmVzdWx0KTsJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKLQkJCV90eXBlRmlsdGVyQ2xhc3MgPSBudWxsOwotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiVGhlIGNsYXNzIG5hbWVkICIgKyBmaWx0ZXIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCQkiIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBuYW1lLCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiaW4gdGhlIHZhbGlkYXRvcidzIHBsdWdpbi54bWwgY29udHJpYnV0aW9uLCBhbmQgdHJ5IHJlc3RhcnRpbmcgZWNsaXBzZSBhZ2Fpbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCV90eXBlRmlsdGVyQ2xhc3MgPSBmaWx0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJUeXBlRmlsdGVyOiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgX3R5cGVGaWx0ZXJDbGFzcyA9ICIgKyBfdHlwZUZpbHRlckNsYXNzLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICBfbXVzdEltcGxlbWVudENsYXNzID0gIiArIF9tdXN0SW1wbGVtZW50Q2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9EZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9EZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzU1NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBieSBjbGllbnRzIHdobyB3YW50IHRvIHByb3ZpZGUKLSAqIGFsdGVybmF0ZSB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zIGZvciBhIGdpdmVuIHZhbGlkYXRvciB0eXBlLgotICogCi0gKiBJdCBsb2NhdGVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBkZWxlZ2F0ZSBmb3IgdGhpcyB2YWxpZGF0b3IgYW5kIGNhbGxzIGl0cwotICogdmFsaWRhdGUgbWV0aG9kLgotICogCi0gKiBAc2VlIElWYWxpZGF0b3IKLSAqIEBzZWUgSURlbGVnYXRpbmdWYWxpZGF0b3IKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJRGVsZWdhdGluZ1ZhbGlkYXRvcgotewotICBwdWJsaWMgRGVsZWdhdGluZ1ZhbGlkYXRvcigpCi0gIHsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIC8vIFtJc3N1ZV0gVGhpcyBtZXRob2QgZG9lcyBub3QgZ2V0IHBhc3NlZCB0aGUgdmFsaWRhdGlvbiBjb250ZXh0LiBIb3cgYXJlCi0gICAgLy8gZ29pbmcgdG8ga25vdyB0aGUgZGVsZWdhdGUgaW4gb3JkZXIgdG8gaW52b2tlIGl0cyBjbGVhbnVwIG1ldGhvZD8KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdmFsaWRhdGVJbkpvYihoZWxwZXIsIHJlcG9ydGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgb3JpZ2luYWwgcmVwb3J0ZXIgaW5zdGFuY2UgdG8gbWFrZSBpdCBsb29rIGxpa2UgdGhpcyB2YWxpZGF0b3IgaXMKLSAgICogdGhlIG9uZSBnZW5lcmF0aW5nIG1lc3NhZ2VzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBmcmFtZXdvcmsgaWdub3JlcwotICAgKiBtZXNzYWdlcyBjb21pbmcgZnJvbSB0aGUgZGVsZWdhdGUgdmFsaWRhdG9yIGJlY2F1c2UgaXQgaXMgbm90IHJlZ2lzdGVyZWQKLSAgICogd2l0aCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIERlbGVnYXRpbmdSZXBvcnRlciBpbXBsZW1lbnRzIElSZXBvcnRlcgotICB7Ci0gICAgLyoqCi0gICAgICogVGhlIHJlcG9ydGVyIHBhc3NlZCBvcmlnaW5hbGx5IHRvIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBieSB0aGUKLSAgICAgKiBmcmFtZXdvcmsuCi0gICAgICovCi0gICAgSVJlcG9ydGVyIGRlbGVnYXRpbmdSZXBvcnRlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICAgKi8KLSAgICBJVmFsaWRhdG9yIGRlbGVnYXRpbmdWYWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yCi0gICAgICogICAgICAgICAgdGhlIG9yaWdpbmFsIHZhbGlkYXRvci4KLSAgICAgKiBAcGFyYW0gcmVwb3J0ZXIKLSAgICAgKiAgICAgICAgICB0aGUgcmVwb3J0ZXIgb3JpZ2luYWxseSBwYXNzZWQgdG8gdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgICAqLwotICAgIERlbGVnYXRpbmdSZXBvcnRlcihJVmFsaWRhdG9yIHZhbGlkYXRvciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlciA9IHJlcG9ydGVyOwotICAgICAgZGVsZWdhdGluZ1ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLAotICAgICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3Igb3JpZ2luLCBJTWVzc2FnZSBtZXNzYWdlKQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlci5hZGRNZXNzYWdlKGRlbGVnYXRpbmdWYWxpZGF0b3IsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLAotICAgICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soZGVsZWdhdGluZ1ZhbGlkYXRvciwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0aW5nUmVwb3J0ZXIuZ2V0TWVzc2FnZXMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI2lzQ2FuY2VsbGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpCi0gICAgewotICAgICAgcmV0dXJuIGRlbGVnYXRpbmdSZXBvcnRlci5pc0NhbmNlbGxlZCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luKQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhkZWxlZ2F0aW5nVmFsaWRhdG9yKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGRlbGVnYXRpbmdWYWxpZGF0b3IsIG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIucmVtb3ZlTWVzc2FnZVN1YnNldChkZWxlZ2F0aW5nVmFsaWRhdG9yLCBvYmosIGdyb3VwTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjdmFsaWRhdGVJbkpvYihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwKLSAgICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHRoaXMpOwotICAgIFN0cmluZyB2YWxpZGF0b3JOYW1lID0gdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGlzIGFuIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuIFRoZQotICAgIC8vIGxpbWl0YXRpb24gb2YgdXNpbmcgYW4gSVZhbGlkYXRpb25Db250ZXh0IGlzIHRoYXQgaXQgZG9lcyBub3QgcmVhZGlseQotICAgIC8vIHByb3ZpZGUgdGhlIHByb2plY3QgdGhlIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkIHVwb24uCi0KLSAgICBpZiAoIShoZWxwZXIgaW5zdGFuY2VvZiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfV1JPTkdfQ09OVEVYVF9GT1JfREVMRUdBVEUsIG5ldyBTdHJpbmdbXSB7IHZhbGlkYXRvck5hbWUgfSkpKTsKLSAgICB9Ci0KLSAgICBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IHByb2plY3RDb250ZXh0ID0gKElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQpIGhlbHBlcjsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdENvbnRleHQuZ2V0UHJvamVjdCgpOwotCi0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlbGVnYXRlRGVzY3JpcHRvciA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcm9qZWN0Q29uZmlnID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCi0gICAgICBkZWxlZ2F0ZURlc2NyaXB0b3IgPSBwcm9qZWN0Q29uZmlnLmdldERlbGVnYXRlRGVzY3JpcHRvcih2bWQpOwotICAgIH0KLSAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEFscmVhZHkgZGVhbHQgd2l0aCBieSB0aGUgZnJhbWV3b3JrLgotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKGRlbGVnYXRlRGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfTk9fREVMRUdBVEUsIG5ldyBTdHJpbmdbXSB7IHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpIH0pKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgSVZhbGlkYXRvckpvYiBkZWxlZ2F0ZSA9IChJVmFsaWRhdG9ySm9iKWRlbGVnYXRlRGVzY3JpcHRvci5nZXRWYWxpZGF0b3IoKTsKLQotICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBpdCBsb29rIGxpa2UgdGhpcyB2YWxpZGF0b3IgaXMgdGhlIG9uZSBnZW5lcmF0aW5nCi0gICAgLy8gbWVzc2FnZXMgc28gd2Ugd3JhcCB0aGUgcmVwb3J0ZXIgYW5kIHVzZSB0aGlzIHZhbGlkYXRvciBhcyB0aGUgc291cmNlLgotICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBkb2VzIG5vdCByZWNvZ25pemUgb3VyIHZhbGlkYXRvcnMgYmVjYXVzZSB0aGV5Ci0gICAgLy8gYXJlIG5vdCByZWdpc3RlcmVkIGRpcmVjdGx5IHdpdGggdGhlIGZyYW1ld29yay4KLSAgICAvLyBXZSBjb3VsZCBtYWtlIHRoZW0gd29yayBsaWtlIHRoZSBhZ2dyZWdhdGVkIHZhbGlkYXRvcnMgYnV0IHRoYXQgd291bGQKLSAgICAvLyBjcmVhdGUgcHJvYmxlbXMgd2l0aCBtYXJrZXJzIG5vdCBiZWluZyBjbGVhbmVkIHVwIGlmIHNvbWVvbmUgc3dpdGNoZXMKLSAgICAvLyB2YWxpZGF0b3JzLgotICAgIC8vIFRPRE8gOiBNYXliZSB3ZSBjb3VsZCBjbGVhciBhbGwgdGhlIG1hcmtlcnMgZ2VuZXJhdGVkIGJ5IGEgZGVsZWdhdGUgd2hlbgotICAgIC8vIHRoZSB1c2VyIGNob29zZXMgYSBkaWZmZXJlbnQgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24/Ci0KLSAgICBEZWxlZ2F0aW5nUmVwb3J0ZXIgZGVsZWdhdGluZ1JlcG9ydGVyID0gbmV3IERlbGVnYXRpbmdSZXBvcnRlcih0aGlzLCByZXBvcnRlcik7Ci0KLSAgICBJU3RhdHVzIHN0YXR1cyA9IGRlbGVnYXRlLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCBkZWxlZ2F0aW5nUmVwb3J0ZXIpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iI2dldFNjaGVkdWxpbmdSdWxlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0KQotICAgKi8KLSAgcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotQE92ZXJyaWRlCi1wdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCXJldHVybiBudWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvSURlbGVnYXRpbmdWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0lEZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzllZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvSURlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIEEgZGVsZWdhdGluZyB2YWxpZGF0b3IgZGVsZWdhdGVzIHRoZSBhY3R1YWwgdmFsaWRhdGlvbiB3b3JrIHRvIGEgZGVsZWdhdGUKLSAqIHZhbGlkYXRvci4gVGhpcyBpcyBhIG1hcmtlciBpbnRlcmZhY2UgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmsgdG8KLSAqIGRldGVybWluZSBpZiBhIGRlbGVnYXRlIGlzIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKiAKLSAqIFtJc3N1ZV0gQ291bGQvc2hvdWxkIHRoaXMgaW50ZXJmYWNlIGJlIHJlcGxhY2VkIHdpdGggYW4gYXR0cmlidXRlIG9uIHRoZQotICogdmFsaWRhdG9ycyBleHRlbnNpb24gZGVmaW5pdGlvbj8KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGVnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBJVmFsaWRhdG9ySm9iCi17Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmU3Y2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIGRlbGVnYXRlIHZhbGlkYXRvci4KLSAqIAotICogSXQgaXMgYWxzbyB1c2VkIHRvIHN0b3JlIHRoZSBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yIGl0IGRlc2NyaWJlcy4gVG8KLSAqIG9idGFpbiB0aGUgaW5zdGFuY2UgY2FsbCBnZXRWYWxpZGF0b3IoKS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcgotewotICAvKioKLSAgICogVGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBkZXNjcmliaW5nIHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb247Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIElELgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZGVsZWdhdGluZ1ZhbGlkYXRvcklEOwotCi0gIC8qKgotICAgKiBUaGUgZGVsZWdhdGUncyBJRC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gIC8qKgotICAgKiBUaGUgZGVsZWdhdGUncyBkaXNwbGF5IG5hbWUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgZGVzY3JpcHRvci4KLSAgICogCi0gICAqIEBwYXJhbSBpZAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGUncyB1bmlxdWVzIGlkLiBNdXN0IGJlIHVuaXF1ZSBpbiB0aGUgY29udGV4dCBvZiBhCi0gICAqICAgICAgICAgIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgKiBAcGFyYW0gZGVsZWdhdGVDb25maWd1cmF0aW9uCi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0ZXMgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0gICAqIEBwYXJhbSBkZWxlZ2F0ZU5hbWUKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRlJ3MgZGlzcGxheSBuYW1lLgotICAgKiBAcGFyYW0gdGFyZ2V0VmFsaWRhdG9ySUQKLSAgICogICAgICAgICAgdGhlIHRhcmdldCB2YWxpZGF0b3IncyB1bmlxdWUgaWQuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlbGVnYXRlQ29uZmlndXJhdGlvbiwgU3RyaW5nIGRlbGVnYXRlTmFtZSwgU3RyaW5nIHRhcmdldFZhbGlkYXRvcklEKQotICB7Ci0gICAgdGhpcy5pZCA9IGlkOwotICAgIHRoaXMuZGVsZWdhdGVDb25maWd1cmF0aW9uID0gZGVsZWdhdGVDb25maWd1cmF0aW9uOwotICAgIHRoaXMubmFtZSA9IGRlbGVnYXRlTmFtZTsKLSAgICB0aGlzLmRlbGVnYXRpbmdWYWxpZGF0b3JJRCA9IHRhcmdldFZhbGlkYXRvcklEOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBkZWxlZ2F0ZSdzIElELgotICAgKiAKLSAgICogQHJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGlzIHZhbGlkYXRvcgotICAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gaWQ7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlJ3MgbmFtZS4KLSAgICogCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdmFsaWRhdG9yJ3MgZGlzcGxheSBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IHZhbGlkYXRvcidzIElELgotICAgKiAKLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgZGVsZWdhdGluZwotICAgKiAgICAgICAgIHZhbGlkYXRvciB3aG8gd2lsbCBkZWxlZ2F0ZSBpdHMgaW1wbGVtZW50YXRpb24gdG8gdGhlIHZhbGlkYXRvcgotICAgKiAgICAgICAgIGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldElEKCkKLSAgewotICAgIHJldHVybiBkZWxlZ2F0aW5nVmFsaWRhdG9ySUQ7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgcG9pbnRlZCB0byBieSB0aGlzCi0gICAqIGRlc2NyaXB0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIGFuIElWYWxpZGF0b3IgaW5zdGFuY2UuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElWYWxpZGF0b3IgZGVsZWdhdGUgPSAoSVZhbGlkYXRvcikgZGVsZWdhdGVDb25maWd1cmF0aW9uLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuQ0xBU1NfQVRUUklCVVRFKTsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZ2V0VGFyZ2V0SUQoKSkuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsKLSAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9DQU5OT1RfSU5TVEFOVElBVEVfREVMRUdBVEUsIG5ldyBTdHJpbmdbXSB7IGdldE5hbWUoKSwgZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUgfSkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBbnN3ZXIgYW4gQWJzdHJhY3RWYWxpZGF0b3IgIGlmIG9uZSBoYXMgYmVlbiBkZWZpbmVkLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0VmFsaWRhdG9yIGdldFZhbGlkYXRvcjIoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgT2JqZWN0IG9iamVjdCA9IGRlbGVnYXRlQ29uZmlndXJhdGlvbi5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyLkNMQVNTX0FUVFJJQlVURSk7Ci0JICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0VmFsaWRhdG9yKSB7Ci0JCQkJcmV0dXJuIChBYnN0cmFjdFZhbGlkYXRvcikgb2JqZWN0OwotCSAgICAgIH0KLQkgICAgfQotCSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgICAgU3RyaW5nIGRlbGVnYXRpbmdWYWxpZGF0b3JOYW1lID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKGdldFRhcmdldElEKCkpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSB9KSkpOwotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkMzcxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IGlzIGEgc2luZ2xldG9uIHVzZWQgdG8gc3RvcmUgdmFsaWRhdG9yIGRlbGVnYXRlCi0gKiBkZXNjcmlwdG9ycyBmb3IgZWFjaCBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IHsKLQkKLSAgLyoqCi0gICAqIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IF9pbnN0YW5jZTsKLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKiAKLSAgICogVGhlIGFjdHVhbCBwbGF0Zm9ybSBleHRlbnNpb24gcmVnaXN0cnkgcmVhZGluZyBoYXBwZW5zIGF0IHRoaXMgdGltZS4KLSAgICogCi0gICAqIEBzZWUgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZXMgcmVnaXN0cnkgc2luZ2xldG9uIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLSAgICAgIF9pbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSgpOwotICAgICAgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyKF9pbnN0YW5jZSk7Ci0gICAgICByZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWFwIG9mIHRhcmdldCB2YWxpZGF0b3IgaWQgdG8gTWFwIG9mIGRlbGVnYXRlcyBieSBpZC4KLSAgICovCi0gIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+PiBfZGVsZWdhdGVzQnlUYXJnZXQgPSAKLQkgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+PigpOwotCi0gIC8qKgotICAgKiBBZGRzIGEgZGVzY3JpcHRvciB0byB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgKiAgICAgICAgICBUaGUgZGVzY3JpcHRvciB0byBhZGQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqLwotICB2b2lkIGFkZChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpcmV0dXJuOwotCi0gICAgU3RyaW5nIHRhcmdldElEID0gZGVzY3JpcHRvci5nZXRUYXJnZXRJRCgpOwotCi0gICAgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+IGRlbGVnYXRlcyA9IF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotCi0gICAgaWYgKGRlbGVnYXRlcyA9PSBudWxsKSB7Ci0gICAgICBkZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yPigpOwotICAgICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVzKTsKLSAgICB9Ci0KLSAgICBkZWxlZ2F0ZXMucHV0KGRlc2NyaXB0b3IuZ2V0SWQoKSwgZGVzY3JpcHRvcik7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlZmF1bHQgZGVsZWdhdGUgSUQgZm9yIHRoZSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvciBJRC4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICBUaGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBJRC4KLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBkZWxlZ2F0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERlbGVnYXRlKFN0cmluZyB0YXJnZXRJRCkKLSAgewotICAgIE1hcCBkZWxlZ2F0ZXMgPSBnZXREZWxlZ2F0ZURlc2NyaXB0b3JzKHRhcmdldElEKTsKLQotICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQotICAgIC8vIFRPRE86IEltcGxlbWVudCBhIGRlZmF1bHQgYXR0cmlidXRlIGFuZCB1c2UgdGhhdCB0byBnZXQgdGhlIGRlZmF1bHQ/Ci0gICAgLy8gV2hhdCBoYXBwZW5zIGlmIHR3byBvciBtb3JlIGRlbGVnYXRlcyBjbGFpbSB0byBiZSB0aGUgZGVmYXVsdCBvbmU/Ci0gICAgLy8gRm9yIG5vdywganVzdCBwaWNrIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGxpc3QuCi0KLSAgICBJdGVyYXRvciBkZWxlZ2F0ZXNJdGVyYXRvciA9IGRlbGVnYXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgaWYgKCFkZWxlZ2F0ZXNJdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuIG51bGw7Ci0KLSAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIGRlbGVnYXRlc0l0ZXJhdG9yLm5leHQoKTsKLQotICAgIHJldHVybiBkZXNjcmlwdG9yLmdldElkKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIGEgZGVsZWdhdGUgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHRhcmdldCBhbmQgZGVsZWdhdGUgSURzLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElECi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIElELgotICAgKiBAcGFyYW0gZGVsZWdhdGVJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGUgdmFsaWRhdG9yJ3MgSUQuCi0gICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUKLSAgICogICAgICAgICBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdG9yIGdldERlbGVnYXRlKFN0cmluZyB0YXJnZXRJRCwgU3RyaW5nIGRlbGVnYXRlSUQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOwotCi0gICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQotICAgIElWYWxpZGF0b3IgZGVsZWdhdGUgPSBkZXNjcmlwdG9yLmdldFZhbGlkYXRvcigpOwotCi0gICAgcmV0dXJuIGRlbGVnYXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGEgbWFwIHdpdGggYWxsIGRlbGVnYXRlcyBkZXNjcmlwdG9ycyBmb3IgdGhlIGdpdmVuIHRhcmdldCwga2V5ZWQKLSAgICogYnkgdGhlaXIgSUQuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIHRhcmdldCAoZGVsZWdhdGluZykgdmFsaWRhdG9yIGlkLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIGEgTWFwIDxzdHJpbmcsIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4uIE1heSBiZSBudWxsIGlmIHRoZSBJRAotICAgKiAgICAgICAgIHBhc3NlZCBpbiBpcyBub3QgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4gZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyhTdHJpbmcgdGFyZ2V0SUQpIHsKLSAgICByZXR1cm4gX2RlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJRCk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgYSBkZWxlZ2F0ZSBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSB0YXJnZXQgaWQgYW5kIGRlbGVnYXRlIGlkLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElECi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIGlkCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlECi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0ZSBpZAotICAgKiBAcmV0dXJuIGEgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IGFuZCBpZCBvciBudWxsCi0gICAqICAgICAgICAgaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgdGFyZ2V0SUQsIFN0cmluZyBkZWxlZ2F0ZUlEKQotICB7Ci0gICAgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+IGRlbGVnYXRlcyA9IF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotCi0gICAgaWYgKGRlbGVnYXRlcyA9PSBudWxsIHx8IGRlbGVnYXRlSUQgPT0gbnVsbClyZXR1cm4gbnVsbDsKLSAgICAKLSAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIGRlbGVnYXRlcy5nZXQoZGVsZWdhdGVJRCk7Ci0KLSAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gdmFsaWRhdG9yIGhhcyBkZWxlZ2F0ZXMuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIHRhcmdldCB2YWxpZGF0b3IgaWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyByZWdpc3RlcmVkIGRlbGVnYXRlcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRGVsZWdhdGVzKFN0cmluZyB0YXJnZXRJRCkKLSAgewotICAgIE1hcCBkZWxlZ2F0ZXNCeUlEID0gX2RlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJRCk7Ci0KLSAgICBib29sZWFuIGhhc0RlbGVnYXRlcyA9IChkZWxlZ2F0ZXNCeUlEICE9IG51bGwgJiYgIWRlbGVnYXRlc0J5SUQuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gaGFzRGVsZWdhdGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0ZTI2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBleHRlbnNpb24gcmVnaXN0cnkgYW5kIHJlZ2lzdGVycyBlYWNoIGRlbGVnYXRpbmcKLSAqIHZhbGlkYXRvciBkZXNjcmlwdG9yIHdpdGggdGhlIGRlbGVnYXRlcyByZWdpc3RyeS4KLSAqIAotICogQHNlZSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeQotICovCi1jbGFzcyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlcgotewotICAvKioKLSAgICogVGhlIGRlbGVnYXRlIGNsYXNzIGF0dHJpYnV0ZS4gTXVzdCBiZSB2aXNpYmxlIGluIHRoZSBwYWNrYWdlIGJlY2F1c2UgaXQgaXMKLSAgICogdXNlZCBieSBvdGhlciBjbGFzc2VzIGluIHRoZSBwYWNrYWdlLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0ZSBlbGVtZW50IG5hbWUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfRUxFTUVOVCA9ICJkZWxlZ2F0ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlIHZhbGlkYXRvciBkZWxlZ2F0ZXMgZXh0ZW5zaW9uIHBvaW50IGlkLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJ2YWxpZGF0b3JEZWxlZ2F0ZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0ZSBuYW1lIGF0dHJpYnV0ZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBQbHVnaW4gaWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgdGFyZ2V0IGlkIGF0dHJpYnV0ZSBuYW1lLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9BVFRSSUJVVEUgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgdmFsaWRhdG9yIHJlZ2lzdHJ5IHdoZXJlIHRoZSBkZXNjcmlwdG9ycyBiZWluZyByZWFkIHdpbGwgYmUgcGxhY2VkLgotICAgKi8KLSAgcHJpdmF0ZSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSByZWdpc3RyeTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmVnaXN0cnkKLSAgICogICAgICAgICAgdGhlIHJlZ2lzdHJ5IHdoZXJlIHRoZSBkZXNjcmlwdG9ycyBiZWluZyByZWFkIHdpbGwgYmUgcGxhY2VkLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyKFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY29uZmlndXJhdGlvbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogICAgICAgICAgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBiZWluZyByZWFkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0KLSAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFTEVHQVRFX0VMRU1FTlQpKQotICAgIHsKLSAgICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCVVRFKTsKLSAgICAgIFN0cmluZyBkZWxlZ2F0ZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmcgdGFyZ2V0VmFsaWRhdG9ySUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfQVRUUklCVVRFKTsKLQotICAgICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKGRlbGVnYXRlSUQsIGVsZW1lbnQsIGRlbGVnYXRlTmFtZSwgdGFyZ2V0VmFsaWRhdG9ySUQpOwotCi0gICAgICByZWdpc3RyeS5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSB0aGUgZXh0ZW5zaW9ucyByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0KLSAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50cy5sZW5ndGg7IGluZGV4KyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2luZGV4XSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWxsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FsbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyOWZkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWxsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBWYWxpZGF0b3JzIG11c3Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbnlvbmUgb3RoZXIgdGhhbiBpbnN0YW5jZXMgb2YKLSAqIFZhbGlkYXRpb25PcGVyYXRpb24sIGJlY2F1c2Ugc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsaWRhdG9yLCBhbmQgaGFuZGxpbmcgb2YgZXJyb3IKLSAqIGNvbmRpdGlvbnMsIGlzIGRvbmUgaW4gdGhlIG9wZXJhdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIGlzIHNlcGFyYXRlZCBiZWNhdXNlIHNvbWUgb2YgdGhlCi0gKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIChpLmUuLCB0aGUgcHJvamVjdCkgaXNuJ3Qga25vd24gdW50aWwgcnVudGltZS4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gcnVucyBhbGwgdmFsaWRhdG9yczogZW5hYmxlZCB2YWxpZGF0b3JzLCBkaXNhYmxlZCB2YWxpZGF0b3JzLCBpbmNyZW1lbnRhbAotICogdmFsaWRhdG9ycywgZnVsbCB2YWxpZGF0b3JzLgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEFsbFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gewotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIEFsbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEFsbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIERFRkFVTFRfQVNZTkMpOwotCX0KLQotCS8qKgotCSAqIFJ1biBhbGwgY29uZmlndXJlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkCi0JICogb3IgZGlzYWJsZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiBJZiBhc3luYyBpcyBmYWxzZSwgbm8gdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBhIGJhY2tncm91bmQgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgdHJ1ZSwgYXN5bmMpOy8vIGFsd2F5cyBmb3JjZSB2YWxpZGF0aW9uIHRvIHJ1bgotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRWYWxpZGF0b3JzKCkpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0RlZmF1bHRSZXNvdXJjZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0UmVzb3VyY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjMxZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0RlZmF1bHRSZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGxpbmUgbnVtYmVyIGNhbGN1bGF0b3IgKGFsd2F5cyByZXR1cm5zICIwIikuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVzb3VyY2VVdGlsIGltcGxlbWVudHMgSVJlc291cmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVJlc291cmNlVXRpbCNnZXRMaW5lTm8oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YWQ5ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRmlsdGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIG9wZXJhdGlvbiBsb2FkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJlZCB2YWxpZGF0b3JzLCBhbmQgcnVuIHRoZSB2YWxpZGF0b3JzIGlmCi0gKiB0aGV5IGFyZSBib3RoIGVuYWJsZWQgYW5kIGluY3JlbWVudGFsLgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiB7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzKHByb2plY3QsIGRlbHRhLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZQotCSAqICAgICAgICAgICAgIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIElSZXNvdXJjZURlbHRhLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBydWxlR3JvdXApIHsKLQkJdGhpcyhwcm9qZWN0LCBkZWx0YSwgcnVsZUdyb3VwLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZQotCSAqICAgICAgICAgICAgIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIElSZXNvdXJjZURlbHRhLCBpbnQsIGJvb2xlYW4pCi0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTZXQgdmFsaWRhdG9ycywgSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBydWxlR3JvdXApIHsKLQkJdGhpcyhwcm9qZWN0LCBkZWx0YSwgcnVsZUdyb3VwLCBERUZBVUxUX0FTWU5DKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnModmFsaWRhdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBkZWx0YSBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGlzCi0JICogcGVyZm9ybWVkLiBJZiBkZWx0YSBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIHJlc291cmNlcwotCSAqIGluIHRoZSBkZWx0YSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBkZWx0YSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgYXN5bmMpOwotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGRlbHRhIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgaXMKLQkgKiBwZXJmb3JtZWQuIElmIGRlbHRhIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzCi0JICogaW4gdGhlIGRlbHRhIHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsY29udGV4dCwgZGVsdGEsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIGFzeW5jKTsKLQl9Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBkZWx0YSBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGlzCi0JICogcGVyZm9ybWVkLiBJZiBkZWx0YSBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIHJlc291cmNlcwotCSAqIGluIHRoZSBkZWx0YSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCxJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBydWxlR3JvdXAsIHNob3VsZEZvcmNlKGRlbHRhKSwgYXN5bmMpOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKHRydWUpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCi0JCX0KLQkJc2V0RGVsdGEoZGVsdGEpOwotCQlzZXRDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgZGVsdGEgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyBpcwotCSAqIHBlcmZvcm1lZC4gSWYgZGVsdGEgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMKLQkgKiBpbiB0aGUgZGVsdGEgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIHJ1bGVHcm91cCwgc2hvdWxkRm9yY2UoZGVsdGEpLCBhc3luYyk7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSkpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0KLQkJfQotCQlzZXREZWx0YShkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCwgYmUgb3BlbiwgYW5kIGNvbnRhaW4gYWxsIG9mIHRoZSByZXNvdXJjZXMgaW4gY2hhbmdlZFJlc291cmNlcy4gSWYgc29tZQotCSAqIG9mIHRoZSByZXNvdXJjZXMgaW4gY2hhbmdlZFJlc291cmNlcyBiZWxvbmcgdG8gZGlmZmVyZW50IHByb2plY3RzLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBJZiBjaGFuZ2VkUmVzb3VyY2VzIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsCi0JICogdmFsaWRhdG9ycyBpcyBwZXJmb3JtZWQuIElmIGNoYW5nZWRSZXNvdXJjZXMgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMKLQkgKiB0aGF0IHZhbGlkYXRlIHJlc291cmNlcyBpbiB0aGUgY2hhbmdlZFJlc291cmNlcyBhcnJheSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyxJV29ya2JlbmNoQ29udGV4dCBhV29ya2JlbmNoQ29udGV4dCwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBzaG91bGRGb3JjZShjaGFuZ2VkUmVzb3VyY2VzKSwgYXN5bmMpOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKHRydWUpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCi0JCX0KLQkJLy9jb25zdHJ1Y3QgYW4gYXJyYXkgb2YgSUZpbGVEZWx0YVtdIHRvIHdyYXAgdGhlIE9iamVjdFtdOyBvbmUgSUZpbGVEZWx0YSBmb3IgZWFjaCBPYmplY3QgaW4gdGhlIGFycmF5Ci0JCXNldEZpbGVEZWx0YXMoRmlsdGVyVXRpbC5nZXRGaWxlRGVsdGFzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKSk7Ci0JCXNldENvbnRleHQoYVdvcmtiZW5jaENvbnRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0LCBiZSBvcGVuLCBhbmQgY29udGFpbiBhbGwgb2YgdGhlIHJlc291cmNlcyBpbiBjaGFuZ2VkUmVzb3VyY2VzLiBJZiBzb21lCi0JICogb2YgdGhlIHJlc291cmNlcyBpbiBjaGFuZ2VkUmVzb3VyY2VzIGJlbG9uZyB0byBkaWZmZXJlbnQgcHJvamVjdHMsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIElmIGNoYW5nZWRSZXNvdXJjZXMgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzIGlzIHBlcmZvcm1lZC4gSWYgY2hhbmdlZFJlc291cmNlcyBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycwotCSAqIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzIGluIHRoZSBjaGFuZ2VkUmVzb3VyY2VzIGFycmF5IHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgc2hvdWxkRm9yY2UoY2hhbmdlZFJlc291cmNlcyksIGFzeW5jKTsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyh0cnVlKSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQotCQl9Ci0JCS8vY29uc3RydWN0IGFuIGFycmF5IG9mIElGaWxlRGVsdGFbXSB0byB3cmFwIHRoZSBPYmplY3RbXTsgb25lIElGaWxlRGVsdGEgZm9yIGVhY2ggT2JqZWN0IGluIHRoZSBhcnJheQotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwN2JjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBWYWxpZGF0b3JzIG11c3Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbnlvbmUgb3RoZXIgdGhhbiBpbnN0YW5jZXMgb2YKLSAqIFZhbGlkYXRpb25PcGVyYXRpb24sIGJlY2F1c2Ugc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsaWRhdG9yLCBhbmQgaGFuZGxpbmcgb2YgZXJyb3IKLSAqIGNvbmRpdGlvbnMsIGlzIGRvbmUgaW4gdGhlIG9wZXJhdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIGlzIHNlcGFyYXRlZCBiZWNhdXNlIHNvbWUgb2YgdGhlCi0gKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIChpLmUuLCB0aGUgcHJvamVjdCkgaXNuJ3Qga25vd24gdW50aWwgcnVudGltZS4KLSAqIAotICogSW5zdGFuY2VzIG9mIHRoaXMgb3BlcmF0aW9uIHJ1biBldmVyeSBlbmFibGVkIHZhbGlkYXRvciAoYm90aCBmdWxsIGFuZCBpbmNyZW1lbnRhbCkgb24gdGhlCi0gKiBwcm9qZWN0LgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIHsKLQkKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIGludCwKLQkgKiAgICAgICAgICAgICBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgcnVsZUdyb3VwLCBERUZBVUxUX0ZPUkNFLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCwgaW50LAotCSAqICAgICAgICAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UpIHsKLQkJdGhpcyhwcm9qZWN0LCBydWxlR3JvdXAsIGZvcmNlLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gYWxsIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBERUZBVUxUX0ZPUkNFLCBhc3luYyk7Ci0JfQotCQotCS8qKgotCSAqIFJ1biBhbGwgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBhV29ya2JlbmNoQ29udGV4dCwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgREVGQVVMVF9GT1JDRSwgYXN5bmMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gYWxsIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCB3aXRoIHRoZSBpZGVudGlmaWVkIHJ1bGVHcm91cC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElXb3JrYmVuY2hDb250ZXh0IGFXb3JrYmVuY2hDb250ZXh0LCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCwgYVdvcmtiZW5jaENvbnRleHQsIFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpLCBydWxlR3JvdXAsIGZvcmNlLCBhc3luYyk7Ci0JfQotCQotCi0JLyoqCi0JICogUnVuIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgd2l0aCB0aGUgaWRlbnRpZmllZCBydWxlR3JvdXAuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCwgVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0RW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCksIHJ1bGVHcm91cCwgZm9yY2UsIGFzeW5jKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHJvdGVjdGVkIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFNldCBlbmFibGVkVmFsaWRhdG9ycywgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGVuYWJsZWRWYWxpZGF0b3JzLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBERUZBVUxUX0ZPUkNFLCBhc3luYyk7IAotCQkvLyB0cnVlID0gZm9yY2UgdmFsaWRhdGlvbiB0byBydW4gd2hldGhlciBvciBub3QgYXV0by12YWxpZGF0ZSBpcyBvbgotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHJvdGVjdGVkIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIFNldCBlbmFibGVkVmFsaWRhdG9ycywgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsYVdvcmtiZW5jaENvbnRleHQsIGVuYWJsZWRWYWxpZGF0b3JzLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBERUZBVUxUX0ZPUkNFLCBhc3luYyk7IAotCQkvLyB0cnVlID0gZm9yY2UgdmFsaWRhdGlvbiB0byBydW4gd2hldGhlciBvciBub3QgYXV0by12YWxpZGF0ZSBpcyBvbgotCX0KLQotCS8qKgotCSAqIFJ1biB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIHJ1bGVHcm91cC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHJvdGVjdGVkIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFNldCBlbmFibGVkVmFsaWRhdG9ycywgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBmb3JjZSwgcnVsZUdyb3VwLCBhc3luYyk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVuIHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgd2l0aCB0aGUgcnVsZUdyb3VwLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwcm90ZWN0ZWQgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIFNldCBlbmFibGVkVmFsaWRhdG9ycywgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LGFXb3JrYmVuY2hDb250ZXh0LGZvcmNlLCBydWxlR3JvdXAsIGFzeW5jKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JUmVzb3VyY2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzNGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VVdGlsIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBPYmplY3QgaXMgbG9jYXRlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJ1bGVHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSdWxlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyYWQxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJ1bGVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLyoqCi0gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIGdyb3VwIG9mIHJ1bGVzIHdoaWNoIGEgdmFsaWRhdG9yIGNoZWNrcy4gRm9yIG5vdywgdGhlIG9ubHkgZ3JvdXBpbmcgaXMgYnkKLSAqIHNwZWVkOiBpZiBhIHNldCBvZiBydWxlcyBjYW4gYmUgY2hlY2tlZCBxdWlja2x5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBQQVNTX0ZBU1QgZ3JvdXAsCi0gKiBvdGhlcndpc2UsIGl0IGlzIGdyb3VwZWQgaW4gdGhlIFBBU1NfRlVMTCBncm91cC4KLSAqIAotICogSW4gZnV0dXJlLCB0aGlzIGNvdWxkIGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgc2V2ZXJpdGllcy4gVG8gYmUgYWJsZSB0byBncm91cCBieSBzZXZlcml0eSBoZWxwcwotICogd2l0aCB0aGUgTWVzc2FnZUxpbWl0RXhjZXB0aW9uLiBBIHZhbGlkYXRvciBzaG91bGQgcmVwb3J0IGVycm9ycyBmaXJzdCwgYW5kIHRoZW4gd2FybmluZ3MsIGFuZAotICogdGhlbiBpbmZvcywgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIG1lc3NhZ2UgbGltaXQgYmVpbmcgcmVhY2hlZCBiZWZvcmUgdGhlIG1vc3Qgc2V2ZXJlIHByb2JsZW1zIGFyZQotICogcmVwb3J0ZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bGVHcm91cCB7Ci0JLy8gVGhlIGZvbGxvd2luZyBmaWx0ZXJzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgZ3JvdXAgb2YgdmFsaWRhdGlvbiBjaGVja3MuCi0KLQkvLyByZXRyaWV2ZXMgdGhlIHR5cGUgb2YgcGFzcywgZnJvbSB0aGUgSVZhbGlkYXRpb25Db250ZXh0LCB3aGljaCB0aGUgdmFsaWRhdG9yIHNob3VsZCBleGVjdXRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19MRVZFTCA9ICJQQVNTX0xFVkVMIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gT24gdGhlIEZBU1RfUEFTUywgdGhlIHZhbGlkYXRvciBzaG91bGQgY2hlY2sgdGhlIHJ1bGVzIHdoaWNoIGRvIG5vdAotCS8vIHRha2UgbXVjaCB0aW1lIHRvIGNoZWNrLCBhbmQgZXhjbHVkZSB0aGUgcnVsZXMgd2hpY2ggYXJlIHZhbGlkIG9ubHkKLQkvLyBiZWZvcmUgc29tZSBhY3Rpb24gKGUuZy4gZXhwb3J0aW5nIG9yIGRlcGxveWluZykuCi0JLy8gCi0JLy8gVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlcyBpcyBpcnJlbGV2YW50LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NfRkFTVCA9IDB4MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTX0ZBU1RfTkFNRSA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJCAvLyBJbiBwbHVnaW4ueG1sLCBpZGVudGlmeSB0aGlzIHBhc3MgYnkgdGhpcyBjb25zdGFudAotCi0JLy8gT24gdGhlIEZVTExfUEFTUywgdGhlIHZhbGlkYXRvciBzaG91bGQgY2hlY2sgZXZlcnl0aGluZy4gVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTX0ZVTEwgPSAweDIgfCBQQVNTX0ZBU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19GVUxMX05BTUUgPSAiZnVsbCI7IC8vJE5PTi1OTFMtMSQgLy8gSW4gcGx1Z2luLnhtbCwgaWRlbnRpZnkgdGhpcyBwYXNzIGJ5IHRoaXMgY29uc3RhbnQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lXb3JrYmVuY2hDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVdvcmtiZW5jaENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyNDI4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVdvcmtiZW5jaENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBJbiB0aGUgZWNsaXBzZSBlbnZpcm9ubWVudCwgbm90IG9ubHkgZG9lcyB0aGUgSVZhbGlkYXRpb25Db250ZXh0IG5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBNT0YgbW9kZWwsIGl0Ci0gKiBhbHNvIG5lZWRzIHRvIGxvYWQgaXRlbXMgZnJvbSB0aGUgZWNsaXBzZSB3b3JrYmVuY2guIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBleHRlbmRlZCBieQotICogd29ya2JlbmNoIElIZWxwZXJzLCBzbyB0aGF0IGl0ZW1zIGNhbiBiZSBhZGRlZCB0bywgYW5kIGZyb20sIHRoZSB0YXNrIGxpc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdvcmtiZW5jaENvbnRleHQgZXh0ZW5kcyBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IHsKLQkvKioKLQkgKiBXaGVuIHRoZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBzbyB0aGF0IHRoZSBJV29ya2JlbmNoQ29udGV4dCBjYW4KLQkgKiBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGl0IGFsbG9jYXRlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0JICogCi0JICogSWYgdGhlIGNsZWFudXAgaXMgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLCBzdWJ0YXNrIG1lc3NhZ2VzIHNob3VsZCBiZSBzZW50IHRvIHRoZSBJUmVwb3J0ZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGNsb3NpbmcsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UgdGhvc2UKLQkgKiByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhCi0JICogbm8tb3AuCi0JICovCi0Jdm9pZCBjbG9zaW5nKCk7Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBiZWluZyBkZWxldGVkLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlCi0JICogdGhvc2UgcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUKLQkgKiBhIG5vLW9wLgotCSAqLwotCXZvaWQgZGVsZXRpbmcoKTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIE9iamVjdCwgaWYgdGhlIG9iamVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIElGaWxlIGluIHRoZSB3b3JrYmVuY2gsIHJldHVybiB0aGUgSUZpbGUuCi0JICogT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLiBJbiBlY2xpcHNlLCBpbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgdGFzawotCSAqIGxpc3QgZW50cnksIHRoZSBJUmVzb3VyY2UsIHRvIHdoaWNoIHRoZSBlbnRyeSBhcHBsaWVzLCBtdXN0IGJlIGlkZW50aWZpZWQuIFRoZSBJUmVwb3J0ZXIKLQkgKiBpbnRlcmZhY2UgcGFzc2VzIGluIGFuIE9iamVjdCBpbiB0aGVzZSBtZXRob2RzOgotCSAqIAotCSAqIGFkZFZhbGlkYXRpb25NZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSAvLyBPYmplY3QgaXMgYSBwYXJ0IG9mIElNZXNzYWdlCi0JICogCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSwKLQkgKiAKLQkgKiBUaHVzLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgbmVlZHMgdG8ga25vdyBob3csIGdpdmVuIHRoZSBPYmplY3QsIHdoaWNoIElGaWxlIHRoYXQgdGhlIE9iamVjdAotCSAqIHJlcHJlc2VudHMgaW4gdGhlIHdvcmtiZW5jaCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHRhc2sgbGlzdCBlbnRyeS4KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIFdvcmtiZW5jaFJlcG9ydGVyIHdpbGwgYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBJUHJvamVjdAotCSAqIGluc3RlYWQgb2YgYW4gSUZpbGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgSW1wbGVtZW50IGdldFJlc291cmNlKE9iamVjdCkgaW5zdGVhZC4KLQkgKi8KLQlJRmlsZSBnZXRGaWxlKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogR2l2ZW4gYW4gT2JqZWN0LCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNvcnJlc3BvbmRpbmcgSVJlc291cmNlIGluIHRoZSB3b3JrYmVuY2gsIHJldHVybiB0aGUKLQkgKiBJUmVzb3VyY2VlLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgV29ya2JlbmNoUmVwb3J0ZXIuIEluIGVjbGlwc2UsIGluIG9yZGVyIHRvIGFkZCBvciByZW1vdmUgYSB0YXNrCi0JICogbGlzdCBlbnRyeSwgdGhlIElSZXNvdXJjZSwgdG8gd2hpY2ggdGhlIGVudHJ5IGFwcGxpZXMsIG11c3QgYmUgaWRlbnRpZmllZC4gVGhlIElSZXBvcnRlcgotCSAqIGludGVyZmFjZSBwYXNzZXMgaW4gYW4gT2JqZWN0IGluIHRoZXNlIG1ldGhvZHM6Ci0JICogCi0JICogYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSVZhbGlkYXRvciwgSU1lc3NhZ2UpIC8vIE9iamVjdCBpcyBhIHBhcnQgb2YgSU1lc3NhZ2UKLQkgKiAKLQkgKiByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpLAotCSAqIAotCSAqIFRodXMsIHRoZSBXb3JrYmVuY2hSZXBvcnRlciBuZWVkcyB0byBrbm93IGhvdywgZ2l2ZW4gdGhlIE9iamVjdCwgd2hpY2ggSUZpbGUgdGhhdCB0aGUgT2JqZWN0Ci0JICogcmVwcmVzZW50cyBpbiB0aGUgd29ya2JlbmNoLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFkZCB0aGUgdGFzayBsaXN0IGVudHJ5LgotCSAqIAotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCwgdGhlbiB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgd2lsbCBhZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIElQcm9qZWN0Ci0JICogaW5zdGVhZCBvZiBhbiBJUmVzb3VyY2UuCi0JICovCi0JSVJlc291cmNlIGdldFJlc291cmNlKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogR2l2ZW4gYW4gSU1lc3NhZ2UncyB0YXJnZXQgb2JqZWN0LCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyLCBvZiB0aGUgSUZpbGUsIHdoaWNoIHRoZSB0YXJnZXQKLQkgKiBvYmplY3QgcmVwcmVzZW50cywgaWYgcG9zc2libGUuIElmIHRoZSBvYmplY3QgaXMgbnVsbCwgb3IgaWYgYWNjZXNzIHRvIGxpbmUgbnVtYmVycyBpcyBub3QKLQkgKiBwb3NzaWJsZSwgcmV0dXJuIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYXRpb24uCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hldGhlciBvciBub3QgdGhlIElSZXNvdXJjZSBpcyBhbiBJRmlsZSwgSUZvbGRlciwgb3IgSVByb2plY3QuCi0JICogTGluZSBudW1iZXJzIGFyZSB2YWxpZCBvbmx5IGZvciBJRmlsZSB0eXBlczsgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBhbiBJRmlsZSwgdGhlbiBhIHRleHQKLQkgKiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYXRpb24gbXVzdCBiZSByZXR1cm5lZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLCB3aXRob3V0IHRoZSBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIGluIGZyb250LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgVmFsaWRhdGlvbk9wZXJhdGlvbiB0byBjYWxjdWxhdGUgdGhlIG5vbi1lbnZpcm9ubWVudCBzcGVjaWZpYyBuYW1lcyBvZgotCSAqIHRoZSBmaWxlcy4gT25seSB0aGUgSVdvcmtiZW5jaENvbnRleHQgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IG11Y2ggaW5mb3JtYXRpb24gdG8gc3RyaXAgb2ZmCi0JICogb2YgdGhlIElSZXNvdXJjZSBuYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gRUpCIFByb2plY3QgbmFtZWQgIk15RUpCUHJvamVjdCIsIGFuZCBpdAotCSAqIHVzZXMgdGhlIGRlZmF1bHQgbmFtZXMgZm9yIHRoZSBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzLCAic291cmNlIiBhbmQgImVqYk1vZHVsZSIsCi0JICogcmVzcGVjdGl2ZWx5LCB0aGVuIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEVKQiBIZWxwZXIga25vd3MgaG93IG11Y2ggb2YgdGhhdCBzdHJ1Y3R1cmUKLQkgKiBpcyBlY2xpcHNlLXNwZWNpZmljLgotCSAqIAotCSAqIFNpbmNlIHRoZSAic291cmNlIiBmb2xkZXIgY29udGFpbnMgSmF2YSBzb3VyY2UgZmlsZXMsIGEgcG9ydGFibGUgbmFtZSB3b3VsZCBiZSB0aGUKLQkgKiBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgd2l0aG91dCB0aGUgZWNsaXBzZS1zcGVjaWZpYyBwcm9qZWN0IGFuZCBmb2xkZXIgbmFtZXMKLQkgKiBpbiBmcm9udCBvZiB0aGUgZmlsZSBuYW1lLiBUaGUgRUpCSGVscGVyIGtub3dzIHRoYXQgZXZlcnl0aGluZyB1cCB0byB0aGUgInNvdXJjZSIgZm9sZGVyLCBmb3IKLQkgKiBleGFtcGxlLCBjYW4gYmUgcmVtb3ZlZCwgYmVjYXVzZSwgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFSkIgUHJvamVjdCwgZXZlcnl0aGluZwotCSAqIGNvbnRhaW5lZCBpbiB0aGUgc291cmNlIGZvbGRlciBpcyBqYXZhIHNvdXJjZSBjb2RlLiBTbyBpZiB0aGVyZSBpcyBhbiBJUmVzb3VyY2UgaW4gYW4gRUpCCi0JICogUHJvamVjdCBuYW1lZCAiL015RUpCUHJvamVjdC9zb3VyY2UvY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIiwgdGhpcyBtZXRob2Qgd291bGQKLQkgKiBtYWtlIHRoaXMgbmFtZSBwb3J0YWJsZSBieSBzdHJpcHBpbmcgb2ZmIHRoZSAiL015RUpCUHJvamVjdC9zb3VyY2UiLCBhbmQgcmV0dXJuaW5nCi0JICogImNvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIuCi0JICogCi0JICogVGhlIG91dHB1dCBvZiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uLCB3aGVuIGl0IGlzIGNhbGN1bGF0aW5nIHRoZSBsaXN0Ci0JICogb2YgYWRkZWQvY2hhbmdlZC9kZWxldGVkIGZpbGUgbmFtZXMgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIElmIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UpCi0JICogcmV0dXJucyBudWxsLCB0aGF0IG1lYW5zIHRoYXQgdGhlIElXb3JrYmVuY2hDb250ZXh0J3MgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGF0Ci0JICogcGFydGljdWxhciB0eXBlIG9mIHJlc291cmNlLCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9mCi0JICogSUZpbGVEZWx0YSBvYmplY3RzIGluIHRoZSBJVmFsaWRhdG9yJ3MgInZhbGlkYXRlIiBtZXRob2QuCi0JICovCi0JU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUHJvamVjdCB3aGljaCBpcyBhYm91dCB0byBiZSB2YWxpZGF0ZWQuIEVhY2ggSVdvcmtiZW5jaENvbnRleHQga25vd3MgaG93IHRvCi0JICogdHJhdmVyc2UgYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QsIGZvciBleGFtcGxlLCBhbiBFSkIgcHJvamVjdCBvciBhIHdlYiBwcm9qZWN0LgotCSAqLwotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIKLQkgKiBldmVudHVhbGx5IHJlc29sdmVzIHRoYXQgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IElSZXNvdXJjZQotCSAqIHdoZW4gYW4gSUZpbGUgY2Fubm90IGJlIGZvdW5kKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkLCBieSB0aGUgV29ya2JlbmNoUmVwb3J0ZXIsIHNvIHRoYXQgdGhlCi0JICogV29ya2JlbmNoUmVwb3J0ZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIElNZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHNhbWUgSVJlc291cmNlLCBidXQKLQkgKiByZWZlciB0byBkaWZmZXJlbnQgdGFyZ2V0IG9iamVjdHMuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwKLQkgKiBPYmplY3QpIG1ldGhvZCwgc28gdGhhdCB3aGVuIG9uZSB0YXJnZXQgb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0Ci0JICogcmVtb3ZlIGFub3RoZXIgdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBvbmx5IGlmIG9iamVjdCBpcyBudWxsLiBPdGhlcndpc2UsIGFuIGlkIHdoaWNoIGNhbiB1bmlxdWVseQotCSAqIGlkZW50aWZ5IGEgcGFydGljdWxhciBvYmplY3QgbXVzdCBiZSByZXR1cm5lZC4gVGhlIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUKLQkgKiBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0JICovCi0JU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIGZ1bGwgb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBpcyBydW5uaW5nLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCwgYnkgdGhlCi0JICogVmFsaWRhdGlvbiBGcmFtZXdvcmssIGZvciBldmVyeSBJUmVzb3VyY2Ugd2hpY2ggaXMgZmlsdGVyZWQgaW4gYnkgdGhlIElWYWxpZGF0b3IsIHNvIHRoYXQgdGhlCi0JICogSVZhbGlkYXRpb25Db250ZXh0IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IG9uZSBvZiB0aGUgcmVzb3VyY2VzLCB3aGljaCB2YWxpZGF0aW9uIHdpbGwgcnVuIG9uLCBpcwotCSAqIGJlaW5nIGZpbHRlcmVkIGluLgotCSAqLwotCXZvaWQgcmVnaXN0ZXJSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yaywgdG8gaW5pdGlhbGl6ZSB0aGUgSVdvcmtiZW5jaENvbnRleHQgc28gdGhhdAotCSAqIGl0IGNhbiBnYXRoZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqLwotCXZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgdGhhdCB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4gVGhlcmUgd2lsbCBiZQotCSAqIGNhbGxzIHRvIGNsb3NpbmcoSVByb2plY3QpIGFuZCBwb3NzaWJseSBkZWxldGluZyhJUHJvamVjdCkgZm9sbG93aW5nIHRoaXMgY2FsbCwgYnV0IHRoZQotCSAqIHJlc291cmNlcyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQgYnkgdGhlIHRpbWUgdGhhdCB0aG9zZSBtZXRob2RzIGFyZSBjYWxsZWQsIHNvIEVWRVJZVEhJTkcKLQkgKiBzaG91bGQgYmUgY2xlYW5lZCB1cCBpbiB0aGlzIG1ldGhvZC4gVGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgdGhlIHByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8KLQkgKiBzaHV0IGRvd24uIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IElQcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIFRoZSBJUHJvamVjdAotCSAqIG1heSwgb3IgbWF5IG5vdCwgYmUgY2xvc2VkLgotCSAqLwotCXZvaWQgc2h1dGRvd24oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTG9jYWxpemVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjAzMDU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdmFsaWRhdG9ycyB3aGljaCBydW4gb25seSBpbiBVSSBhbmQgd2hvc2UgbWVzc2FnZXMsIGJlY2F1c2UgdGhleQotICogY29tZSBmcm9tIGFub3RoZXIgdG9vbCwgYXJlIGFscmVhZHkgbG9jYWxpemVkLiBMb2NhbGl6ZWRNZXNzYWdlIGNhbm5vdCBiZSB1c2VkIGJ5IGFueSB2YWxpZGF0b3IKLSAqIHdoaWNoIG5lZWRzIHRvIHJ1biBpbiBib3RoIFdlYlNwaGVyZSBhbmQgV1NBRC4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZTsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkNWYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5GaWx0ZXJVdGlsOwotCi0KLS8qKgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE1hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBleHRlbmRzIE1hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24gewotCi0JcHVibGljIE1hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCBwcm9qZWN0ICk7Ci0JfQkKLQlwdWJsaWMgTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJc3VwZXIoIHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMgKTsKLQkJc2V0RmlsZURlbHRhcyggRmlsdGVyVXRpbC5nZXRGaWxlRGVsdGFzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKSApOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyMmNlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBWYWxpZGF0b3JzIG11c3Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbnlvbmUgb3RoZXIgdGhhbiBpbnN0YW5jZXMgb2YKLSAqIFZhbGlkYXRpb25PcGVyYXRpb24sIGJlY2F1c2Ugc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsaWRhdG9yLCBhbmQgaGFuZGxpbmcgb2YgZXJyb3IKLSAqIGNvbmRpdGlvbnMsIGlzIGRvbmUgaW4gdGhlIG9wZXJhdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIGlzIHNlcGFyYXRlZCBiZWNhdXNlIHNvbWUgb2YgdGhlCi0gKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIChpLmUuLCB0aGUgcHJvamVjdCkgaXNuJ3Qga25vd24gdW50aWwgcnVudGltZS4KLSAqIAotICogSW5zdGFuY2VzIG9mIHRoaXMgb3BlcmF0aW9uIHJ1biBldmVyeSBlbmFibGVkIHZhbGlkYXRvciAoYm90aCBmdWxsIGFuZCBpbmNyZW1lbnRhbCkgb24gdGhlCi0gKiBwcm9qZWN0LgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE1hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gewotCi0JcHVibGljIE1hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwcm9qZWN0LCBERUZBVUxUX0ZPUkNFLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCB0cnVlKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCkpOwotCX0JCi0JcHVibGljIE1hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcykgewotCQlzdXBlcihwcm9qZWN0LCBzaG91bGRGb3JjZShjaGFuZ2VkUmVzb3VyY2VzKSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgdHJ1ZSk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01lc3NhZ2VJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWVzc2FnZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NzViNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWVzc2FnZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VJbmZvIHsKLQotCXByaXZhdGUgU3RyaW5nCQltZXNzYWdlT3duZXJJZDsJCi0JcHJpdmF0ZSBJUmVzb3VyY2UJcmVzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcJCWxvY2F0aW9uOwkKLQlwcml2YXRlIFN0cmluZwkJdGV4dDsKLQlwcml2YXRlIFN0cmluZwkJdGFyZ2V0T2JqZWN0TmFtZTsJCi0JcHJpdmF0ZSBTdHJpbmcJCW1hcmtlcklkOwkKLQlwcml2YXRlIElNZXNzYWdlCW1zZzsKLQkKLQlwdWJsaWMgTWVzc2FnZUluZm8oKXsJCQotCX0KLQkKLQlwdWJsaWMgTWVzc2FnZUluZm8oU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgCi0JCVN0cmluZyB0ZXh0LCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIG1hcmtlcklkLCBJTWVzc2FnZSBtc2cpewotCQkKLQkJdGhpcy5tZXNzYWdlT3duZXJJZCA9IG1lc3NhZ2VPd25lcklkOwkKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CQotCQl0aGlzLnRleHQgPSB0ZXh0OwotCQl0aGlzLnRhcmdldE9iamVjdE5hbWUgPSB0YXJnZXRPYmplY3ROYW1lOwkKLQkJdGhpcy5tYXJrZXJJZCA9IG1hcmtlcklkOwkKLQkJdGhpcy5tc2cgPSBtc2c7Ci0JfQkKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VySWQoKSB7Ci0JCXJldHVybiBtYXJrZXJJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJJZChTdHJpbmcgbWFya2VySWQpIHsKLQkJdGhpcy5tYXJrZXJJZCA9IG1hcmtlcklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZU93bmVySWQoKSB7Ci0JCXJldHVybiBtZXNzYWdlT3duZXJJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3duZXJJZChTdHJpbmcgbWVzc2FnZU93bmVySWQpIHsKLQkJdGhpcy5tZXNzYWdlT3duZXJJZCA9IG1lc3NhZ2VPd25lcklkOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNc2coKSB7Ci0JCXJldHVybiBtc2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TXNnKElNZXNzYWdlIG1zZykgewotCQl0aGlzLm1zZyA9IG1zZzsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoKSB7Ci0JCXJldHVybiB0YXJnZXRPYmplY3ROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE9iamVjdE5hbWUoU3RyaW5nIHRhcmdldE9iamVjdE5hbWUpIHsKLQkJdGhpcy50YXJnZXRPYmplY3ROYW1lID0gdGFyZ2V0T2JqZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHRleHQgIT0gbnVsbClyZXR1cm4gIk1lc3NhZ2VJbmZvOiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvT25lVmFsaWRhdG9yT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvT25lVmFsaWRhdG9yT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDI0MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL09uZVZhbGlkYXRvck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHJ1bnMgYSBzaW5nbGUgdmFsaWRhdG9yIG9uIGEgcHJvamVjdC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVWYWxpZGF0b3JPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gewotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIE9uZVZhbGlkYXRvck9wZXJhdGlvbihwcm9qZWN0LCB2YWxpZGF0b3JJZCwKLQkgKiAgICAgICAgICAgICBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgREVGQVVMVF9GT1JDRSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgT25lVmFsaWRhdG9yT3BlcmF0aW9uKHByb2plY3QsIHZhbGlkYXRvcklkLAotCSAqICAgICAgICAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3QsIHZhbGlkYXRvcklkLCBmb3JjZSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgT25lVmFsaWRhdG9yT3BlcmF0aW9uKElQcm9qZWN0LCBTdHJpbmcsCi0JICogICAgICAgICAgICAgYm9vbGVhbiwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgZm9yY2UsIHJ1bGVHcm91cCwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkYXRvcklkCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hpY2ggeW91IHdpc2ggdG8gcnVuLgotCSAqIEBwYXJhbSBmb3JjZQotCSAqICAgICAgICAgICAgSWYgdGhlIHZhbHVlIGlzICJ0cnVlIiwgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgcnVuIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUKLQkgKiAgICAgICAgICAgIGVudmlyb25tZW50IHNldHRpbmdzIGFyZTsgaWYgdGhlIHZhbHVlIGlzICJmYWxzZSIsIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBydW4KLQkgKiAgICAgICAgICAgIG9ubHkgaWYgdGhlIHZhbGlkYXRpb24gYnVpbGRlciB3aWxsIG5vdCBydW4gdGhlIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIG5hbWVkIHZhbGlkYXRvciBpcyBub3QgY29uZmlndXJlZCBvbiB0aGUKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgZm9yY2UsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIGFzeW5jKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmVWYWxpZGF0b3JPcGVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QKLQkgKiBAcGFyYW0gdmFsaWRhdG9ySWQKLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaWQgb2YgdGhlIHZhbGlkYXRvciB3aGljaCB5b3Ugd2lzaCB0byBydW4uCi0JICogQHBhcmFtIGZvcmNlCi0JICogICAgICAgICAgICBJZiB0aGUgdmFsdWUgaXMgInRydWUiLCB0aGUgdmFsaWRhdG9yIHNob3VsZCBiZSBydW4gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZQotCSAqICAgICAgICAgICAgZW52aXJvbm1lbnQgc2V0dGluZ3MgYXJlOyBpZiB0aGUgdmFsdWUgaXMgImZhbHNlIiwgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHJ1bgotCSAqICAgICAgICAgICAgb25seSBpZiB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIHdpbGwgbm90IHJ1biB0aGUgdmFsaWRhdG9yLgotCSAqIEBwYXJhbSBydWxlR3JvdXAKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgYSBGVUxMIG9yIEZBU1QgcGFzcyBzaG91bGQgYmUgaW52b2tlZC4KLQkgKiAKLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIG5hbWVkIHZhbGlkYXRvciBpcyBub3QgY29uZmlndXJlZCBvbiB0aGUKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdCwgZm9yY2UsIHJ1bGVHcm91cCwgYXN5bmMpOwotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJLy8gTm8gdmFsaWRhdG9yLCB3aXRoIHRoYXQgcGx1Z2luIGlkLCBjYW4gYmUgcnVuIG9uIHRoYXQgcHJvamVjdC4KLQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJLy8gZG9lc24ndCBoYXZlIHRoZSBuZWNlc3NhcnkgbmF0dXJlLgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2YWxpZGF0b3JJZCk7Ci0JCX0KLQotCQlpZiAoIXZtZC5pc0NvbmZpZ3VyZWRPblByb2plY3QocHJvamVjdCkpIHsKLQkJCS8vIE5vIHZhbGlkYXRvciwgd2l0aCB0aGF0IHBsdWdpbiBpZCwgY2FuIGJlIHJ1biBvbiB0aGF0IHByb2plY3QuCi0JCQkvLyBFaXRoZXIgdGhlIHZhbGlkYXRvciBpc24ndCBpbnN0YWxsZWQsIG9yIHRoZSBJUHJvamVjdCBwYXNzZWQgaW4KLQkJCS8vIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IG5hdHVyZS4KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odmFsaWRhdG9ySWQpOwotCQl9Ci0KLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWVuYWJsZWQuYWRkKHZtZCk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMmRhNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciB7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZWZlcmVuY2VkIGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dEZpbGVzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgSUZpbGUncy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxJRmlsZT4gZ2V0UmVmZXJlbmNlZEZpbGUoTGlzdCBpbnB1dEZpbGVzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyNzc4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckhlbHBlciB7Ci0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckhlbHBlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWxlcyBjb250YWluZWQgaW4gcHJvamVjdCB0byBpbmZpbml0ZSBkZXB0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9qZWN0RmlsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0PElGaWxlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybiByZXN1bHQ7Ci0JCQotCQl0cnkgewotCQkJcmVzdWx0ID0gY29sbGVjdEZpbGVzKHByb2plY3QubWVtYmVycygpLCByZXN1bHQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PElGaWxlPiBjb2xsZWN0RmlsZXMoSVJlc291cmNlW10gbWVtYmVycywgTGlzdDxJRmlsZT4gcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHJlY3Vyc2l2ZWx5IGNvbGxlY3QgZmlsZXMgZm9yIHRoZSBnaXZlbiBtZW1iZXJzCi0JCWZvciAoSVJlc291cmNlIHJlcyA6IG1lbWJlcnMpIHsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKWNvbGxlY3RGaWxlcygoKElGb2xkZXIpIHJlcykubWVtYmVycygpLCByZXN1bHQpOwotCQkJZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpcmVzdWx0LmFkZCgoSUZpbGUpcmVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NDJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4gVGhpcyBjbGFzcyByZXRyaWV2ZXMgdGhlIFN0cmluZ3MgZnJvbSB0aGUKLSAqICAgICAgICAgICAgIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBtYWNoaW5lJ3MgTG9jYWxlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyIHsKLQkvL0RlZmF1bHQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9UYXNrTGlzdEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Rhc2tMaXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzJkYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Rhc2tMaXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci0KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhlCi0gKiAgICAgICAgICAgICBUYXNrTGlzdEhlbHBlciBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGFza0xpc3RIZWxwZXIgX3Rhc2tMaXN0SGVscGVyID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVGFza0xpc3RIZWxwZXIgZ2V0VGFza0xpc3QoKSB7Ci0JCWlmIChfdGFza0xpc3RIZWxwZXIgPT0gbnVsbCkgewotCQkJX3Rhc2tMaXN0SGVscGVyID0gbmV3IFRhc2tMaXN0SGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF90YXNrTGlzdEhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKHBsdWdpbklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2VJZCwgbWVzc2FnZSwgbWFya2VyVHlwZSwgdGFyZ2V0T2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhpbnQgc2V2ZXJpdHksIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3Moc2V2ZXJpdHksIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5KSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBzZXZlcml0eSk7Ci0JfQotCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZU93bmVyKSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXIpOwotCX0KLQotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycykgewotCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgdGFza3MgZnJvbSB0aGUgcmVzb3VyY2UuIElmIHRoZSByZXNvdXJjZSBpcyBhbiBJUHJvamVjdCwgYWxsIHRhc2tzCi0JICogYXJlIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVyLCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSBzdWJzZXQgb2YgdGFza3MgZnJvbSB0aGUgcHJvamVjdCwgaW5jbHVkaW5nIGNoaWxkIHRhc2tzLiBFdmVyeSB0YXNrCi0JICogd2hpY2ggYmVsb25ncyB0byB0aGUgZ3JvdXAsIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLCB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFza1N1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIGFsbCB2YWxpZGF0b3IgbWFya2VycyB3aGljaCBhcmUgb3duZWQgYnkgImZyb20iIHRvIG1ha2UgdGhlaXIgb3duZXIgInRvIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVPd25lcihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS51cGRhdGVPd25lcihmcm9tLCB0byk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgb24gdGhlIElSZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLiBBbGwgbWFya2VycwotCSAqIG93bmVkIGJ5ICJmcm9tIiBoYXZlIHRoZWlyIG93bmVyIHJlYXNzaWduZWQgdG8gInRvIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVPd25lcihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnVwZGF0ZU93bmVyKGZyb20sIHRvLCByZXNvdXJjZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uQnVpbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGI2YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsQnVpbGRlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVmFsaWRhdGlvbiBGcmFtZXdvcmsgQnVpbGRlci4KLSAqIDxwPgotICogVGhpcyBidWlsZGVyIGlzIGNvbmZpZ3VyZWQgb24gSjJFRSBJUHJvamVjdHMgYXV0b21hdGljYWxseSwgYW5kIGNhbiBiZSBhZGRlZCB0byBvdGhlciB0eXBlcyBvZgotICogcHJvamVjdHMgdGhyb3VnaCB0aGUgUHJvcGVydGllcyBwYWdlLiBJdCBsYXVuY2hlcyB2YWxpZGF0aW9uIG9uIHRoZSBwcm9qZWN0IGlmIHRoZSBwcm9qZWN0IGhhcwotICogYnVpbGQgdmFsaWRhdGlvbiBlbmFibGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGxhdW5jaGVzIGEgSm9iIGZvciB0aGUgbmV3IFYyIHZhbGlkYXRvcnMgYW5kIGFsc28gYSBKb2IgZm9yIGVhY2ggb2YgdGhlIEpvYiBiYXNlZCBWMQotICogdmFsaWRhdG9ycy4gSWYgdGhlcmUgYXJlIGFueSAiaW4tbGluZSIgVjEgdmFsaWRhdGlvbnMgdGhleSBhcmUgZG9uZSBhcyBwYXJ0IG9mIHRoaXMgYnVpbGRlci4KLSAqIEJlY2F1c2Ugb2YgYWxsIHRoZSBqb2JzIHRoYXQgdGhpcyBidWlsZGVyIHNwYXducywgdGhlIGJ1aWxkIHdpbGwgdXN1YWxseSBiZSBmaW5pc2hlZCBsb25nIGJlZm9yZQotICogYWxsIHRoZSB2YWxpZGF0aW9uIGhhcyBmaW5pc2hlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25CdWlsZGVyIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fREVMVEFfQ0hBTkdFID0gLTE7Ci0JcHJvdGVjdGVkIExpc3Q8SVByb2plY3Q+IHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaENvbnRleHQgd29ya2JlbmNoQ29udGV4dCA9IG51bGw7Ci0JCi0JLyoqIEFsbCB0aGUgam9icyB0aGF0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzcGF3bnMgd2lsbCBiZWxvbmcgdG8gdGhpcyBmYW1pbHkuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRkFNSUxZX1ZBTElEQVRJT05fSk9CID0gbmV3IE9iamVjdCgpOwotCi0JcHVibGljIFZhbGlkYXRpb25CdWlsZGVyKCkgewotCX0KLQotCXByaXZhdGUgSVByb2plY3RbXSBnZXRBbGxSZWZlcmVuY2VkUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgU2V0PElQcm9qZWN0PiB2aXNpdGVkUHJvamVjdHMpIHsKLQkJaWYgKHZpc2l0ZWRQcm9qZWN0cyA9PSBudWxsKXZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCQllbHNlIGlmICh2aXNpdGVkUHJvamVjdHMuY29udGFpbnMocHJvamVjdCkpcmV0dXJuIGdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQllbHNlIHZpc2l0ZWRQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSVByb2plY3RbXSByZWZQcm9qQXJyYXkgPSBwcm9qZWN0LmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQkJCWNvbGxlY3RSZWZlcmVjZWRQcm9qZWN0KHJlZlByb2pBcnJheSk7Ci0JCQkJZm9yIChJUHJvamVjdCByZWZQcm9qZWN0IDogcmVmUHJvakFycmF5KSB7Ci0JCQkJCWdldEFsbFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0LCB2aXNpdGVkUHJvamVjdHMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldFdvcmtiZW5jaENvbnRleHQoKSB7Ci0JCWlmKHdvcmtiZW5jaENvbnRleHQgPT0gbnVsbCkgewotCQkJd29ya2JlbmNoQ29udGV4dCA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCQl3b3JrYmVuY2hDb250ZXh0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gd29ya2JlbmNoQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb2plY3RzIGZyb20gcmVmUHJvakFycmF5IHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgcHJvamVjdHMgKGlmIHRoZXkgYXJlIG5vdAotCSAqIGFscmVhZHkgaW4gdGhlIGxpc3QpLgotCSAqIEBwYXJhbSByZWZQcm9qQXJyYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdFJlZmVyZWNlZFByb2plY3QoSVByb2plY3RbXSByZWZQcm9qQXJyYXkpIHsKLQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcmVmUHJvakFycmF5KSB7Ci0JCQlpZiAoIXJlZmVyZW5jZWRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSlyZWZlcmVuY2VkUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW5ld0NsZWFuKG1vbml0b3IpOwotCQlJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwgfHwgIWN1cnJlbnRQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXJldHVybjsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oY3VycmVudFByb2plY3QpOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gcHJqcC5nZXRWYWxpZGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCQkJCS8vIEZvciB2YWxpZGF0b3JzIHdobyBhcmVuJ3QgZ29pbmcgdG8gcnVuLCBjbGVhciB0aGVpciBtZXNzYWdlcyBmcm9tIHRoZSB0YXNrIGxpc3QuCi0JCQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlIGVudHJpZXMgYmVjYXVzZSBlYWNoIFZhbGlkYXRvciBtdXN0IGJlIHVuaXF1ZS4KLQkJCQkvLyBUaGUgdW5pcXVlbmVzcyBvZiBlYWNoIFZhbGlkYXRvciBpcyBjaGVja2VkIGJ5IHRoZSBwbHVnaW4gcmVnaXN0cnkuCi0JCQkJV29ya2JlbmNoUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoY3VycmVudFByb2plY3QsIHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0W10gZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlJUHJvamVjdFtdIHJlZlByb2pBcnJheSA9IG5ldyBJUHJvamVjdFtyZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpXTsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0cy50b0FycmF5KHJlZlByb2pBcnJheSk7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJLy8gR1JLIEkgd29uZGVyIHdoeSB0aGlzIGJ1aWxkZXIgbmVlZHMgdG8ga25vdyBhYm91dCBhbGwgdGhlIG90aGVyIHJlZmVyZW5jZWQgcHJvamVjdHM/Ci0JCS8vIHdvbid0IHRoZXkgaGF2ZSBidWlsZGVycyBvZiB0aGVpciBvd24uCi0JCUlQcm9qZWN0W10gcmVmZXJlbmNlZCA9IGdldEFsbFJlZmVyZW5jZWRQcm9qZWN0cyhwcm9qZWN0LCBudWxsKTsKLQkJaWYgKFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKHByb2plY3QpIHx8IAotCQkJVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaXNEaXNhYmxlZChwcm9qZWN0KSlyZXR1cm4gcmVmZXJlbmNlZDsKLQotCQl0cnkgewotCQkJbmV3QnVpbGQoa2luZCwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0KLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlkZWx0YSA9IGdldERlbHRhKHByb2plY3QpOwotCQkJYm9vbGVhbiBkb0Z1bGxCdWlsZCA9IChraW5kID09IEZVTExfQlVJTEQpOwotCQkJCi0JCQkvLyBJdCBpcyBwb3NzaWJsZSBmb3Iga2luZCB0byA9PSBBVVRPX0JVSUxEIHdoaWxlIGRlbHRhIGlzIG51bGwKLQkJCS8vIChzYXcgdGhpcyB3aGVuIGNyZWF0aW5nIGEgcHJvamVjdCBieSBjb3B5aW5nIGFub3RoZXIgcHJvamVjdC4pCi0JCQkvLyBIb3dldmVyLCBhICJSZWJ1aWxkIFByb2plY3QiIHdpbGwgaW52b2tlIHRoaXMgYnVpbGRlciB3aXRoCi0JCQkvLyBraW5kPT1GVUxMX0JVSUxEIGFuZCBhIG51bGwgZGVsdGEsIGFuZCB2YWxpZGF0aW9uIHNob3VsZCBydW4gaW4gdGhhdCBjYXNlLgotCQkJaWYgKCFkb0Z1bGxCdWlsZCAmJiBkZWx0YSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKHJlZmVyZW5jZWQpKSB7Ci0JCQkJCXBlcmZvcm1GdWxsQnVpbGRGb3JSZWZlcmVuY2VkUHJvamVjdENoYW5nZWQobW9uaXRvciwgcHJqcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybXMgPSBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9OwotCQkJCQltb25pdG9yLnN1YlRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19OVUxMX0RFTFRBLCBtc2dQYXJtcykpOwotCQkJCQkvLyBBIG51bGwgZGVsdGEgbWVhbnMgdGhhdCBhIGZ1bGwgYnVpbGQgbXVzdCBiZSBwZXJmb3JtZWQsCi0JCQkJCS8vIGJ1dCB0aGlzIGJ1aWxkZXIgd2FzIGludm9rZWQgd2l0aCBhbiBpbmNyZW1lbnRhbCBvciBhdXRvbWF0aWMKLQkJCQkJLy8gYnVpbGQga2luZC4gUmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgc28gdGhhdCB0aGUgdXNlcgotCQkJCQkvLyBkb2Vzbid0IGhhdmUgdG8gd2FpdCBmb3JldmVyLgotCQkJCX0KLQkJCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJCX0KLQkJCWlmIChkb0Z1bGxCdWlsZCkgewotCQkJCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJaWYgKGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKHJlZmVyZW5jZWQpKQotCQkJCQkJcGVyZm9ybUZ1bGxCdWlsZEZvclJlZmVyZW5jZWRQcm9qZWN0Q2hhbmdlZChtb25pdG9yLCBwcmpwKTsKLQkJCQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JCQkJfQotCQkJCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCwgZGVsdGEsIHRydWUpOwotCQkJCW9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiByZWZlcmVuY2VkOwotCQl9IGZpbmFsbHkgewotCQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVyZW5jZWRQcm9qZWN0SW5EZWx0YShJUHJvamVjdFtdIHJlZmVyZW5jZWQpIHsKLQkJSVByb2plY3QgcCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZC5sZW5ndGg7IGkrKykgewotCQkJcCA9IHJlZmVyZW5jZWRbaV07Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKHApOwotCQkJaWYgKGRlbHRhICE9IG51bGwgJiYgZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRnVsbEJ1aWxkRm9yUmVmZXJlbmNlZFByb2plY3RDaGFuZ2VkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlwZXJmb3JtRnVsbEJ1aWxkKG1vbml0b3IsIHByanAsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRnVsbEJ1aWxkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlwZXJmb3JtRnVsbEJ1aWxkKG1vbml0b3IsIHByanAsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUZ1bGxCdWlsZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFByb2plY3RDb25maWd1cmF0aW9uIHByanAsIGJvb2xlYW4gb25seURlcGVuZGVudFZhbGlkYXRvcnMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkVmFsaWRhdG9ycyA9IHByanAuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnModHJ1ZSwgb25seURlcGVuZGVudFZhbGlkYXRvcnMpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzICE9IG51bGwpICYmIChlbmFibGVkVmFsaWRhdG9ycy5sZW5ndGggPiAwKSkgewotCQkJU2V0IGVuYWJsZWRWYWxpZGF0b3JzU2V0ID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVuYWJsZWRWYWxpZGF0b3JzU2V0LCB0cnVlKTsKLQkJCW9wLnJ1bihtb25pdG9yKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIG5ldyB2YWxpZGF0aW9uIGJ1aWxkZXIuIFRoaXMgaXMgYSB0cmFuc2l0aW9uIG1ldGhvZCwgd2hpbGUgd2UgY29udGludWUgdG8gaGF2ZQotCSAqIHRoZSBvbGQgYW5kIG5ldyB2YWxpZGF0aW9uIGJ1aWxkZXJzLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIGJ1aWxkCi0JICogCi0JICogQHNlZSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI0FVVE9fQlVJTEQKLQkgKiBAc2VlIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjQ0xFQU5fQlVJTEQKLQkgKiBAc2VlIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjRlVMTF9CVUlMRAotCSAqIEBzZWUgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNJTkNSRU1FTlRBTF9CVUlMRAotCSAqLwotCXByaXZhdGUgdm9pZCBuZXdCdWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCXN3aXRjaCAoa2luZCl7Ci0JCQljYXNlIEFVVE9fQlVJTEQ6Ci0JCQljYXNlIElOQ1JFTUVOVEFMX0JVSUxEOgotCQkJCWRlbHRhID0gZ2V0RGVsdGEocHJvamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCUpvYiBqb2IgPSBuZXcgVmFsQnVpbGRlckpvYihwcm9qZWN0LCBkZWx0YSwga2luZCwgVmFsT3BlcmF0aW9uTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0T3BlcmF0aW9uKCkpOwkJCi0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSdW4gdGhlIG5ldyBjbGVhbiBtZXRob2QuIFRoaXMgaXMgYSB0cmFuc2l0aW9uIG1ldGhvZCwgd2hpbGUgd2UgY29udGludWUgdG8gaGF2ZQotCSAqIHRoZSBvbGQgYW5kIG5ldyB2YWxpZGF0aW9uIGJ1aWxkZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBuZXdDbGVhbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuY2xlYW4oZ2V0UHJvamVjdCgpLCBtb25pdG9yKTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGZhNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0gKiAKLSAqIENvbnN0YW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgc3RyaW5nIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbi4KLSAqIAotICogU2VlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlLCBpbiB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5LCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Db25zdGFudHMgZXh0ZW5kcyBSZXNvdXJjZUNvbnN0YW50cyB7Ci0JLy9EZWZhdWx0Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyOTM1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5GaWx0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLklQcm9qZWN0VmFsaWRhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0b3JMYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtZXRob2RzIG11c3Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbnlvbmUgb3RoZXIgdGhhbiB0aGlzIGNsYXNzLCBzaW5jZQotICogc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsaWRhdG9yIGlzIGRvbmUgaGVyZSAodmlhIHRoZSBnZXRQcm9qZWN0KCkgbWV0aG9kKS4gVGhlCi0gKiBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSB0aGUgSVByb2plY3QgaXNuJ3Qga25vd24gdW50aWwgcnVudGltZS4KLSAqIDxwPgotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JLy8gU2luY2UgSVJlc291cmNlQ29uc3RhbnRzIGRvbid0IGhhdmUgYSAibm8gZGVsdGEiIGZsYWcsIGxldCB0aGlzIGNvbnN0YW50IGJlIHRoZSBmbGFnLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0RFTFRBX0NIQU5HRSA9IC0xOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfQVNfU1RSSU5HID0gIklGaWxlRGVsdGFbezB9XSAneyd7MX0nfSciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEZvciB0aGUgZGVwcmVjaWF0ZWQgY29uc3RydWN0b3JzLCBieSBkZWZhdWx0IHRoZSBvcGVyYXRpb24gd2lsbCBub3QgZm9yay4gCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQVNZTkMgPSB0cnVlOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0ZPUkNFID0gdHJ1ZTsKLQkKLQljbGFzcyBWYWxpZGF0aW9uTGF1bmNoZXJKb2IgZXh0ZW5kcyBKb2IgewotCSAgICBwcml2YXRlIEpvYiB2YWxpZGF0aW9uSm9iOwotCSAgICBwdWJsaWMgVmFsaWRhdGlvbkxhdW5jaGVySm9iKEpvYiB2YWxpZGF0aW9uSm9iKSB7Ci0gICAgICAgICAgICBzdXBlcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfVkFMSURBVElPTl9KT0JfTVNHKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNldFN5c3RlbSh0cnVlKTsKLSAgICAgICAgICAgIHNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Kb2I9IHZhbGlkYXRpb25Kb2I7Ci0JICAgIH0KLQkgICAgCi0JICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAJCXZhbGlkYXRpb25Kb2Iuc2NoZWR1bGUoKTsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCSAgICB9Ci0JICAgIAotCSAgICBAT3ZlcnJpZGUKLQkgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCWlmIChmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpcmV0dXJuIHRydWU7Ci0JCQlpZiAoZmFtaWx5ID09IFZhbGlkYXRpb25CdWlsZGVyLkZBTUlMWV9WQUxJREFUSU9OX0pPQil7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYmVsb25nc1RvKGZhbWlseSk7Ci0JICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgREVGQVVMVF9BU1lOQwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0ZPUksgPSBmYWxzZTsgLy8gQGRlcHJlY2F0ZWQKLQlwcml2YXRlIElQcm9qZWN0IAkJX3Byb2plY3Q7IC8vIHByb2plY3QgdG8gYmUgdmFsaWRhdGVkCi0JcHJpdmF0ZSBpbnQgCQkJX3J1bGVHcm91cCA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBib29sZWFuIF9mb3JrID0gREVGQVVMVF9BU1lOQzsgLy8gZG8gbm90IGZvcmsgdGhlIHZhbGlkYXRpb24gaW50byBhCi0JLy8gZGlmZmVyZW50IHRocmVhZCBieSBkZWZhdWx0Ci0JcHJpdmF0ZSBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gX2ZpbGVEZWx0YXM7IC8vIFRvIHJlZHVjZSBvYmplY3QgY3JlYXRpb24sCi0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfZGVsdGE7Ci0JCi0JLy8gdGhlIHJlc291cmNlIGRlbHRhIHRyZWUgdG8gYmUgcHJvY2Vzc2VkLCBvciBudWxsIGlmIGEgZnVsbCBidWlsZC9tZW51Ci0JLy8gb3B0aW9uIHdhcyB0cmlnZ2VyZWQuIFRoaXMgdmFsdWUgaXMgY2FjaGVkIHNvIHRoYXQgdmFsaWRhdGlvbiBjYW4gYmUgcnVuCi0JLy8gZWl0aGVyIGZyb20gYSBidWlsZGVyLCBvciBmcm9tIGEgbWVudSBpdGVtLiAoVGhlIE9wZXJhdGlvbiBpbnRlcmZhY2UKLQkvLyBkb2Vzbid0IGFsbG93IGFueSBwYXJhbWV0ZXIgb24gZXhlY3V0ZSBleGNlcHQgdGhlIElQcm9ncmVzc01vbml0b3IuKQotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBfZW5hYmxlZFZhbGlkYXRvcnM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9mb3JjZSA9IERFRkFVTFRfRk9SQ0U7IC8vIGZvcmNlIHRoaXMgb3BlcmF0aW9uIHRvIHJ1biBldmVuIGlmIGl0IGRvZXNuJ3QgbmVlZCB0bz8KLQlwcml2YXRlIGJvb2xlYW4gX2lzRnVsbFZhbGlkYXRlOyAJLy8gUnVuIGEgZnVsbCB2YWxpZGF0aW9uIG9yIGFuIGluY3JlbWVudGFsPyAodHJ1ZSA9IGZ1bGwpCi0JcHJpdmF0ZSBCb29sZWFuIF9pc0F1dG9CdWlsZDsgCQkvLyBJcyB0aGUgZ2xvYmFsIGF1dG8tYnVpbGQgcHJlZmVyZW5jZSBlbmFibGVkPwotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBfbGF1bmNoZWRWYWxpZGF0b3JzOwotCQotCXByb3RlY3RlZCBJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0OwotCi0JLy8gYXJlIGVuYWJsZWQgYW5kIHdlcmUgbGF1bmNoZWQgKGkuZS4sIHRoYXQgaGF2ZSBpbnB1dCB0byB2YWxpZGF0ZSkuIEZvciBpbnRlcm5hbAotCS8vIHZhbGlkYXRpb24gZnJhbWV3b3JrIHVzZSBvbmx5OwotCS8vIGl0J3MgbmVlZGVkIGZvciB0aGUgYXV0b21hdGljIHRlc3RzLgotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIEZJTkVTVCBsb2dnaW5nLCB0byByZXBvcnQgZXhhY3RseSB3aGF0IGRlbHRhcyB3ZXJlIGFib3V0IHRvIGJlCi0JICogdmFsaWRhdGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWx0YUFzU3RyaW5nKElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQlTdHJpbmcgYXJncyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1BcmdzID0gMDsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCW51bUFyZ3MgPSBkZWx0YS5sZW5ndGg7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUEpOwotCQkJCWJ1ZmZlci5hcHBlbmQoZGVsdGFbaV0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlidWZmZXIucmVwbGFjZSgwLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8gbWFnaWMgbnVtYmVycyAwIGFuZCAxID0+IFJlbW92ZSBmaXJzdCBDT01NQSBmcm9tIHRoZSBsaXN0IChoZW5jZSBpbmRleCAwKTsgbGVuZ3RoIG9mIENPTU1BIGlzIDIsIGhlbmNlIGluZGV4IDAsIDEuCi0JCQlhcmdzID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERFTFRBX0FTX1NUUklORywgbmV3IE9iamVjdFtde1N0cmluZy52YWx1ZU9mKG51bUFyZ3MpLCBhcmdzfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXBvcnRlciA9PSBudWxsKXJldHVybjsKLQkJZWxzZSBpZiAocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRm9yY2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuICgoZGVsdGEgPT0gbnVsbCkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGRGb3JjZShPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkUmVzb3VyY2VzID09IG51bGwpIHx8IChjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aCA9PSAwKSkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25PcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIERFRkFVTFRfQVNZTkMsIERFRkFVTFRfRk9SQ0UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBudWxsLCBudWxsLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBERUZBVUxUX0ZPUkNFLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZC4gV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCwKLQkgKiAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEsIEJvb2xlYW4sIGludCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgYm9vbGVhbiBpc0F1dG9CdWlsZCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBmb3JrKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsICgoaXNBdXRvQnVpbGQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSksIHJ1bGVHcm91cCwgZm9yaywgZm9yY2UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBCb29sZWFuIGlzQXV0b0J1aWxkLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGZvcmspIHsKLQkJc3VwZXIoKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfZGVsdGEgPSBkZWx0YTsKLQkJX2lzQXV0b0J1aWxkID0gaXNBdXRvQnVpbGQ7Ci0JCV9ydWxlR3JvdXAgPSBydWxlR3JvdXA7Ci0JCV9mb3JrID0gZm9yazsKLQkJX2ZvcmNlID0gZm9yY2U7Ci0JCV9lbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCX0KLQkKLQkvKioKLQkgKiBJbnRlcm5hbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIEJvb2xlYW4gaXNBdXRvQnVpbGQsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gZm9yaykgewotCQlzdXBlcigpOwotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCV9kZWx0YSA9IGRlbHRhOwotCQlfaXNBdXRvQnVpbGQgPSBpc0F1dG9CdWlsZDsKLQkJX3J1bGVHcm91cCA9IHJ1bGVHcm91cDsKLQkJX2ZvcmsgPSBmb3JrOwotCQlfZm9yY2UgPSBmb3JjZTsKLQkJX2VuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWNvbnRleHQgPSBhQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlQ2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlTZXQgZW5hYmxlZFZhbGlkYXRvcnMgPSBnZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVuYWJsZWRWYWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IG51bGw7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQLCBuZXcgU3RyaW5nW117dm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KSk7Ci0JCQl0cnkgewotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZtZC5nZXRWYWxpZGF0b3IoKSk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWFkZENhbmNlbFRhc2sodm1kKTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJfQotCX0gCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBzdGFydAotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGxvZ1ZhbGlkYXRpb25JbmZvKFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSUZpbGVEZWx0YVtdIGRlbHRhLCBMb2dnZXIgbG9nZ2VyLCBsb25nIHN0YXJ0KSB7Ci0vLwkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLS8vCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotLy8JCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLmxhdW5jaFZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0vLwkJZW50cnkuc2V0UHJvamVjdE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0vLwkJZW50cnkuc2V0VG9vbE5hbWUodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0vLwkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotLy8JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLS8vCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLS8vCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9IGVsc2UgewotLy8JCQkJaWYgKGRlbHRhLmxlbmd0aCA9PSAwKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoZ2V0RGVsdGFBc1N0cmluZyhkZWx0YSkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWVudHJ5LnNldERldGFpbHMoYnVmZmVyLnRvU3RyaW5nKCkpOwotLy8JCX0KLS8vCQlsb2dnZXIud3JpdGUoTGV2ZWwuSU5GTywgZW50cnkpOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gZXhjCi0JICovCi0vLwlwcml2YXRlIHZvaWQgaGFuZGxlVGhyb3dhYmxlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBUaHJvd2FibGUgZXhjKSB7Ci0vLwkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvciBDbGFzc0Nhc3QsCi0vLwkJLy8gZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgIiBtZXNzc2FnZS4KLS8vCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzIElCTQotLy8JCS8vIFNlcnZpY2UuCi0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLS8vCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLS8vCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0vLwkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotLy8JCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotLy8JCXRyeSB7Ci0vLwkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLS8vCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLS8vCQkJdGhyb3cgZTsKLS8vCQl9Ci0vLwkJcmV0dXJuOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gZXhjMgotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGhhbmRsZUluc3RhbnRpYXRpb25FeGNlcHRpb24oVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0vLwkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLS8vCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotLy8JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotLy8JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLS8vCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb246OmxhdW5jaFZhbGlkYXRvciAoZGVwcmVjYXRlZCkiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjMik7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVWYWxpZGF0aW9uRXhjZXB0aW9ucyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotLy8JCS8vIEZpcnN0LCBzZWUgaWYgYSB2YWxpZGF0b3IganVzdCBjYXVnaHQgYWxsIFRocm93YWJsZXMgYW5kCi0vLwkJLy8gYWNjaWRlbnRhbGx5IHdyYXBwZWQgYSBNZXNzYWdlTGltaXRFeGNlcHRpb24gaW5zdGVhZCBvZiBwcm9wYWdhdGluZwotLy8JCS8vIGl0LgotLy8JCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLS8vCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNZXNzYWdlTGltaXRFeGNlcHRpb24pIHsKLS8vCQkJCU1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBtc3NnRXhjID0gKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbikgZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKTsKLS8vCQkJCXRocm93IG1zc2dFeGM7Ci0vLwkJCX0gZWxzZSBpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0vLwkJCQkJdmV4Yy5zZXRDbGFzc0xvYWRlcih2bWQuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsgLy8gZmlyc3QsCi0vLwkJCQkJLy8gc2V0IHRoZSBjbGFzcyBsb2FkZXIsc28gdGhhdCB0aGUgZXhjZXB0aW9uJ3MgZ2V0TWVzc2FnZSgpIG1ldGhvZCBjYW4gcmV0cmlldmUKLS8vCQkJCQkvLyB0aGUgcmVzb3VyY2UgYnVuZGxlCi0vLwkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBsb2cgdGhlIGVycm9yCi0vLwkJLy8gYW5kIGNvbnRpbnVlCi0vLwkJLy8gd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0vLwkJdHJ5IHsKLS8vCQkJZXhjLnNldENsYXNzTG9hZGVyKHZtZC5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOyAvLyBmaXJzdCwKLS8vCQkJLy8gc2V0IHRoZSBjbGFzcyBsb2FkZXIsc28gdGhhdCB0aGUgZXhjZXB0aW9uJ3MgZ2V0TWVzc2FnZSgpIG1ldGhvZCBjYW4gcmV0cmlldmUgdGhlCi0vLwkJCS8vIHJlc291cmNlIGJ1bmRsZQotLy8JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQl9Ci0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbi52YWxpZGF0ZShXb3JrYmVuY2hNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotLy8JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0vLwkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLS8vCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLS8vCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQkJfQotLy8JCX0KLS8vCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0vLwkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0vLwkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpICE9IG51bGwpIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0vLwkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVIZWxwZXJDbGVhbnVwRXhjZXB0aW9ucyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBUaHJvd2FibGUgZXhjKSB7Ci0vLwkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvciBDbGFzc0Nhc3QsCi0vLwkJLy8gZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgIiBtZXNzc2FnZS4KLS8vCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzIElCTQotLy8JCS8vIFNlcnZpY2UuCi0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLS8vCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLS8vCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0vLwkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotLy8JCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotLy8JCXRyeSB7Ci0vLwkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLS8vCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLS8vCQkJdGhyb3cgZTsKLS8vCQl9Ci0vLwkJcmV0dXJuOwotLy8JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3JrKCkgewotCQlyZXR1cm4gX2Zvcms7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3JjZSgpIHsKLQkJcmV0dXJuIF9mb3JjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZShib29sZWFuIGZvcmNlKSB7Ci0JCV9mb3JjZSA9IGZvcmNlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb2RlIHRoYXQgaW52b2tlZCB0aGlzIG9wZXJhdGlvbiBzdXNwZW5kZWQgYXV0by1idWlsZCBiZWZvcmUgaW52b2tpbmcgdGhpcyBvcGVyYXRpb24sCi0JICogdGhlIHVzZXIncyBhdXRvLWJ1aWxkIHNldHRpbmcgaXMgc3RvcmVkIGluIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9CdWlsZCgpIHsKLQkJaWYgKF9pc0F1dG9CdWlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCk7Ci0JCX0KLQkJcmV0dXJuIF9pc0F1dG9CdWlsZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvT24pIHsKLQkJX2lzQXV0b0J1aWxkID0gKChhdXRvT24pID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGdWxsVmFsaWRhdGUoKSB7Ci0JCXJldHVybiBfaXNGdWxsVmFsaWRhdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZ1bGxWYWxpZGF0ZShib29sZWFuIGIpIHsKLQkJX2lzRnVsbFZhbGlkYXRlID0gYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFJ1bGVHcm91cCgpIHsKLQkJcmV0dXJuIF9ydWxlR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbGlkYXRvciBtdXN0IHJ1biAoaS5lLiwgaXQgaGFzIGNoYW5nZXMgdG8gdmFsaWRhdGUsIGFuZCBpdCB3YXMgbm90Ci0JICogcnVuIGF1dG9tYXRpY2FsbHkuKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25OZWNlc3NhcnkoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJLy8gVmFsaWRhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGlmIHRoZXJlIGFyZSBubyBmaWxlcyBmb3IgdGhlIHZhbGlkYXRvciB0byB2YWxpZGF0ZS4KLQkJcmV0dXJuIGlzRnVsbFZhbGlkYXRlKCkgfHwgKGRlbHRhLmxlbmd0aCA+IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmLCBnaXZlbiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGFuZCBmaWxlIGRlbHRhcywgdGhlcmUgaXMgd29yayBmb3IgdGhpcwotCSAqIG9wZXJhdGlvbiB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCVNldCBlbmFibGVkVmFsaWRhdG9ycyA9IGdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVuYWJsZWRWYWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGdldEZpbGVEZWx0YXMobW9uaXRvciwgdm1kKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZ2V0RmlsZURlbHRhcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKF9maWxlRGVsdGFzID09IG51bGwpbG9hZEZpbGVEZWx0YXMobW9uaXRvcik7Ci0JCXJldHVybiBfZmlsZURlbHRhczsKLQl9Ci0KLQlwcml2YXRlIElGaWxlRGVsdGFbXSBnZXRGaWxlRGVsdGFzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNldDxJRmlsZURlbHRhPiByZXN1bHQgPSBnZXRGaWxlRGVsdGFzKG1vbml0b3IpLmdldCh2bWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpcmV0dXJuIG5ldyBJRmlsZURlbHRhWzBdOwotCQkKLQkJSUZpbGVEZWx0YVtdIHRlbXAgPSBuZXcgSUZpbGVEZWx0YVtyZXN1bHQuc2l6ZSgpXTsKLQkJcmVzdWx0LnRvQXJyYXkodGVtcCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIHRoZSBmaWxlIGRlbHRhcyAoVk1EIDw9PlNldFtJRmlsZURlbHRhXSkgaWYgdGhlIGZpbGUgZGVsdGFzIGhhdmVuJ3QgYmVlbiBsb2FkZWQuIElmIHRoZQotCSAqIGRlbHRhcyBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQsIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRmlsZURlbHRhcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gQWx0aG91Z2gsIGZvciBhIGZ1bGwgYnVpbGQsIHdlIGRvbid0IGJ1aWxkIHVwIGEgbGlzdCBvZiBjaGFuZ2VkCi0JCS8vIGZpbGVzLCB3ZSBkbyBuZWVkIHRvIG5vdGlmeSBlYWNoIElXb3JrYmVuY2hDb250ZXh0IHRoYXQgYW4KLQkJLy8gSVJlc291cmNlIGhhcyBiZWVuIGZpbHRlcmVkIGluLgotCQkvLyBJdCdzIGEgZnVsbCB2YWxpZGF0aW9uIGlmIHRoZSBJUmVzb3VyY2VEZWx0YSBpcyBudWxsIGFuZCB0aGUKLQkJLy8gT2JqZWN0W10gKG9yIElSZXNvdXJjZVtdKSBpcyBhbHNvIG51bGwuCi0JCS8vIGkuZS4sIGl0J3MgYSBmdWxsIHZhbGlkYXRpb24gaWYgbm8gaW5jcmVtZW50YWwgaW5wdXQgaGFzIGJlZW4gc2V0LgotCQlzZXRGdWxsVmFsaWRhdGUoKGdldERlbHRhKCkgPT0gbnVsbCkgJiYgKF9maWxlRGVsdGFzID09IG51bGwpKTsKLQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLQkJCV9maWxlRGVsdGFzID0gRmlsdGVyVXRpbC5sb2FkRGVsdGFzKG1vbml0b3IsIGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGdldFByb2plY3QoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlfZmlsZURlbHRhcyA9IEZpbHRlclV0aWwubG9hZERlbHRhcyhtb25pdG9yLCBnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBnZXREZWx0YSgpKTsgLy8gdHJhdmVyc2UsCi0JCQkvLyBhbmQgcHJvY2VzcywgZWFjaCByZXNvdXJjZSBpbiB0aGUgZGVsdGEgdHJlZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmlsZURlbHRhcyhNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZGVsdGFzKSB7Ci0JCV9maWxlRGVsdGFzID0gZGVsdGFzOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YSgpIHsKLQkJcmV0dXJuIF9kZWx0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlfZGVsdGEgPSBkZWx0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcmVWYWxpZGF0b3JzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIChnZXRFbmFibGVkVmFsaWRhdG9ycygpLnNpemUoKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwgKGFzIHN0b3JlZCBpbgotCSAqIGdldFByb2plY3QoKSksIGFuZCBlbmFibGVkIGJ5IHRoZSB1c2VyIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRFbmFibGVkVmFsaWRhdG9ycygpIHsKLQkJcmV0dXJuIF9lbmFibGVkVmFsaWRhdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCwgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuIEl0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZQotCSAqIGF1dG9tYXRlZCB2YWxpZGF0aW9uIGZyYW1ld29yayB0ZXN0cy4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRMYXVuY2hlZFZhbGlkYXRvcnMoKSB7Ci0JCWlmIChfbGF1bmNoZWRWYWxpZGF0b3JzID09IG51bGwpIHsKLQkJCV9sYXVuY2hlZFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJfQotCQlyZXR1cm4gX2xhdW5jaGVkVmFsaWRhdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQgZXZtZHMpIHsKLQkJLy8gQ2hlY2sgdGhhdCBldmVyeSBWTUQgaW4gdGhlIHNldCBpcyBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdC4KLQkJLy8gTmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzZXIgY2FuIG1hbnVhbGx5IGNob29zZSB3aGljaCB2YWxpZGF0b3JzCi0JCS8vIHRvIGxhdW5jaCwgYW5kIHRoZSB2YWxpZGF0b3IgbWF5IG5vdCBiZSBpbnN0YWxsZWQuCi0JCV9lbmFibGVkVmFsaWRhdG9ycy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV2bWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJX2VuYWJsZWRWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSVByb2plY3QgdGhhdCB0aGlzIFZhbGlkYXRpb25PcGVyYXRpb24gd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VW5pdHNPZldvcmsoKSB7Ci0JCS8qCi0JCSAqIC8vIExldCBvbmUgdW5pdCBvZiB3b3JrIGVxdWFsIG9uZSByZXNvdXJjZS4gbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyAvLyBpLmUuLCBlYWNoCi0JCSAqIGVuYWJsZWQgdmFsaWRhdG9yIG11c3QgcHJvY2VzcyAoYXQgbW9zdCkgZWFjaCByZXNvdXJjZSBpbiB0aGUgcHJvamVjdDsgY291bnQgZWFjaCBwcm9jZXNzCi0JCSAqIGFzIG9uZSB1bml0IG9mIHdvcmsgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBjZWlsaW5nIG51bWJlciwgYmVjYXVzZSBpZiB3ZSdyZSBkb2luZyBhbgotCQkgKiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCBub3QgYWxsIHJlc291cmNlcyB3aWxsIC8vIGJlIHZhbGlkYXRlZC4KLQkJICogc2V0TnVtUmVzb3VyY2VzKGNvdW50UmVzb3VyY2VzKGdldFByb2plY3QoKSkpOyBnZXRFbmFibGVkVmFsaWRhdG9ycygpLnNpemUoKTsKLQkJICovCi0JCS8vIFVudGlsIHRoZSB2YWxpZGF0b3JzIGNhbiByZXBvcnQgdW5pdHMtb2Ytd29yayBjb21wbGV0ZSwKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgbW9uaXRvciB3aXRoIGFuIHVua25vd24gYW1vdW50IG9mIHdvcmsuCi0JCS8vIChTbyB0aGUgdXNlciB3aWxsIHNlZSBtb3ZlbWVudCBpbiB0aGUgcHJvZ3Jlc3MgYmFyLCBldmVuCi0JCS8vIGlmIHRoZSBtb3ZlbWVudCBkb2Vzbid0IGluZGljYXRlIHRoZSBhbW91bnQgb2Ygd29yayBkb25lLikKLQkJcmV0dXJuIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBpcyBjYW5jZWxsaW5nIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC9yZXNvdXJjZSwgQWRkIGFuIGluZm9ybWF0aW9uIHRhc2sKLQkgKiB0byB0aGUgdGFzayBsaXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IHZhbGlkYXRpb24gaGFzIG5vdCBiZWVuIHJ1biBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENhbmNlbFRhc2soVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCUludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuYWRkT3BlcmF0aW9uVGFzayhnZXRQcm9qZWN0KCksIHZtZCwgUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIHRoZSB2YWxpZGF0aW9uIG9mIGVhY2ggY29uZmlndXJlZCBlbmFibGVkIHZhbGlkYXRvciBvbiB0aGUgY3VycmVudAotCSAqIHByb2plY3QuCi0JICogCi0JICogVGhlIElQcm9ncmVzc01vbml0b3IgcGFzc2VkIGluIG11c3Qgbm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gSW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciBvciBub3QgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsZWQsIHRoZSBtb25pdG9yIG11c3Qgbm90IGJlIG51bGwuCi0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yID09IG51bGwpcmV0dXJuOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmIChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5pc1N1c3BlbmRlZChwcm9qZWN0KSlyZXR1cm47Ci0JCQlpZiAoVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaXNEaXNhYmxlZChwcm9qZWN0KSlyZXR1cm47Ci0JCQkKLQkJCWlmICghYXJlVmFsaWRhdG9yc0VuYWJsZWQoKSkgewotCQkJCS8vIHNhdmUgc29tZSBwcm9jZXNzaW5nIHRpbWUuLi4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKGdldFByb2plY3QoKSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBQZXJpb2RpY2FsbHkgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkJCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCQlwcmVWYWxpZGF0ZShyZXBvcnRlcik7Ci0JCQkJdmFsaWRhdGUocmVwb3J0ZXIpOwotCQkJCXZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vVE9ETyBHUksgZGV0ZXJtaW5lIGlmIHRpbWluZyBpbmZvIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0vLwkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLS8vCQkJCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotLy8JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ucnVuKFdvcmtiZW5jaE1vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWVudHJ5LnNldFByb2plY3ROYW1lKGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotLy8JCQkJZW50cnkuc2V0VG9vbE5hbWUoIlZhbGlkYXRpb25PcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLS8vCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJCVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciByZWZGaWxlVmFsaWRhdG9yID0gcmVhZGVyLmdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcigpOwotCQkJaWYgKHJlZkZpbGVWYWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChfZGVsdGEgIT0gbnVsbCkgewotCQkJCQlyZWZGaWxlVmFsaWRhdGVGaWxlRGVsdGEocmVwb3J0ZXIsIHJlZkZpbGVWYWxpZGF0b3IpOwotCQkJCX0gZWxzZSBpZiAoX3Byb2plY3QgIT0gbnVsbCkgewotCQkJCQlwb3N0VmFsaWRhdGVQcm9qZWN0KHJlcG9ydGVyLCByZWZGaWxlVmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZkZpbGVWYWxpZGF0ZUZpbGVEZWx0YShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIHJlZkZpbGVWYWxpZGF0b3IpIHsKLQkJSVJlc291cmNlRGVsdGFbXSByZXNvdXJjZURlbHRhID0gX2RlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCk7Ci0JCUxpc3Q8SVJlc291cmNlPiBpbnB1dEZpbGVzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0JCQotCQlMaXN0PElGaWxlPiByZWZlcmVuY2luZ0ZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKLQkJaWYgKHJlc291cmNlRGVsdGEgIT0gbnVsbCAmJiByZXNvdXJjZURlbHRhLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRGVsdGFbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCWdldEZpbGVSZXNvdXJjZURlbHRhSW5Gb2xkZXIocmVzb3VyY2VEZWx0YVtpXSwgaW5wdXRGaWxlcyk7Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQlpbnB1dEZpbGVzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlMaXN0PElGaWxlPiByRmlsZXNUb1ZhbGlkYXRlID0gcmVmRmlsZVZhbGlkYXRvci5nZXRSZWZlcmVuY2VkRmlsZShpbnB1dEZpbGVzKTsKLQkJCWlmIChyRmlsZXNUb1ZhbGlkYXRlICE9IG51bGwgJiYgIXJGaWxlc1RvVmFsaWRhdGUuaXNFbXB0eSgpKQotCQkJCXJlZmVyZW5jaW5nRmlsZXMuYWRkQWxsKHJGaWxlc1RvVmFsaWRhdGUpOwotCQkJdHJ5IHsKLQkJCQlpZiAoIXJlZmVyZW5jaW5nRmlsZXMuaXNFbXB0eSgpKQotCQkJCQl2YWxpZGF0ZVJlZmVyZW5jaW5nRmlsZXMocmVwb3J0ZXIsIHJlZmVyZW5jaW5nRmlsZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2V0RmlsZVJlc291cmNlRGVsdGFJbkZvbGRlcihJUmVzb3VyY2VEZWx0YSBkZWx0YSwgTGlzdDxJUmVzb3VyY2U+IGlucHV0RmlsZXMpIHsKLQkJSVJlc291cmNlRGVsdGFbXSByZXNvdXJjZURlbHRhID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlRGVsdGEubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRGVsdGFbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWlucHV0RmlsZXMuYWRkKHJlc291cmNlKTsKLQkJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcilnZXRGaWxlUmVzb3VyY2VEZWx0YUluRm9sZGVyKHJlc291cmNlRGVsdGFbaV0sIGlucHV0RmlsZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3N0VmFsaWRhdGVQcm9qZWN0KFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgcmVmRmlsZVZhbGlkYXRvcikgewotCQlTZXQgc2V0ID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKF9wcm9qZWN0KTsKLQkJSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXQubmV4dCgpOwotCQkJTGlzdCBmaWx0ZXJzID0gZGF0YS5nZXROYW1lRmlsdGVycygpOwotCQkJTGlzdCBmaWxlcyA9IGdldEFsbEZpbGVzRm9yRmlsdGVyKGZpbHRlcnMpOwotCQkJaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0PElGaWxlPiBmaWxlRm9yVmFsaWRhdGlvbiA9IHJlZkZpbGVWYWxpZGF0b3IuZ2V0UmVmZXJlbmNlZEZpbGUoZmlsZXMpOwotCQkJCXRyeSB7Ci0JCQkJCXZhbGlkYXRlUmVmZXJlbmNpbmdGaWxlcyhyZXBvcnRlciwgZmlsZUZvclZhbGlkYXRpb24pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWx0ZXJzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdDxJRmlsZT4gZ2V0QWxsRmlsZXNGb3JGaWx0ZXIoTGlzdCBmaWx0ZXJzKSB7Ci0JCWlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgYWxsUHJvamVjdEZpbGVzID0gUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmdldEFsbFByb2plY3RGaWxlcyhfcHJvamVjdCk7Ci0JCQlMaXN0PElGaWxlPiBmaWx0ZXJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSBmaWx0ZXJzLmdldChpKTsKLQkJCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQcm9qZWN0RmlsZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJSUZpbGUgcHJvamVjdEZpbGUgPSAoSUZpbGUpIGFsbFByb2plY3RGaWxlcy5nZXQoaik7Ci0JCQkJCWlmIChmaWxlTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQkJCQlTdHJpbmcgZXh0TmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygyLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JCQkJCQlTdHJpbmcgZXh0ID0gcHJvamVjdEZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHMoZXh0TmFtZSkpCi0JCQkJCQkJZmlsdGVyRmlsZXMuYWRkKHByb2plY3RGaWxlKTsKLQkJCQkJfSBlbHNlIGlmIChmaWxlTmFtZS5lcXVhbHMocHJvamVjdEZpbGUuZ2V0TmFtZSgpKSkKLQkJCQkJCWZpbHRlckZpbGVzLmFkZChwcm9qZWN0RmlsZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlyZXR1cm4gZmlsdGVyRmlsZXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBMaW5rZWRMaXN0PElGaWxlPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jaW5nRmlsZXMoSVJlcG9ydGVyIHJlcG9ydGVyLCBMaXN0PElGaWxlPiByZWZlcmVuY2luZ0ZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0PElGaWxlPiB2YWxpZGF0ZWRGaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotCQlmb3IgKElGaWxlIHJlZkZpbGUgOiByZWZlcmVuY2luZ0ZpbGVzKSB7Ci0JCQlpZiAoIXZhbGlkYXRlZEZpbGVzLmNvbnRhaW5zKHJlZkZpbGUpKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVmRmlsZS5nZXRQYXJlbnQoKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpKQotCQkJCQlwcm9qZWN0ID0gZ2V0UHJvamVjdENvbnRhaW5lcihyZXNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gc2V0ID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHByb2plY3QpOwotCQkJCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIGRhdGEgOiBzZXQpIHsKLQkJCQkJCWlmIChkYXRhLmlzQXBwbGljYWJsZVRvKHJlZkZpbGUpKSB7Ci0JCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBkYXRhLmdldFZhbGlkYXRvcigpOwotCQkJCQkJCXZhbGlkYXRvci52YWxpZGF0ZShkYXRhLmdldEhlbHBlcihwcm9qZWN0KSxyZXBvcnRlcik7Ci0JCQkJCQkJdmFsaWRhdGVkRmlsZXMuYWRkKHJlZkZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0Q29udGFpbmVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUmVzb3VyY2UgcFJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCWlmICghKHBSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSkKLQkJCXJldHVybiBnZXRQcm9qZWN0Q29udGFpbmVyKHBSZXNvdXJjZSk7Ci0JCXJldHVybiAoSVByb2plY3QpIHBSZXNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVWYWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gTG9hZCB0aGUgaW5wdXQuCi0JCWdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBhbmQgcnVuIHRoZSB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIGEgYmFja2dyb3VuZAotCSAqIHRocmVhZCwgYW5kIHRoZSBub3QtdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGlzIHRocmVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpcmV0dXJuOwotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJcmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfUFJPR1JFU1NNT05JVE9SX1RJVExFKSwgZ2V0VW5pdHNPZldvcmsoKSk7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQkKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBqb2JWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQkJCQotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSl7Ci0JCQlJVmFsaWRhdG9yIHZhbEluc3RhbmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdmFsSW5zdGFuY2UgPSB2bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9IAotCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQlpZighVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvYmxlbVZhbGlkYXRvcnMoKS5jb250YWlucyh2bWQpKSB7Ci0JCQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2JsZW1WYWxpZGF0b3JzKCkuYWRkKHZtZCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlMS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoIGlzRm9yaygpICYmICh2YWxJbnN0YW5jZSAhPSBudWxsKSAmJiB2YWxJbnN0YW5jZSBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCQl0cnkgewotCQkJCQlkZWx0YSA9IGdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIHZtZCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gd2lsbFJ1biA9IChpc0ZvcmNlKCkgfHwgaXNWYWxpZGF0aW9uTmVjZXNzYXJ5KHZtZCwgZGVsdGEpKTsKLQkJCQlpZiggd2lsbFJ1biApam9iVmFsaWRhdG9ycy5hZGQoIHZtZCApOwotCQkJfQotCQkJZWxzZSBpZiAodmFsSW5zdGFuY2UgIT0gbnVsbCl7Ci0JCQkJdmFsaWRhdG9ycy5hZGQoIHZtZCApOwotCQkJfQotCQl9Ci0JCWlmKCBqb2JWYWxpZGF0b3JzLnNpemUoKSA+IDAgKXsKLQkJCWxhdW5jaEpvYnMoIGpvYlZhbGlkYXRvcnMsIHJlcG9ydGVyICk7Ci0JCX0KLQkJCQkKLQkJVmFsaWRhdG9yTWV0YURhdGEgY3VycmVudFZtZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZhbGlkYXRvcnMpIHsKLQkJCQljdXJyZW50Vm1kID0gdm1kOwotCQkJCS8vIElzIHZhbGlkYXRpb24gYWJvdXQgdG8gYmUgcnVuIG9uIHRoaXMgdmFsaWRhdG9yPwotCQkJCS8vIFZhbGlkYXRpb24gd2lsbCBydW4gZWl0aGVyIGlmIHRoaXMgb3BlcmF0aW9uIGZvcmNlcyByZWdhcmRsZXNzCi0JCQkJLy8gb2YgbmVlZCwgb3IgaWYgdGhlIHZhbGlkYXRvciB3YXMgbm90IHJ1biBhdXRvbWF0aWNhbGx5LgotCQkJCS8vIElmIHZhbGlkYXRpb24gaXMgbm90IGFib3V0IHRvIGJlIHJ1biwgdGhlbiBkb24ndCBhY3RpdmF0ZQotCQkJCS8vIHRoZSBwbHVnLWluCi0JCQkJdHJ5IHsKLQkJCQkJZGVsdGEgPSBnZXRGaWxlRGVsdGFzKHJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLCB2bWQpOwotCQkJCQlib29sZWFuIHdpbGxSdW4gPSAoaXNGb3JjZSgpIHx8IGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGRlbHRhKSk7Ci0JCQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiVmFsaWRhdGlvbk9wZXJhdGlvbjogd2lsbCBydW4/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKHdpbGxSdW4pOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiaXMgZm9yY2U/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKGlzRm9yY2UoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKCJpc0F1dG9CdWlsZD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoX2lzQXV0b0J1aWxkKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoImlzQXV0b1ZhbGlkYXRlPyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiaXNJbmNyZW1lbnRhbD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQodm1kLmlzSW5jcmVtZW50YWwoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaXNGdWxsVmFsaWRhdGUoKSkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZGVsdGEubGVuZ3RoID09IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChnZXREZWx0YUFzU3RyaW5nKGRlbHRhKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJVHJhY2luZy5sb2coYnVmZmVyKTsKLQkJCQkJfQotCQkJCQlpZiAoIXdpbGxSdW4pIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGV4dCA9IHZtZC5nZXRIZWxwZXIoZ2V0UHJvamVjdCgpKTsKLQkJCQkJaW5pdFZhbGlkYXRlQ29udGV4dChkZWx0YSk7Ci0JCQkJCXZhbGlkYXRvciA9IHZtZC5nZXRWYWxpZGF0b3IoKTsKLQkJCQkJCi0JCQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCQkKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotLy8JCQkJaWYgKGlzRm9yaygpICYmIHZtZC5pc0FzeW5jKCkpIHsKLS8vCQkJCQkvLyBEb24ndCBhcHBlYXIgdG8gcnVuIGluIHRoZSBmb3JlZ3JvdW5kIGJ5IHNlbmRpbmcKLS8vCQkJCQkvLyBwcm9ncmVzcyB0byB0aGUgSVByb2dyZXNzTW9uaXRvciBpbiB0aGUKLS8vCQkJCQkvLyBXb3JrYmVuY2hNb25pdG9yLiBTdXBwcmVzcyB0aGUgc3RhdHVzIG1lc3NhZ2VzIGJ5Ci0vLwkJCQkJLy8gY2hhbmdpbmcgdGhlIElQcm9ncmVzc01vbml0b3IgdG8gYQotLy8JCQkJCS8vIE51bGxQcm9ncmVzc01vbml0b3IuCi0vLwkJCQkJVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLnF1ZXVlKHdyYXBJblJ1bm5hYmxlKG51bGxSZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsKFdvcmtiZW5jaENvbnRleHQpZ2V0Q29udGV4dCgpLGRlbHRhLCBpdGVyYXRvcikpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpbnRlcm5hbFZhbGlkYXRlKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgY29udGV4dCwgZGVsdGEpOwotLy8JCQkJfQotCQkJCWludGVybmFsVmFsaWRhdGUocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBjb250ZXh0LCBkZWx0YSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCWhhbmRsZU9wZXJhdGlvbkNhbmNlbGxlZFZhbGlkYXRlRXhjZXB0aW9uKHJlcG9ydGVyLCB2YWxpZGF0b3IsIGN1cnJlbnRWbWQsIGl0ZXJhdG9yLCBleGMpOwotCQl9IAotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VDYWNoZWRNYXBzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZUNhY2hlZE1hcHMoKSB7Ci0JCWlmIChWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkucHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSAhPSBudWxsKSB7Ci0JCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkucHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YS5jbGVhcigpOwotCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLnByb2plY3RWYWxpZGF0aW9uTWV0YURhdGEgPSBudWxsOwotCQl9Ci0JCUlQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciBoZWxwZXIgPSBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRWYWxpZGF0aW9uSGVscGVyKCk7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkKLQkJCWhlbHBlci5kaXNwb3NlSW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRlQ29udGV4dChJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJIGlmIChjb250ZXh0IGluc3RhbmNlb2YgV29ya2JlbmNoQ29udGV4dCkgewotCQkJICgoV29ya2JlbmNoQ29udGV4dCljb250ZXh0KS5zZXRWYWxpZGF0aW9uRmlsZVVSSXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJIGZvcihJRmlsZURlbHRhIGZpbGUgOiBkZWx0YSkgewotCQkJCSBpZihmaWxlLmdldERlbHRhVHlwZSgpICE9IElGaWxlRGVsdGEuREVMRVRFRCApIHsKLQkJCQkJICgoV29ya2JlbmNoQ29udGV4dCljb250ZXh0KS5nZXRWYWxpZGF0aW9uRmlsZVVSSXMoKS5hZGQoZmlsZS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkgfQotCQkJIH0gCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBpdGVyYXRvcgotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gZXhjCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU9wZXJhdGlvbkNhbmNlbGxlZFZhbGlkYXRlRXhjZXB0aW9uKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJdGVyYXRvciBpdGVyYXRvciwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSB1c2VyIHRlcm1pbmF0ZXMgdmFsaWRhdGlvbiAoaS5lLiwgcHJlc3NlcyAiY2FuY2VsIiBvbiB0aGUgcHJvZ3Jlc3MgbW9uaXRvcikgYmVmb3JlCi0JCSAqIHRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlcywgcGVyZm9ybSBjbGVhbiB1cCBvbiBlYWNoIGNvbmZpZ3VyZWQgZW5hYmxlZCB2YWxpZGF0b3IuCi0JCSAqIAotCQkgKiBUbyBjbGVhbiB1cCwgc2V2ZXJhbCBzdGVwcyBhcmUgcGVyZm9ybWVkOiAxLiBjYWxsIDxjb2RlPjwvY29kZT4gb24gZWFjaCBjb25maWd1cmVkCi0JCSAqIGVuYWJsZWQgdmFsaWRhdG9yLCBzbyB0aGF0IGVhY2ggdmFsaWRhdG9yIGNhbiBwZXJmb3JtIGNsZWFudXAgdGhhdCBpdCBrbm93cyBpcyBuZWNlc3NhcnkuCi0JCSAqIDIuIHJlbW92ZSBhbGwgdGFza3MgdGhhdCB0aGlzIHZhbGlkYXRvciBoYXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdCAzLiBhZGQgYW5vdGhlciB0YXNrIHRvCi0JCSAqIHRoZSB0YXNrIGxpc3QgdG8gc2F5IHRoYXQgdmFsaWRhdGlvbiwgdXNpbmcgdGhpcyB2YWxpZGF0b3Igb24gdGhpcyBwcm9qZWN0LCB3YXMKLQkJICogdGVybWluYXRlZC4KLQkJICogCi0JCSAqIFN0ZXBzIDIgYW5kIDMgYXJlIGRvbmUgc28gdGhhdCBpdCdzIGNsZWFyIHdoYXQgaGFzLCBhbmQgaGFzIG5vdCwgYmVlbiB2YWxpZGF0ZWQuIElmIHRoZXNlCi0JCSAqIHN0ZXBzIHdlcmVuJ3QgcGVyZm9ybWVkLCB2YWxpZGF0aW9uIGNvdWxkIGJlIGRvbmUgb24gc29tZSBpdGVtcyBpbiB0aGUgcHJvamVjdCwgYnV0IG5vdAotCQkgKiBvdGhlcnM7IGFuZCB0aGUgdXNlciBjb3VsZCBtaXN0YWtlbmx5IGJlbGlldmUgdGhhdCB0aG9zZSBhcmUgdGhlIG9ubHkgcHJvYmxlbXMgd2l0aCB0aGUKLQkJICogcHJvamVjdC4gVW5sZXNzIHRoZSB1c2VyIGtub3dzIHRoYXQgYSBmdWxsIHZlcmlmaWNhdGlvbiBuZWVkcyB0byBiZSBkb25lLCBoZS9zaGUgY291bGQKLQkJICogY29udGludWUgdG8gcmVseSBvbiBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uLCBhbmQgbmV2ZXIga25vdyB0aGF0IHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIGEKLQkJICogcmVzb3VyY2Ugd2hpY2ggaGFzbid0IGJlZW4gdmFsaWRhdGVkLgotCQkgKi8KLQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfQ0xFQU5VUCwgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlhZGRDYW5jZWxUYXNrKHZtZCk7Ci0JCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRvciA9IHZtZC5nZXRWYWxpZGF0b3IoKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4YzIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfQ0xFQU5VUCwgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJCWFkZENhbmNlbFRhc2sodm1kKTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJfQotCQl0aHJvdyBleGM7IC8vIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uIHVwIHRvIHRoZSBmcmFtZXdvcmsgc28gdGhhdAotCQkvLyB0aGUgZnJhbWV3b3JrIGNhbiBkaXNwbGF5IHRoZSBjb3JyZWN0ICJjYW5jZWxlZCIKLQkJLy8gbWVzc2FnZSBpbiB0aGUgZGlhbG9nCi0KLQl9Ci0KLQkvKiBwYWNrYWdlICovCi0Jdm9pZCBpbnRlcm5hbFZhbGlkYXRlKGZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgZmluYWwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLGZpbmFsIElXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBmaW5hbCBJRmlsZURlbHRhW10gZGVsdGEpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCXJlbW92ZU9sZE1lc3NhZ2VzKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgZGVsdGEpOwotCQkJLy8gRG8gTk9UIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGxpbWl0IGlzIGV4Y2VlZGVkIGJlZm9yZSBsYXVuY2hpbmcKLQkJCS8vIHRoZSB2YWxpZGF0b3IuCi0JCQkvLyBFdmVuIGlmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCB3aGVuIHRoZSBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmcm9tCi0JCQkvLyB0aGUgZGVsdGEKLQkJCS8vIGZpbGVzLCBpdCBjb3VsZCBiZSB0aGF0IHRoZSB2YWxpZGF0b3IgaXRzZWxmIHdpbGwgcmVtb3ZlCi0JCQkvLyBtZXNzYWdlcyBiZWZvcmUKLQkJCS8vIHByb2NlZWRpbmcuIExldCB0aGUgdmFsaWRhdG9yIHJ1biBzbyB0aGF0IGl0IGNhbiByZW1vdmUgbWVzc2FnZXMKLQkJCS8vIGlmIGl0Ci0JCQkvLyBuZWVkcyB0bywgYW5kIGlmIGl0IHRyaWVzIHRvIGFkZCBhIG1lc3NhZ2Ugd2hlbiB0aGUgbGltaXQgaXMKLQkJCS8vIGV4Y2VlZGVkLCBsZXQKLQkJCS8vIHRoZSBXb3JrYmVuY2hSZXBvcnRlciB0YWtlIGNhcmUgb2YgaXQuCi0JCQlsYXVuY2hWYWxpZGF0b3IocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBhQ29udGV4dCwgZGVsdGEpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgdmFsaWRhdGUoV29ya2JlbmNoUmVwb3J0ZXIpIG1ldGhvZC4KLQkJCXRocm93IGV4YzsKLQkJfWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgbG9nIHRoZQotCQkJLy8gZXJyb3IgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQsIGUuZy4gTnVsbFBvaW50ZXIgb3IKLQkJCS8vIENsYXNzQ2FzdCwgZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQiIG1lc3NhZ2UuCi0JCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzIFNlcnZpY2UuCi0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCi0JCQkvKgotCQkJIFRoZSBjb2RlICBiZWxvdyAgY2F1c2VzIGJ1bmRsZSBub3QgZm91bmQgZXhjZXB0aW9uIHNpbmNlLCB0aGUgIGJ1bmRsZSBoZXJlIGlzCi0JCQkgdmFsaWRhdGVfYmFzZSBhbmQgd2UgIGFyZSAgdHJ5aW5nIHRvIGxvYWQgdGhhdCBidW5kbGUgZnJvbSB0aGUgY2xhc3Nsb2FkZXIgb2YgCi0JCQkgdGhlIFZhbGlkYXRvci4gCi0JCQkgIAotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkqLwotCQl9IGZpbmFsbHkgewotCQkJLy8gSWYgdXNlciBmaXhlcyBwcm9ibGVtLCBhbmQgbGltaXQgZXhjZWVkZWQsIGFkZCAiZXhjZWVkZWQiCi0JCQkvLyBtZXNzYWdlLCBvcgotCQkJLy8gaWYgbGltaXQgbm90IGV4Y2VlZGVkIGFueSBtb3JlLCByZW1vdmUgImV4Y2VlZGVkIiBtZXNzYWdlLgotCQkJLy9NZXNzYWdlIExpbWl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgZnJhbWV3b3JrCi0JCQkvL1ZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmNoZWNrTWVzc2FnZUxpbWl0KGdldFByb2plY3QoKSwgdHJ1ZSk7Ci0JCQlyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBvcmRlciB0byBhbGxvdyB2YWxpZGF0b3JzIHRvIHJ1biwgbXVzdCBmaXJzdCBjaGVjayBpZiB0aGVyZSdzIHNwYWNlIGZvciBuZXcgbWFya2Vycy4gQnV0Ci0JICogdGhlIG9sZCBtYXJrZXJzIG11c3Qgbm90IHByZXZlbnQgdmFsaWRhdGlvbiBmcm9tIHJ1bm5pbmcgYWdhaW4gKGxpbWl0IGV4Y2VlZGVkKSwgc28gZGVsZXRlCi0JICogYWxsIG9mIHRoZSBvbGQgbWFya2VycyBmaXJzdCwgYW5kIHRoZW4gcnVuIHZhbGlkYXRpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHJlbW92ZU9sZE1lc3NhZ2VzKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBJZiB0aGUgdmFsaWRhdG9yIGhhcyBiZWVuIGVuYWJsZWQsIHJlbW92ZSB0aGUgImNhbmNlbCIgdGFzay4KLQkJLy8gSWYgdGhlIHZhbGlkYXRvciwgb24gdGhlIGxhc3QgcnVuLCB0aHJldyBhIFRocm93YWJsZSwgcmVtb3ZlIHRoZQotCQkvLyAiaW50ZXJuYWwgZXJyb3IiIHRhc2suIChGb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSByZW1vdmUgdGhlICJjYW5jZWwiCi0JCS8vIHRhc2suCi0JCUludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkucmVtb3ZlT3BlcmF0aW9uVGFza3MoZ2V0UHJvamVjdCgpLCB2bWQpOwotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJdHJ5IHsKLQkJCS8vIENoZWNrIHRvIHNlZSBpZiBhIGZ1bGwgYnVpbGQgbXVzdCBiZSBwZXJmb3JtZWQsIG9yIGlmIGEgZGVsdGEKLQkJCS8vIGJ1aWxkIGlzIHRvIGJlIHBlcmZvcm1lZCwgaWYgdGhlcmUgYXJlIGZpbGVzIHRvIHZlcmlmeSBmb3IgdGhhdAotCQkJLy8gdmFsaWRhdG9yLiAoSWYgaXQncyBkZWx0YSwgYnV0IHRoZXJlIGFyZSBubyBmaWxlcywgY2FsbGluZwotCQkJLy8gdmFsaWRhdGUgb24gdGhhdCB2YWxpZGF0b3Igc3RhcnRzIGEgZnVsbCBidWlsZCwgaW5zdGVhZCBvZiBqdXN0Ci0JCQkvLyByZXR1cm5pbmcuKQotCQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfU1RBUlRfUkVNT1ZJTkdfT0xEX01FU1NBR0VTLCBuZXcgU3RyaW5nW117dm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIGdldFByb2plY3QoKS5nZXROYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlcmUgYXJlIGRlbHRhcyB0byB2YWxpZGF0ZQotCQkJCS8vIGJlY2F1c2UgdGhhdCdzIGFscmVhZHkgY2hlY2tlZCBpbiBpc1ZhbGlkYXRpb25OZWNlc3NhcnkKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfU1RBUlRfUkVNT1ZJTkdfT0xEX01FU1NBR0VTLCBuZXcgU3RyaW5nW117dm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIGdldFByb2plY3QoKS5nZXROYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBmZCA9IChXb3JrYmVuY2hGaWxlRGVsdGEpIGRlbHRhW2ldOwotCQkJCQlpZiAoZmQuZ2V0RGVsdGFUeXBlKCkgIT0gSUZpbGVEZWx0YS5ERUxFVEVEKSB7Ci0JCQkJCQkvLyBJZiB0aGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkLCBlY2xpcHNlIGVyYXNlcyBhbGwKLQkJCQkJCS8vIG1hcmtlcnMgb24gdGhlIGZpbGUuCi0JCQkJCQkvLyBBbHNvLCB3aGVuIGEgcmVzb3VyY2UgZG9lc24ndCBleGlzdCwKLQkJCQkJCS8vIFdvcmtiZW5jaFJlcG9ydGVyJ3MgZ2V0TWVzc2FnZVJlc291cmNlKCkKLQkJCQkJCS8vIHJldHVybnMgdGhlIElQcm9qZWN0LCB3aGljaCBtZWFucyB0aGF0IHJlbW92aW5nIHRoZQotCQkJCQkJLy8gbWVzc2FnZXMgZnJvbSB0aGlzCi0JCQkJCQkvLyBmaWxlIHJlbW92ZXMgYWxsIG9mIHRoaXMgdmFsaWRhdG9yJ3MgbWVzc2FnZXMgb24KLQkJCQkJCS8vIHRoaXMgSVByb2plY3QgKGFpeCBkZWZlY3QgMjA2MTU3KQotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVwb3J0ZXIuZ2V0TWVzc2FnZVJlc291cmNlKHZhbGlkYXRvciwgZmQpOwotCQkJCQkJaWYgKGZkLmdldE9iamVjdCgpLmVxdWFscyhmZC5nZXRSZXNvdXJjZSgpKSkgewotCQkJCQkJCVdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHJlc291cmNlLCB2YWxpZGF0b3IpOyAvLyByZW1vdmUKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBmZC5nZXRPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRklOSVNIX1JFTU9WSU5HX09MRF9NRVNTQUdFUywgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgZXhjOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGxhdW5jaFZhbGlkYXRvcihXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpcmV0dXJuOwotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZnVsbCBidWlsZCBtdXN0IGJlIHBlcmZvcm1lZCwgb3IgaWYgYSBkZWx0YQotCQkvLyBidWlsZCBpcyB0byBiZSBwZXJmb3JtZWQsIGlmIHRoZXJlIGFyZSBmaWxlcyB0byB2ZXJpZnkgZm9yIHRoYXQKLQkJLy8gdmFsaWRhdG9yLiAoSWYgaXQncyBkZWx0YSwgYnV0IHRoZXJlIGFyZSBubyBmaWxlcywgY2FsbGluZwotCQkvLyB2YWxpZGF0ZSBvbiB0aGF0IHZhbGlkYXRvciBzdGFydHMgYSBmdWxsIGJ1aWxkLCBpbnN0ZWFkIG9mIGp1c3QKLQkJLy8gcmV0dXJuaW5nLikKLQkJdHJ5IHsKLQkJCS8vIFZhbGlkYXRlIHRoZSByZXNvdXJjZTsgdGhpcyBzdGVwIHdpbGwgYWRkIGVycm9ycy93YXJuaW5ncyB0byB0aGUKLQkJCS8vIHRhc2sgbGlzdCwgYW5kIHJlbW92ZSBlcnJvcnMvd2FybmluZ3MgZnJvbSB0aGUgdGFzayBsaXN0LgotCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQkvLyBJbml0aWFsaXplIHRoZSAibG9hZFJ1bGVHcm91cCIgbWV0aG9kIHdpdGggdGhlIGdyb3VwIG9mIHJ1bGVzCi0JCQkJLy8gd2hpY2ggdGhlIHZhbGlkYXRvciBzaG91bGQgdmFsaWRhdGUuCi0JCQkJKChXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLnNldFJ1bGVHcm91cChnZXRSdWxlR3JvdXAoKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTiwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJLy8gVGhpcyBpbnRlcm5hbCAibGF1bmNoZWQgdmFsaWRhdG9ycyIgdmFsdWUgaXMgdXNlZCBvbmx5IGluIHRlc3RzLgotCQkJCWdldExhdW5jaGVkVmFsaWRhdG9ycygpLmFkZCh2bWQpOwotCQkJfQotCQkJLy9pbml0VmFsaWRhdGVDb250ZXh0KGRlbHRhKTsKLQkJCVZhbGlkYXRvckxhdW5jaGVyLmdldExhdW5jaGVyKCkuc3RhcnQoaGVscGVyLCB2YWxpZGF0b3IsIHJlcG9ydGVyKTsKLQkJCS8vVE9ETyBHUksgZGV0ZXJtaW5lIGlmIHRpbWluZyBpbmZvIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0vLwkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuSU5GTykpIHsKLS8vCQkJCVRpbWVFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0VGltZUVudHJ5KCk7Ci0vLwkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbi5sYXVuY2hWYWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJZW50cnkuc2V0UHJvamVjdE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0vLwkJCQllbnRyeS5zZXRUb29sTmFtZSh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLS8vCQkJCWVudHJ5LnNldEVsYXBzZWRUaW1lKGZpbmlzaCAtIHN0YXJ0KTsKLS8vCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLS8vCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQkJCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0vLwkJCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCWlmIChkZWx0YS5sZW5ndGggPT0gMCkgewotLy8JCQkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlidWZmZXIuYXBwZW5kKGdldERlbHRhQXNTdHJpbmcoZGVsdGEpKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQllbnRyeS5zZXREZXRhaWxzKGJ1ZmZlci50b1N0cmluZygpKTsKLS8vCQkJCX0KLS8vCQkJCWxvZ2dlci53cml0ZShMZXZlbC5JTkZPLCBlbnRyeSk7Ci0vLwkJCX0KLQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIEZpcnN0LCBzZWUgaWYgYSB2YWxpZGF0b3IganVzdCBjYXVnaHQgYWxsIFRocm93YWJsZXMgYW5kCi0JCQkvLyBhY2NpZGVudGFsbHkgd3JhcHBlZCBhIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCi0JCQkvLyBwcm9wYWdhdGluZyBpdC4KLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCXZleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IC8vIGZpcnN0LAotCQkJCQkvLyBzZXQgdGhlIGNsYXNzIGxvYWRlciwgc28gdGhhdCB0aGUgZXhjZXB0aW9uJ3MgZ2V0TWVzc2FnZSgpIG1ldGhvZAotCQkJCQkvLyBjYW4gcmV0cmlldmUgdGhlIHJlc291cmNlIGJ1bmRsZQotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUKLQkJCS8vIGVycm9yIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCWV4Yy5zZXRDbGFzc0xvYWRlcih2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsgLy8gZmlyc3QsCi0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobXNzZyk7Ci0JCQkKLQkJCS8qCi0JCQkgVGhlIGNvZGUgIGJlbG93ICBjYXVzZXMgYnVuZGxlIG5vdCBmb3VuZCBleGNlcHRpb24gc2luY2UsIHRoZSAgYnVuZGxlIGhlcmUgaXMKLQkJCSB2YWxpZGF0ZV9iYXNlIGFuZCB3ZSAgYXJlICB0cnlpbmcgdG8gbG9hZCB0aGF0IGJ1bmRsZSBmcm9tIHRoZSBjbGFzc2xvYWRlciBvZiAKLQkJCSB0aGUgVmFsaWRhdG9yLiAKLQkJCSAKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0JCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpOwotCQkJKi8KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLQkJCQloZWxwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJcmV0dXJuOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBOb3cgdGhhdCBjbGVhbnVwIGhhcyBiZWVuIGNhbGxlZCwgc2V0IHRoZSBwcm9qZWN0IHRvIG51bGwuCi0JCQkJLy8gVGhpcyBwcm9qZWN0J3MKLQkJCQkvLyByZXNvdXJjZXMgaGF2ZSBiZWVuIGZyZWVkIHNvIHRoaXMgcHJvamVjdCBzaG91bGQgYWxzbyBiZQotCQkJCS8vIGNsZWFyZWQgb24gdGhlIGhlbHBlci4KLQkJCQkvLyBJZiBpdCBpc24ndCBzZXQgdG8gbnVsbCwgdGhlbiB0aGUgbmV4dCB0aW1lIHRoYXQgdGhlIGhlbHBlcgotCQkJCS8vIGlzIHJldHJpZXZlZCBmcm9tCi0JCQkJLy8gdGhlIFZhbGlkYXRvck1ldGFEYXRhLCB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhpcwotCQkJCS8vIHByb2plY3QsIGluIHRoZQotCQkJCS8vIGhlbHBlcidzIGluaXRpYWxpemUgbWV0aG9kLCB3aWxsIG5vdCBiZSByZWFsbG9jYXRlZCBpZiB0aGUKLQkJCQkvLyBwcm9qZWN0IGlzIHRoZSBzYW1lLgotCQkJCWhlbHBlci5zZXRQcm9qZWN0KG51bGwpOwotCQkJfQotCQkJLy8gVGVsbCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHdlJ3ZlIGNvbXBsZXRlZCBuIHVuaXRzIG9mIHdvcmsKLQkJCS8vIChpLmUuLCBuIHJlc291cmNlcyB2YWxpZGF0ZWQgYnkgb25lIHZhbGlkYXRvcikuCi0JCQlyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS53b3JrZWQoKChkZWx0YSA9PSBudWxsKSA/IDEgOiBkZWx0YS5sZW5ndGgpKTsKLQkJfQotCX0KLQotLy8JcHJpdmF0ZSBSdW5uYWJsZSB3cmFwSW5SdW5uYWJsZShmaW5hbCBXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIGZpbmFsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgZmluYWwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBmaW5hbCBJRmlsZURlbHRhW10gZGVsdGEsIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0vLwkJLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgUnVubmFibGUgZWFjaCB0aW1lIGJlY2F1c2Ugc2V2ZXJhbCBSdW5uYWJsZQotLy8JCS8vIGluc3RhbmNlcyBtYXkgZXhpc3QgYXQgdGhlIHNhbWUgdGltZS4KLS8vCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBQcm9qZWN0UnVubmFibGUocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBoZWxwZXIsIGRlbHRhLCBpdGVyYXRvcik7Ci0vLwkJcmV0dXJuIHJ1bm5hYmxlOwotLy8JfQotCi0JLyoKLQkgKiAvLyBGb3IgY29udmVuaWVuY2UsIGtlZXAgdGhpcyBtZXRob2QgaW4gdGhlIGNsYXNzIGJ1dCBjb21tZW50ZWQgb3V0LiAvLyBXaGVuIGFzeW5jIG5lZWRzIHRvCi0JICogYmUgdGVzdGVkLCB0aGlzIG1ldGhvZCBtYXkgYmUgbmVlZGVkIGFnYWluLiBwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBwcmVmaXgsCi0JICogSVdvcmtiZW5jaENvbnRleHQgaGVscGVyKSB7IElQcm9qZWN0IGhQcm9qZWN0ID0gaGVscGVyLmdldFByb2plY3QoKTsgU3lzdGVtLmVyci5wcmludGxuKHByZWZpeCArCi0JICogIlN0YXJ0IFZhbGlkYXRpb25PcGVyYXRpb24gIitUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6OiIgKyBoUHJvamVjdC5nZXROYW1lKCkpOwotCSAqIGlmKCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKS5lcXVhbHMoIlZhbGlkYXRpb25UaHJlYWQiKSAmJgotCSAqIChoUHJvamVjdC5nZXROYW1lKCkuaW5kZXhPZigibm9Gb3JrIikgPiAtMSkpIHsgVGhyZWFkLmR1bXBTdGFjaygpOyB9IGVsc2UKLQkgKiBpZigoIVRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLmVxdWFscygiVmFsaWRhdGlvblRocmVhZCIpKSAmJgotCSAqIChoUHJvamVjdC5nZXROYW1lKCkuaW5kZXhPZigiZm9yayIpID4gLTEpKSB7IFRocmVhZC5kdW1wU3RhY2soKTsgfSBTeXN0ZW0uZXJyLnByaW50bG4ocHJlZml4ICsKLQkgKiAiRW5kIFZhbGlkYXRpb25PcGVyYXRpb24iKTsgfQotCSAqLwotCXB1YmxpYyBjbGFzcyBQcm9qZWN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgV29ya2JlbmNoUmVwb3J0ZXIgX3JlcG9ydGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotLy8JCXByaXZhdGUgSVZhbGlkYXRpb25Db250ZXh0IF9oZWxwZXIgPSBudWxsOwotCQlwcml2YXRlIElGaWxlRGVsdGFbXSBfX2RlbHRhID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvamVjdFJ1bm5hYmxlKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElGaWxlRGVsdGFbXSBkZWx0YSwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLQkJCV9yZXBvcnRlciA9IHJlcG9ydGVyOwotCQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJCV92bWQgPSB2bWQ7Ci0vLwkJCV9oZWxwZXIgPSBoZWxwZXI7Ci0JCQlfX2RlbHRhID0gZGVsdGE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWludGVybmFsVmFsaWRhdGUoX3JlcG9ydGVyLCBfdmFsaWRhdG9yLCBfdm1kLCBjb250ZXh0LF9fZGVsdGEpOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gVXNlciBjYW4ndCBjYW5jZWwgYSBqb2IgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCwgc28gaWdub3JlIHRoaXMgZXhjZXB0aW9uLgotCQkJfQotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gX3JlcG9ydGVyLmdldFByb2plY3QoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRpb25Db250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0Jdm9pZCBsYXVuY2hKb2JzKFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsaWRhdG9ycywgZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbnsKLQkJCi0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbDsKLQkJSVdvcmtiZW5jaENvbnRleHQgd29ya2JlbmNoY29udGV4dCA9IG51bGw7Ci0JCQotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZhbGlkYXRvcnMpIHsKLQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCi0JCQl0cnkgewotCQkJCWRlbHRhID0gZ2V0RmlsZURlbHRhcyhyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgdm1kKTsKLQkJCQlib29sZWFuIHdpbGxSdW4gPSAoaXNGb3JjZSgpIHx8IGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGRlbHRhKSk7Ci0JCQkJaWYgKCF3aWxsUnVuKWNvbnRpbnVlOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobXNzZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdG9yID0gdm1kLmNyZWF0ZVZhbGlkYXRvcigpOwotCQkJCXdvcmtiZW5jaGNvbnRleHQgPSB2bWQuY3JlYXRlSGVscGVyKCBnZXRQcm9qZWN0KCkgKTsKLQkJCQlpbml0VmFsaWRhdGVDb250ZXh0KCBkZWx0YSwgd29ya2JlbmNoY29udGV4dCApOwotCQkJCXZtZC5hZGRIZWxwZXIoKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yLCB3b3JrYmVuY2hjb250ZXh0KTsJCQkJCi0JCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQkJCi0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCQlyZW1vdmVPbGRNZXNzYWdlcyhyZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsIGRlbHRhKTsKLQkJCQkKLQkJCQlpZiggdmFsaWRhdG9yIGluc3RhbmNlb2YgSVZhbGlkYXRvckpvYiApewotCQkJCQlsYXVuY2hWYWxpZGF0b3JKb2IoIHJlcG9ydGVyLCAoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IsIHZtZCwgd29ya2JlbmNoY29udGV4dCwgZGVsdGEpOwotCQkJCX0KLQotCQkJCQotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdGhyb3cgZXhjOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobXNzZyk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gSWYgdXNlciBmaXhlcyBwcm9ibGVtLCBhbmQgbGltaXQgZXhjZWVkZWQsIGFkZCAiZXhjZWVkZWQiCi0JCQkJLy8gbWVzc2FnZSwgb3IgaWYgbGltaXQgbm90IGV4Y2VlZGVkIGFueSBtb3JlLCByZW1vdmUgImV4Y2VlZGVkIiBtZXNzYWdlLgotCQkJCXJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGluaXRWYWxpZGF0ZUNvbnRleHQoSUZpbGVEZWx0YVtdIGRlbHRhLCBJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ICkgewotCQkgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkgKChXb3JrYmVuY2hDb250ZXh0KWNvbnRleHQpLnNldFZhbGlkYXRpb25GaWxlVVJJcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQkgZm9yKElGaWxlRGVsdGEgZmlsZSA6IGRlbHRhKSB7Ci0JCQkJIGlmKGZpbGUuZ2V0RGVsdGFUeXBlKCkgIT0gSUZpbGVEZWx0YS5ERUxFVEVEICkgewotCQkJCQkgKChXb3JrYmVuY2hDb250ZXh0KWNvbnRleHQpLmdldFZhbGlkYXRpb25GaWxlVVJJcygpLmFkZChmaWxlLmdldEZpbGVOYW1lKCkpOwotCQkJCSB9Ci0JCQkgfSAKLQkJfQotCX0KLQkJCQkJCQotCXByaXZhdGUgZmluYWwgdm9pZCBsYXVuY2hWYWxpZGF0b3JKb2IoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsCi0JCUlWYWxpZGF0b3JKb2IgdmFsaWRhdG9yLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSUZpbGVEZWx0YVtdIGRlbHRhKSB7Ci0JCQotCQlpZiAocmVwb3J0ZXIgPT0gbnVsbClyZXR1cm47Ci0JCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCi0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkoKFdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuc2V0UnVsZUdyb3VwKGdldFJ1bGVHcm91cCgpKTsKLQkJfQotCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJLy8gVGhpcyBpbnRlcm5hbCAibGF1bmNoZWQgdmFsaWRhdG9ycyIgdmFsdWUgaXMgdXNlZCBvbmx5IGluIHRlc3RzLgotCQkJZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkuYWRkKHZtZCk7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvckpvYiB2YWxpZGF0b3Jqb2IgPSBuZXcgVmFsaWRhdG9ySm9iKCB2YWxpZGF0b3IsIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAKLQkJCXZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGhlbHBlci5nZXRQcm9qZWN0KCksIGhlbHBlciApOwotCi0JCUlTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSA9IHZhbGlkYXRvci5nZXRTY2hlZHVsaW5nUnVsZShoZWxwZXIpOwotCQl2YWxpZGF0b3Jqb2Iuc2V0UnVsZSggc2NoZWR1bGluZ1J1bGUgKTsJCQotCQlRdWFsaWZpZWROYW1lIHZhbGlkYXRvcktleSA9IG5ldyBRdWFsaWZpZWROYW1lKG51bGwsICJWYWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQl2YWxpZGF0b3Jqb2Iuc2V0UHJvcGVydHkoIHZhbGlkYXRvcktleSwgdmFsaWRhdG9yICk7Ci0JCXZhbGlkYXRvcmpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcigKLQkJCW5ldyBKb2JDaGFuZ2VBZGFwdGVyKCl7Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpewotCQkJCQlKb2Igam9iID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQkJCVF1YWxpZmllZE5hbWUgdmFsaWRhdG9yS2V5ID0gbmV3IFF1YWxpZmllZE5hbWUobnVsbCwgIlZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlWYWxpZGF0b3JKb2IgdmFsaWRhdG9yID0gKElWYWxpZGF0b3JKb2Ipam9iLmdldFByb3BlcnR5KCB2YWxpZGF0b3JLZXkgKTsKLQkJCQkJVmFsaWRhdG9yTWFuYWdlciBtZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQkJCQkJZmluYWwgTGlzdDxNZXNzYWdlSW5mbz4gbGlzdCA9IG1nci5nZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwkJCQkJCQkKLQkJCQkJCi0JCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCQkJCQlmb3IoTWVzc2FnZUluZm8gaW5mbyA6IGxpc3QpewotCQkJCQkJCQl0cnkgewkJCQkJCQkJCi0JCQkJCQkJCQlUYXNrTGlzdFV0aWxpdHkuYWRkVGFzayggaW5mby5nZXRNZXNzYWdlT3duZXJJZCgpLCBpbmZvLmdldFJlc291cmNlKCksCi0JCQkJCQkJCQkJaW5mby5nZXRMb2NhdGlvbigpLCBpbmZvLmdldE1zZygpLmdldElkKCksIGluZm8uZ2V0VGV4dCgpLAotCQkJCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0U2V2ZXJpdHkoKSwKLQkJCQkJCQkJCQlpbmZvLmdldE1hcmtlcklkKCksCi0JCQkJCQkJCQkJaW5mby5nZXRUYXJnZXRPYmplY3ROYW1lKCksCi0JCQkJCQkJCQkJaW5mby5nZXRNc2coKS5nZXRHcm91cE5hbWUoKSwKLQkJCQkJCQkJCQlpbmZvLmdldE1zZygpLmdldE9mZnNldCgpLAotCQkJCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0TGVuZ3RoKCkpOwkJCQkJCQkJCi0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0JCQkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkgICAgfQotCQkJCQl9OwotCQkJCQl0cnkgewotCQkJCQkJCi0JCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCW1nci5jbGVhck1lc3NhZ2VzKCB2YWxpZGF0b3IgKTsKLQkJCQkJdmFsaWRhdG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCXZhbGlkYXRvcmpvYi5zZXRQcmlvcml0eShKb2IuREVDT1JBVEUpOwotCi0JCVZhbGlkYXRpb25MYXVuY2hlckpvYiB2YWxpZGF0aW9uTGF1bmNoZXJKb2IgPSBuZXcgVmFsaWRhdGlvbkxhdW5jaGVySm9iKHZhbGlkYXRvcmpvYik7Ci0JCXZhbGlkYXRpb25MYXVuY2hlckpvYi5zY2hlZHVsZSgpOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvblV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUwM2EyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHZhbGlkYXRvcnMgYW5kIGNvZGUgb3V0c2lkZQotICogb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblV0aWxpdHkgewotCS8vVE9ETyBNYWtlIHRoZSBWYWxpZGF0aW9uVXRpbGl0eSBjb25zdHJ1Y3RvciBwcml2YXRlIGluIE1pbGVzdG9uZSA0LgotCi0JLyoqCi0JICogR2l2ZW4gYW4gSVJlc291cmNlIGFuZCBvbmUgb2YgdGhlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5TZXZlcnR5RW51bSBjb25zdGFudHMsCi0JICogcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgdmFsaWRhdG9ycyB3aGljaCBoYXZlCi0JICogcmVwb3J0ZWQgbWVzc2FnZXMsIG9mIHRoZSBnaXZlbiBzZXZlcml0eSwgYWdhaW5zdCB0aGUgcmVzb3VyY2UgYW5kIHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gbGlzdFZhbGlkYXRvckNsYXNzZXMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHkpIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBzZXZlcml0eSk7Ci0JCWlmICgobWFya2VycyA9PSBudWxsKSB8fCAobWFya2Vycy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJU2V0PFN0cmluZz4gdGVtcFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQl0cnkgewotCQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIgdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdGVtcFNldC5hZGQoKFN0cmluZylvd25lcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0KLQkJaWYgKHRlbXBTZXQuc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0ZW1wU2V0LnNpemUoKV07Ci0JCQl0ZW1wU2V0LnRvQXJyYXkocmVzdWx0KTsKLQkJCXRlbXBTZXQuY2xlYXIoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBpbnN0YW5jZSBtZXRob2Qgd2lsbCBiZSBtYWRlIHN0YXRpYyBpbiBNaWxlc3RvbmUgNC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNFbmFibGVkKHByb2plY3QsIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIHZhbGlkYXRvcnMsIGlkZW50aWZpZWQgYnkgdGhlaXIgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWVzLCBhcmUKLQkgKiBlbmFibGVkIG9uIHRoZSBwcm9qZWN0LiBJZiBhIHZhbGlkYXRvciBpc24ndCBlbmFibGVkLCBvciBpZiB0aGVyZSdzIGFuIGludGVybmFsIGVycm9yIHdoaWxlCi0JICogcmV0cmlldmluZyB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24sIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHZhbGlkYXRvckNsYXNzTmFtZXMpIHsKLQkJaWYgKCh2YWxpZGF0b3JDbGFzc05hbWVzID09IG51bGwpIHx8ICh2YWxpZGF0b3JDbGFzc05hbWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvckNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXByanAuaXNFbmFibGVkKHZhbGlkYXRvckNsYXNzTmFtZXNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1YTcwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9ySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUGVyZm9ybWFuY2VDb3VudGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySm9iIGV4dGVuZHMgSm9iIHsKLQotCi0JcHJpdmF0ZSBJUHJvamVjdAkJCXByb2plY3Q7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoQ29udGV4dCAJaGVscGVyOwotCXByaXZhdGUgSVZhbGlkYXRvckpvYgkJdmFsaWRhdG9yOwotCQotCXB1YmxpYyBWYWxpZGF0b3JKb2IoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCSAgIAotCXB1YmxpYyBWYWxpZGF0b3JKb2IoIElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yLCBTdHJpbmcgZGlzcGxheU5hbWUsIFN0cmluZyBuYW1lLCBJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhSGVscGVyICApewotCQlzdXBlcihkaXNwbGF5TmFtZSk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuaGVscGVyID0gYUhlbHBlcjsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCQotCS8vcmV2aXNpdCByZXBvcnRlciBpbiB0aGUgY29kZSAgYmVsb3cKLQkvL3N1YnRhc2sgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkIGluIHRoZSBtb25pdG9yIGNyZWF0ZWQgYnkgdGhlIEpvYgotCS8vZXJyb3IgaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQgYnkgdGhlIElSZXBvcnRlcgotCQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlQZXJmb3JtYW5jZU1vbml0b3IgcG0gPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQZXJmb3JtYW5jZU1vbml0b3IoKTsKLQkJbG9uZyBlbGFwc2VkID0gLTE7Ci0JCWxvbmcgY3B1VGltZSA9IC0xOwotCQlpZiAocG0uaXNDb2xsZWN0aW5nKCkpewotCQkJZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJY3B1VGltZSA9IE1pc2MuZ2V0Q1BVVGltZSgpOwotCQl9Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soIlZhbGlkYXRpbmciLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCUlTdGF0dXMgc3RhdHVzID0gSVZhbGlkYXRvckpvYi5PS19TVEFUVVM7Ci0JCVdvcmtiZW5jaFJlcG9ydGVyCXJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKCBwcm9qZWN0LCBtb25pdG9yICk7Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCQotCQl0cnkgewotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTiwKLQkJCQluZXcgU3RyaW5nW117aGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsJCQotCQkJc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCQotCQkJbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT04sCi0JCQkJbmV3IFN0cmluZ1tde2hlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotIAotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIEZpcnN0LCBzZWUgaWYgYSB2YWxpZGF0b3IganVzdCBjYXVnaHQgYWxsIFRocm93YWJsZXMgYW5kCi0JCQkvLyBhY2NpZGVudGFsbHkgd3JhcHBlZCBhIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCi0JCQkvLyBwcm9wYWdhdGluZyBpdC4KLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCXZleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IAotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUKLQkJCS8vIGVycm9yIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCWV4Yy5zZXRDbGFzc0xvYWRlcih2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLAotCQkJCQluZXcgU3RyaW5nW117aGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQlSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksCi0JCQkJbmV3IFN0cmluZ1tde2hlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSB9KTsKLQkJCQotCQkJbW9uaXRvci5zdWJUYXNrKG1zc2cpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCi0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCQltZXNzYWdlLnNldFBhcmFtcyhtc2dQYXJtKTsJCQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQloZWxwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JCQkJCXZtZC5yZW1vdmVIZWxwZXIoIHZhbGlkYXRvciApOwotCQkJCX1jYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJCQltZXNzYWdlLnNldFBhcmFtcyhtc2dQYXJtKTsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpOwotCQotCQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZS5nZXRUZXh0KCkpOwkKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQloZWxwZXIuc2V0UHJvamVjdChudWxsKTsKLQkJCQkJdm1kLnJlbW92ZUhlbHBlciggdmFsaWRhdG9yICk7Ci0JCQkJCWhlbHBlciA9IG51bGw7Ci0JCQkJCXJlcG9ydGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkvL3JlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgoKGRlbHRhID09IG51bGwpID8gMSA6IGRlbHRhLmxlbmd0aCkpOyAvLyBPbmUKLQkJCS8vbW9uaXRvci53b3JrZWQoKChkZWx0YSA9PSBudWxsKSA/IDEgOiBkZWx0YS5sZW5ndGgpKTsgLy8gT25lCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlpZiAocG0uaXNDb2xsZWN0aW5nKCkpewotCQkJaWYgKGNwdVRpbWUgIT0gLTEpewotCQkJCWNwdVRpbWUgPSBNaXNjLmdldENQVVRpbWUoKSAtIGNwdVRpbWU7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbClwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQkJcG0uYWRkKG5ldyBQZXJmb3JtYW5jZUNvdW50ZXJzKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIAotCQkJCXZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLHByb2plY3ROYW1lLCAtMSwgCi0JCQkJU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktZWxhcHNlZCwgY3B1VGltZSkpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJcmV0dXJuIChwcm9qZWN0LmdldE5hbWUoKSArIFZhbGlkYXRvck1hbmFnZXIuVkFMSURBVE9SX0pPQl9GQU1JTFkpLmVxdWFscyhmYW1pbHkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxYzczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogQSBjZW50cmFsaXplZCBjbGFzcyBmb3IgYWNjZXNzaW5nIHZhbGlkYXRpb24gbWV0YWRhdGEuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0b3JNYW5hZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfSk9CX0ZBTUlMWSA9ICJ2YWxpZGF0b3JzIjsJIC8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWFuYWdlciBpbnN0OwotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZVV0aWwgX3Jlc291cmNlVXRpbDsgLy8gYSBjb21tb24gdXRpbGl0eSwgZGlmZmVyZW50IHdoZXRoZXIgb3Igbm90Ci0JLy8gV1NBRCBpcyBydW5uaW5nIGluIGhlYWRsZXNzIG9yIFVJIG1vZGUsIHdoaWNoIGNhbiByZXRyaWV2ZSB0aGUgbGluZSBudW1iZXIgb2Ygc29tZSBNT0Ygb2JqZWN0cy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBSRVNPVVJDRVVUSUxfREVGQVVMVENMQVNTID0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5EZWZhdWx0UmVzb3VyY2VVdGlsLmNsYXNzOwotCXByaXZhdGUgc3RhdGljIENsYXNzIF9yZXNvdXJjZVV0aWxDbGFzcyA9IFJFU09VUkNFVVRJTF9ERUZBVUxUQ0xBU1M7Ci0JCQotCS8vIGFuIGVtcHR5IHNldCwgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLCBzbyB0aGF0IHdlIG9ubHkgY29uc3RydWN0IG9uZSBlbXB0eSBzZXQgb25jZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IEVNUFRZX1NFVCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQotCXByaXZhdGUgc3RhdGljIENsYXNzIAlfbWVzc2FnZUxpbWl0T3duZXI7Ci0JcHJpdmF0ZSBTdHJpbmdbXSAJCV9pbnRlcm5hbE93bmVyczsKLQlwcml2YXRlIE1hcDxJVmFsaWRhdG9ySm9iLCBMaXN0PE1lc3NhZ2VJbmZvPj4gX3ZhbGlkYXRvck1zZ3MgPSAKLQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcDxJVmFsaWRhdG9ySm9iLCBMaXN0PE1lc3NhZ2VJbmZvPj4oKSApOwkKLQlwcml2YXRlIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gX3Byb2JsZW1WYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7CQotCQotCXByaXZhdGUgVmFsaWRhdG9yTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJX2ludGVybmFsT3duZXJzID0gbmV3IFN0cmluZ1swXTsKLQotCQlhZGRJbnRlcm5hbE93bmVyKGdldE1lc3NhZ2VMaW1pdE93bmVyKCkpOwotCX0KLQotCS8qKgotCSAqIERpc2FibGUgYWxsIHZhbGlkYXRvcnMgZm9yIHRoZSBjdXJyZW50IHByb2plY3QsIGFuZCBkb2VzIG5vdCB0b3VjaCB0aGUgYXV0by12YWxpZGF0ZSBzZXR0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGVBbGxWYWxpZGF0b3JzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gRGlzYWJsZSB0aGUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzCi0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGN1cnJlbnRQcm9qZWN0LCBFTVBUWV9TRVQsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQpIHsKLQotCQl0cnkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpCi0JCQkJCS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdmID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpCi0JCQkJCS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlnZi5lbmFibGVTaW5nbGVWYWxpZGF0b3Iodm1kKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQpewotCi0JCXRyeSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkKLQkJCQkJLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2YgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkKLQkJCQkJLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCWdmLmRpc2FibGVTaW5nbGVWYWxpZGF0b3Iodm1kKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZW5hYmxlVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JJZCwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uLCBib29sZWFuIGJ1aWxkVmFsaWRhdGlvbikgewotCi0JCQotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXByanAuc2V0RG9lc1Byb2plY3RPdmVycmlkZSh0cnVlKTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKQotCQkJCQkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9ySWQpOwotCQkJCi0JCQlpZihtYW51YWxWYWxpZGF0aW9uKXsKLQkJCQlwcmpwLmVuYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcih2bWQpOwotCQkJfSAKLQkJCWlmIChidWlsZFZhbGlkYXRpb24pewotCQkJCXByanAuZW5hYmxlU2luZ2xlQnVpbGRWYWxpZGF0b3Iodm1kKTsKLQkJCX0KLQkJCXByanAuc3RvcmUoKTsKLQkJCQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JJZCwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uLCBib29sZWFuIGJ1aWxkVmFsaWRhdGlvbil7Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwcmpwLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkKLQkJCQkJLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJCQotCQkJaWYobWFudWFsVmFsaWRhdGlvbil7Ci0JCQkJcHJqcC5kaXNhYmxlU2luZ2xlTWFudWFsVmFsaWRhdG9yKHZtZCk7Ci0JCQl9IAotCQkJaWYgKGJ1aWxkVmFsaWRhdGlvbil7Ci0JCQkJcHJqcC5kaXNhYmxlU2luZ2xlQnVpbGRWYWxpZGF0b3Iodm1kKTsKLQkJCX0KLQkJCXByanAuc3RvcmUoKTsKLQkJCQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBHaXZlbiBhbiBJUHJvamVjdCwgaWYgdGhlIElQcm9qZWN0IGRvZXMgbm90IHN1cHBvcnQgYnVpbGQgdmFsaWRhdGlvbiwgYWRkIHRoZSB2YWxpZGF0aW9uCi0JICogYnVpbGRlciB0byB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiBzbyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBzdXBwb3J0IGJ1aWxkIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm47Ci0KLQkJYm9vbGVhbiBpc0J1aWxkZXJBZGRlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCWlmIChjb21tYW5kcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ29tbWFuZCBjb21tYW5kIDogY29tbWFuZHMpIHsKLQkJCQkJU3RyaW5nIGJ1aWxkZXJOYW1lID0gY29tbWFuZC5nZXRCdWlsZGVyTmFtZSgpOwotCQkJCQlpZiAoYnVpbGRlck5hbWUgPT0gbnVsbCkgewotCQkJCQkJLy8gYnVpbGRlciBuYW1lIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChidWlsZGVyTmFtZS5lcXVhbHMoVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQpKSB7Ci0JCQkJCQlpc0J1aWxkZXJBZGRlZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFpc0J1aWxkZXJBZGRlZCkgewotCQkJCUlDb21tYW5kIG5ld0NvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQkJbmV3Q29tbWFuZC5zZXRCdWlsZGVyTmFtZShWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRCk7Ci0KLQkJCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbnVsbDsKLQkJCQlpZiAoY29tbWFuZHMgIT0gbnVsbCkgewotCQkJCQluZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIGNvbW1hbmRzLmxlbmd0aCk7Ci0JCQkJCW5ld0NvbW1hbmRzW2NvbW1hbmRzLmxlbmd0aF0gPSBuZXdDb21tYW5kOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kWzFdOwotCQkJCQluZXdDb21tYW5kc1swXSA9IG5ld0NvbW1hbmQ7Ci0JCQkJfQotCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0KLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlmIHdlIGNhbid0IHJlYWQgdGhlIGluZm9ybWF0aW9uLCB0aGUgcHJvamVjdCBpc24ndCBvcGVuLCBzbyBpdCBjYW4ndCBydW4KLQkJCS8vIGF1dG8tdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSVByb2plY3QsIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvamVjdCBjYW4gcnVuIGJ1aWxkIHZhbGlkYXRpb24gKGkuZS4sCi0JICogaW5jcmVtZW50YWwgdmFsaWRhdGlvbiksIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoZSB0ZXN0LCB0byBmaW5kIG91dCBpZiB0aGUgcHJvamVjdCBzdXBwb3J0cwotCSAqIGJ1aWxkIHZhbGlkYXRpb24gb3Igbm90LCBpcyB0byBzZWUgaWYgdGhlIFZhbGlkYXRpb25CdWlsZGVyIGlzIGNvbmZpZ3VyZWQgb24gdGhhdCB0eXBlIG9mCi0JICogcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MgLSBpcyB0aGVyZSBhbnkgd2F5IHRoYXQgSSBjYW4gc2hvcnRlbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhpcwotCSAqIHRha2VzPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUHJvamVjdFN1cHBvcnRCdWlsZFZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGNhblJ1bkFWID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBjYW5SdW5BVjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOyAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIGRlc2NyaXB0aW9uCi0JCQkvLyBpcyBudWxsLCBiZWNhdXNlIGl0J3MgbmV2ZXIgbnVsbAotCQkJaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gY2FuUnVuQVY7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgYnVpbGRlck5hbWUgPSBjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpOwotCQkJCWlmIChidWlsZGVyTmFtZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGJ1aWxkZXIgbmFtZSB3aWxsIGJlIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIHNldAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYnVpbGRlck5hbWUuZXF1YWxzKFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEKSkgewotCQkJCQljYW5SdW5BViA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlmIHdlIGNhbid0IHJlYWQgdGhlIGluZm9ybWF0aW9uLCB0aGUgcHJvamVjdCBpc24ndCBvcGVuLCBzbyBpdCBjYW4ndCBydW4KLQkJCS8vIGF1dG8tdmFsaWRhdGUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBjYW5SdW5BVjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgYWxsIHZhbGlkYXRvcnMgZm9yIHRoZSBjdXJyZW50IHByb2plY3QsIGFuZCBkb2VzIG5vdCB0b3VjaCB0aGUgYXV0by12YWxpZGF0ZSBzZXR0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUFsbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIFR1cm4gYXV0by12YWxpZGF0ZSBvZmYKLQkJLy8Jc2V0QXV0b1ZhbGlkYXRlKGN1cnJlbnRQcm9qZWN0LCBmYWxzZSk7Ci0KLQkJLy8gRW5hYmxlIHRoZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwcmpwLnNldEVuYWJsZWRWYWxpZGF0b3JzKHByanAuZ2V0VmFsaWRhdG9ycygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGluY3JlbWVudGFsIFZhbGlkYXRvck1ldGFEYXRhIGNvbmZpZ3VyZWQgb24gYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QKLQkgKiAoZS5nLiBFSkIgUHJvamVjdCB2cy4gV2ViIFByb2plY3QpLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvamVjdENvbmZpZ3VyZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFZhbGlkYXRvck1ldGFEYXRhIGNvbmZpZ3VyZWQgb24gYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QgKGUuZy4gRUpCCi0JICogUHJvamVjdCB2cy4gV2ViIFByb2plY3QpLgotCSAqIAotCSAqIElmIHRoZSBjb2xsZWN0aW9uIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkIGJlZm9yZSwgY2FsY3VsYXRlIGl0IG5vdywgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9qZWN0Q29uZmlndXJlZFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldFZhbGlkYXRvcnMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdG9yTWV0YURhdGEgZW5hYmxlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIKLQkgKiBQcm9qZWN0IHZzLiBXZWIgUHJvamVjdCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpc0luY3JlbWVudGFsLCBpZGVudGlmaWVzIHdoZXRoZXIgaXQncyB0aGUKLQkgKiBpbmNyZW1lbnRhbCwgb3Igbm9uLWluY3JlbWVudGFsLCB2YWxpZGF0b3JzIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgdGhlIHBhcmFtZXRlciBpcwotCSAqIHRydWUsIHJldHVybiBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzLiBJZiB0aGUgcGFyYW1ldGVyIGlzIGZhbHNlLCByZXR1cm4gbm9uaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvamVjdEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyh0cnVlKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdG9yTWV0YURhdGEgZW5hYmxlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIKLQkgKiBQcm9qZWN0IHZzLiBXZWIgUHJvamVjdCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpc0luY3JlbWVudGFsLCBpZGVudGlmaWVzIHdoZXRoZXIgaXQncyB0aGUKLQkgKiBpbmNyZW1lbnRhbCwgb3Igbm9uLWluY3JlbWVudGFsLCB2YWxpZGF0b3JzIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgdGhlIHBhcmFtZXRlciBpcwotCSAqIHRydWUsIHJldHVybiBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzLiBJZiB0aGUgcGFyYW1ldGVyIGlzIGZhbHNlLCByZXR1cm4gbm9uaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFByb2plY3RFbmFibGVkTm9uSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoZmFsc2UpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogUmV0dXJucyBhIFZlY3RvciBvZiBhbGwgVmFsaWRhdG9yTWV0YURhdGEgd2hvIGFyZSBib3RoIGNvbmZpZ3VyZWQgb24gdGhpcyB0eXBlIG9mIHByb2plY3QsCi0JICogYW5kIHdobyBhcmUgYWxzbyBlbmFibGVkIGJ5IHRoaXMgcHJvamVjdC4gSWYgdGhlIGxpc3Qgb2YgZW5hYmxlZCB2YWxpZGF0b3JzIGhhc24ndCBiZWVuCi0JICogbG9hZGVkIGludG8gdGhlIGNhY2hlLCBsb2FkIGl0IG5vdy4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldFByb2plY3RFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBWYWxpZGF0b3JNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VVdGlsIGdldFJlc291cmNlVXRpbCgpIHsKLQkJaWYgKF9yZXNvdXJjZVV0aWwgPT0gbnVsbCkgewotCQkJaWYgKF9yZXNvdXJjZVV0aWxDbGFzcyA9PSBudWxsKSB7Ci0JCQkJLy8gU2luY2UgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgbXVzdCBuZXZlciBiZSBudWxsLAotCQkJCS8vIGRlZmF1bHQgdGhlIHJlc291cmNlIHV0aWwgdG8gdGhlIGhlYWRsZXNzIHJlc291cmNlIHV0aWwuCi0JCQkJX3Jlc291cmNlVXRpbENsYXNzID0gUkVTT1VSQ0VVVElMX0RFRkFVTFRDTEFTUzsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlfcmVzb3VyY2VVdGlsID0gKElSZXNvdXJjZVV0aWwpIF9yZXNvdXJjZVV0aWxDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlfcmVzb3VyY2VVdGlsID0gbnVsbDsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCV9yZXNvdXJjZVV0aWwgPSBudWxsOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJX3Jlc291cmNlVXRpbCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yZXNvdXJjZVV0aWw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gSXQgd2lsbCBiZQotCSAqICAgICAgICAgICAgIG1vdmVkIHRvIGEgY2xhc3MgaW4gdGhlICJpbnRlcm5hbCIgcGFja2FnZSBhdCBzb21lIHRpbWUuCi0JICovCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoaW50IHNldmVyaXR5LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgc2V2ZXJpdHkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIEl0IHdpbGwgYmUKLQkgKiAgICAgICAgICAgICBtb3ZlZCB0byBhIGNsYXNzIGluIHRoZSAiaW50ZXJuYWwiIHBhY2thZ2UgYXQgc29tZSB0aW1lLgotCSAqLwotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5KSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBzZXZlcml0eSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gSXQgd2lsbCBiZQotCSAqICAgICAgICAgICAgIG1vdmVkIHRvIGEgY2xhc3MgaW4gdGhlICJpbnRlcm5hbCIgcGFja2FnZSBhdCBzb21lIHRpbWUuCi0JICovCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgewotCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldEluY3JlbWVudGFsVmFsaWRhdG9ycyhDb2xsZWN0aW9uIHZtZHMpIHsKLQkJaWYgKHZtZHMgPT0gbnVsbClyZXR1cm4gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0KLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiByZXN1bHQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2bWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQlyZXN1bHQuYWRkKHZtZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllZCBieSB2YWxpZGF0b3JJZCB3aWxsIHZhbGlkYXRlIHRoZSBnaXZlbiByZXNvdXJjZS4gSWYKLQkgKiBlaXRoZXIgcGFyYW1ldGVyIGlzIG51bGwsIGZhbHNlIGlzIHJldHVybmVkLiBJZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlCi0JICogdmFsaWRhdGlvbiBmcmFtZXdvcmsgKGkuZS4sIGVpdGhlciBubyB2YWxpZGF0b3IgaW4gdGhlIGFjdGl2YXRlZCBwbHVnaW5zIGlzIGlkZW50aWZpZWQgYnkKLQkgKiB0aGF0IHBsdWdpbiBpZCwgb3IgdGhlIGdpdmVuIElSZXNvdXJjZSdzIHByb2plY3QgZG9lcyBub3QgcnVuIHRoYXQgcGFydGljdWxhciB2YWxpZGF0b3IpLAotCSAqIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oU3RyaW5nIHZhbGlkYXRvcklkLCBJUmVzb3VyY2UgcmVzKSB7Ci0JCWlmICgodmFsaWRhdG9ySWQgPT0gbnVsbCkgfHwgKHJlcyA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkvLyB2YWxpZGF0b3Igbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCByZXMuZ2V0UHJvamVjdCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHZtZC5pc0FwcGxpY2FibGVUbyhyZXMpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvVmFsaWRhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNBdXRvVmFsaWRhdGUocHJvamVjdCwgaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEtlZXBpbmcgdGhpcyBBUEkgYXJvdW5kIHNvIGFzIG5vdCB0byBicmVhayBleGlzdGluZyBjb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBpc0F1dG9WYWxpZGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1ZhbGlkYXRlQ2hlY2tlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc0F1dG9WYWxpZGF0ZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBLZWVwaW5nIHRoaXMgQVBJIGFyb3VuZCBzbyBhcyBub3QgdG8gYnJlYWsgZXhpc3RpbmcgY29kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgaXNBdXRvVmFsaWRhdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZUNoZWNrZWQoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZE9uKSB7Ci0JCXJldHVybiBpc0F1dG9WYWxpZGF0ZShwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZE9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGUgd2lsbCBydW4gd2hlbiB0aGVyZSBpcyBhIHJlc291cmNlIGNoYW5nZS4gVGhlIGZvbGxvd2luZwotCSAqIGF0dHJpYnV0ZXMgYXJlIGNoZWNrZWQ6IDEuIGRvZXMgdGhpcyBwcm9qZWN0IGhhdmUgYXV0by12YWxpZGF0ZSBvbiBvciBvZmY/IDIuIGlmIHRoaXMgcHJvamVjdAotCSAqIGRvZXMgbm90IGhhdmUgYW4gYXV0by12YWxpZGF0ZSB2YWx1ZSBzZXQsIGlzIHRoZSBnbG9iYWwgYXV0by12YWxpZGF0ZSBwcmVmZXJlbmNlIG9uPyAzLiBpZiAxCi0JICogb3IgMiBpcyB0cnVlLCBkb2VzIHRoZSBwcm9qZWN0IHN1cHBvcnQgYXV0by12YWxpZGF0ZT8gNC4gaWYgMS8yLCAmIDMsIGlzIGF1dG8tYnVpbGQgb24/IDUuIGlmCi0JICogMS8yLCAzLCBhbmQgNCwgaXMgdGhlcmUgYXQgbGVhc3Qgb25lIGluY3JlbWVudGFsIHZhbGlkYXRvciBlbmFibGVkIG9uIHRoZSBwcm9qZWN0PwotCSAqIAotCSAqIEBkZXByZWNhdGVkIGF1dG8gdmFsaWRhdGUgaXMgbm90IHVzZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24pIHsKLQkJLyp0cnkgewotCQkJLy8gMS4gZG9lcyB0aGUgcHJvamVjdCBoYXZlIGF1dG8tdmFsaWRhdGUgb24gb3Igb2ZmPwotCQkJYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5pc0F1dG9WYWxpZGF0ZSgpOwotCQkJaWYgKCFpc0F1dG9WYWxpZGF0ZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gMy4gZG9lcyB0aGUgcHJvamVjdCBzdXBwb3J0IGF1dG8tdmFsaWRhdGU/Ci0JCQkvLyA0LiBpcyBhdXRvLWJ1aWxkIG9uPwotCQkJLy8gNS4gaXMgdGhlcmUgYXQgbGVhc3Qgb25lIGluY3JlbWVudGFsIHZhbGlkYXRvciBlbmFibGVkIG9uIHRoZSBwcm9qZWN0PwotCQkJCi0JCQkgKiBBdXRvLXZhbGlkYXRpb24sIG9uIHRoZSBwcm9wZXJ0aWVzIHBhZ2UsIGNhbiBiZSBlbmFibGVkIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnM6IDEuCi0JCQkgKiB0aGUgcHJvamVjdCBzdXBwb3J0cyBhdXRvLXZhbGlkYXRpb24sIEFORCAyLiBmaGUgcGxhdGZvcm0ncyBnbG9iYWwgImF1dG9tYXRpY2FsbHkKLQkJCSAqIGJ1aWxkIiBpcyBzZWxlY3RlZCwgQU5EIDMuIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvamVjdCdzIHZhbGlkYXRvcnMgc3VwcG9ydHMKLQkJCSAqIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIFdpdGhvdXQgIzEsIHRoZSBWYWxpZGF0aW9uQnVpbGRlciBpcyBuZXZlciBjYWxsZWQgYmVjYXVzZQotCQkJICogaXQncyBub3QgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdC4gV2l0aG91dCAjMiwgdGhlIFZhbGlkYXRpb25CdWlsZGVyIHdpbGwgbm90IGJlCi0JCQkgKiBjYWxsZWQgYmVjYXVzZSBhdXRvLWJ1aWxkaW5nIGlzIHR1cm5lZCBvZmYuIFdpdGhvdXQgIzMsIHRoZSBWYWxpZGF0aW9uQnVpbGRlciB3aWxsIGJlCi0JCQkgKiBjYWxsZWQsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IGJlY2F1c2Ugbm8gdmFsaWRhdG9ycyBjYW4gcnVuLgotCQkJIAotCQkJcmV0dXJuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZE9uKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlci5jYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gSWYgdGhlIHVzZXIncyBzZXR0aW5nIGNhbid0IGJlIHJldHJpZXZlZCwgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uZ2V0QXV0b1ZhbGlkYXRlRGVmYXVsdCgpOwotCQl9Ki8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBjYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQocHJvamVjdCwgaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIFNldCBnZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogR2l2ZW4gYSBjaGVja2VkIGxpc3Qgb2YgZW5hYmxlZCB2YWxpZGF0b3JzLCByZXR1cm4gYSBzZXQgb2YgdGhlIG9uZXMgd2hpY2ggYXJlIGNvbmZpZ3VyZWQgb24KLQkgKiB0aGUgcHJvamVjdCBhbmQsIGlmIGdldEluY3JlbWVudGFsIGlzIHRydWUsIHdoaWNoIGFsc28gcnVuIGluY3JlbWVudGFsbHkuCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0UHJvamVjdENvbmZpZ3VyZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QsIE9iamVjdFtdIGVuYWJsZWRWYWwsIAotCQkJYm9vbGVhbiBnZXRJbmNyZW1lbnRhbCkgewotCQlpZiAoKHByb2plY3QgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWwgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWwubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCX0KLQotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuYWJsZWRWYWwubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZW5hYmxlZFZhbFtpXTsKLQkJCWlmICghdm1kLmlzQ29uZmlndXJlZE9uUHJvamVjdChwcm9qZWN0KSljb250aW51ZTsKLQotCQkJaWYgKCFnZXRJbmNyZW1lbnRhbCB8fCB2bWQuaXNJbmNyZW1lbnRhbCgpKXZhbC5hZGQodm1kKTsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5jcmVtZW50YWxWYWxpZGF0b3JzKE9iamVjdFtdIGVuYWJsZWRWYWwpIHsKLQkJaWYgKChlbmFibGVkVmFsID09IG51bGwpIHx8IChlbmFibGVkVmFsLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmFibGVkVmFsLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGVuYWJsZWRWYWxbaV07Ci0KLQkJCWlmICh2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGdldEVuYWJsZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG51bGw7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJaWYoIXByanAudXNlR2xvYmFsUHJlZmVyZW5jZSgpKSAKLQkJCSAgIHZtZHMgPSBwcmpwLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQllbHNlCi0JCQkgICB2bWRzID0gZ2V0U3RhdGVPZlByb2plY3RMZXZlbFZhbGlkYXRvcnNGcm9tR2xvYmFsKHByanApOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0U3RhdGVPZlByb2plY3RMZXZlbFZhbGlkYXRvcnNGcm9tR2xvYmFsKFByb2plY3RDb25maWd1cmF0aW9uIHByanApIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZEdsb2JhbFZhbGlkYXRvcnNGb3JQcm9qZWN0ID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCUxpc3QgYWxsUHJvamVjdFZhbGlkYXRvciA9IGdldEFsbFZhbGlkYXRvclVuaXF1ZU5hbWVzKHByanAuZ2V0VmFsaWRhdG9ycygpKTsKLQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdmLmdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSkgewotCQkJaWYoYWxsUHJvamVjdFZhbGlkYXRvci5jb250YWlucyh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKSkgewotCQkJCWVuYWJsZWRHbG9iYWxWYWxpZGF0b3JzRm9yUHJvamVjdC5hZGQodm1kKTsKLQkJCX0KLQkgICB9Ci0JCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSkgZW5hYmxlZEdsb2JhbFZhbGlkYXRvcnNGb3JQcm9qZWN0LnRvQXJyYXkobmV3IFZhbGlkYXRvck1ldGFEYXRhW2VuYWJsZWRHbG9iYWxWYWxpZGF0b3JzRm9yUHJvamVjdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QWxsVmFsaWRhdG9yVW5pcXVlTmFtZXMoVmFsaWRhdG9yTWV0YURhdGFbXSBtZXRhRGF0YSkgewotCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IG1ldGFEYXRhKSB7Ci0JCQluYW1lcy5hZGQodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQkKLQotCXByb3RlY3RlZCBTZXQgZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCXJldHVybiBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHZtZHMpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgU2V0IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJhc2VkIG9uIHdoaWNoCi0JICogdmFsaWRhdG9ycyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uCi0JICogZnJhbWV3b3JrIFVJIGNsYXNzZXMuIFJlbW92ZSB0aGUgbWVzc2FnZXMgYmVsb25naW5nIHRvIGRpc2FibGVkIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGFza0xpc3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCQkJCS8vIEZvciB2YWxpZGF0b3JzIHdobyBhcmVuJ3QgZ29pbmcgdG8gcnVuLCBjbGVhciB0aGVpciBtZXNzYWdlcyBmcm9tIHRoZSB0YXNrIGxpc3QuCi0JCQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlIGVudHJpZXMgYmVjYXVzZSBlYWNoIFZhbGlkYXRvciBtdXN0IGJlIHVuaXF1ZS4KLQkJCQkvLyBUaGUgdW5pcXVlbmVzcyBvZiBlYWNoIFZhbGlkYXRvciBpcyBjaGVja2VkIGJ5IHRoZSBwbHVnaW4gcmVnaXN0cnkuCi0JCQkJV29ya2JlbmNoUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMocHJvamVjdCwgdm1kLmdldFZhbGlkYXRvck5hbWVzKCksIG51bGwpOwotCQkJfQotCQkJIC8vTWVzc2FnZSBMaW1pdCBpcyByZW1vdmVkIGZyb20gdGhlIGZyYW1ld29yayAtIFdUUDEuNU01Ci0JCQkvKmlmIChwcmpwLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKSA+IDApIHsKLQkJCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5jaGVja01lc3NhZ2VMaW1pdChwcm9qZWN0LCBmYWxzZSk7IC8vIERvIG5vdCByZW1vdmUKLQkJCQkvLyB0aGUgZXhjZWVkZWQKLQkJCQkvLyBtZXNzYWdlOyBvbmx5Ci0JCQkJLy8gVmFsaWRhdGlvbk9wZXJhdGlvbgotCQkJCS8vIHNob3VsZCBkbyB0aGF0Ci0JCQkJLy8gYmVjYXVzZSBpdCdzCi0JCQkJLy8gYWJvdXQgdG8gcnVuCi0JCQkJLy8gdmFsaWRhdGlvbi4gSWYKLQkJCQkvLyB0aGUgbGltaXQgaXMKLQkJCQkvLyBpbmNyZWFzZWQsCi0JCQkJLy8gbWVzc2FnZXMgbWF5Ci0JCQkJLy8gc3RpbGwgYmUKLQkJCQkvLyBtaXNzaW5nLCBzbwotCQkJCS8vIGRvbid0IHJlbW92ZSB0aGUKLQkJCQkvLyAibWVzc2FnZXMgbWF5IGJlCi0JCQkJLy8gbWlzc2luZyIKLQkJCQkvLyBtZXNzYWdlLgotCQkJfSBlbHNlIHsKLQkJCQkvLyBDYW4ndCBydW4gdmFsaWRhdGlvbiwgc28gcmVtb3ZlIHRoZSAiZXhjZWVkZWQiIG1lc3NhZ2UKLQkJCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlTGltaXRFeGNlZWRlZChwcm9qZWN0KTsKLQkJCX0qLwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24pIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlib29sZWFuIGluY3JlbWVudGFsVmFsRW5hYmxlZCA9IChwcmpwLm51bWJlck9mRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycygpID4gMCk7Ci0JCQlyZXR1cm4gY2FuQXV0b1ZhbGlkYXRlQnV0dG9uQmVFbmFibGVkKHByb2plY3QsIGlzR2xvYmFsQXV0b0J1aWxkT24sIGluY3JlbWVudGFsVmFsRW5hYmxlZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24sIGJvb2xlYW4gaW5jcmVtZW50YWxWYWxFbmFibGVkKSB7Ci0JCWJvb2xlYW4gZG9lc1Byb2plY3RTdXBwb3J0QXV0b1ZhbGlkYXRlID0gZG9lc1Byb2plY3RTdXBwb3J0QnVpbGRWYWxpZGF0aW9uKHByb2plY3QpOwotCQlyZXR1cm4gKGRvZXNQcm9qZWN0U3VwcG9ydEF1dG9WYWxpZGF0ZSAmJiBpc0dsb2JhbEF1dG9CdWlsZE9uICYmIGluY3JlbWVudGFsVmFsRW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVkIGJ5IHRoZSBTdHJpbmcgaXMgY29uZmlndXJlZCBvbiB0aGUgSVByb2plY3QgYW5kCi0JICogZW5hYmxlZCBvbiB0aGUgSVByb2plY3QuIE90aGVyd2lzZSByZXR1cm4gZmFsc2U7Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWxpZGF0b3JOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIHByanAuaXNFbmFibGVkKHZhbGlkYXRvck5hbWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgVmFsaWRhdG9yTWV0YURhdGEgaXMKLQkgKiAgICAgICAgICAgICBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gcHJqcC5pc0VuYWJsZWQodm1kKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuaXNDb25maWd1cmVkT25Qcm9qZWN0KHZtZCwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBnbG9iYWwgYXV0by1idWlsZCBzZXR0aW5nIGlzIHR1cm5lZCBvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyUHJvamVjdEVuYWJsZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBwcmpwLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBWYWxpZGF0aW9uRnJhbWV3b3JrLnN1c3BlbmRWYWxpZGF0aW9uKHByb2plY3QsIHN1c3BlbmQpIGRpcmVjdGx5LgotCSAqIEBzZWUgVmFsaWRhdGlvbkZyYW1ld29yayNzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIHN1c3BlbmQpIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuc3VzcGVuZFZhbGlkYXRpb24ocHJvamVjdCwgc3VzcGVuZCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLnN1c3BlbmRBbGxWYWxpZGF0aW9uKHN1c3BlbmQpIGRpcmVjdGx5LgotCSAqIEBzZWUgVmFsaWRhdGlvbkZyYW1ld29yayNzdXNwZW5kQWxsVmFsaWRhdGlvbihib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmRBbGxWYWxpZGF0aW9uKGJvb2xlYW4gc3VzcGVuZCkgewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5zdXNwZW5kQWxsVmFsaWRhdGlvbihzdXNwZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuaXNTdXNwZW5kZWQoKSBkaXJlY3RseS4KLQkgKiBAc2VlIFZhbGlkYXRpb25GcmFtZXdvcmsjaXNTdXNwZW5kZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgewotCQlyZXR1cm4gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuaXNTdXNwZW5kZWQocHJvamVjdCkgZGlyZWN0bHkuCi0JICogQHNlZSBWYWxpZGF0aW9uRnJhbWV3b3JrI2lzU3VzcGVuZGVkKElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5pc1Byb2plY3RTdXNwZW5kZWQocHJvamVjdCkgZGlyZWN0bHkuCi0JICogQHNlZSBWYWxpZGF0aW9uRnJhbWV3b3JrI2lzUHJvamVjdFN1c3BlbmRlZChJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RTdXNwZW5kZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuaXNQcm9qZWN0U3VzcGVuZGVkKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogR2l2ZW4gYSBsaXN0IG9mIHZhbGlkYXRvcnMnIHBsdWdpbiBpZHMsIG1ha2UgdGhvc2UgdmFsaWRhdG9ycyBlbmFibGVkIGZvciB0aGlzIHByb2plY3QuIEFsbAotCSAqIG90aGVycywgZGlzYWJsZSBmb3IgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kc1NldCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gbnVsbDsKLQkJCWlmICh2bWRzU2V0ID09IG51bGwpIHsKLQkJCQl2bWRzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCQkJfSBlbHNlIHsKLQkJCQl2bWRzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW3ZtZHNTZXQuc2l6ZSgpXTsKLQkJCQl2bWRzU2V0LnRvQXJyYXkodm1kcyk7Ci0JCQl9Ci0KLQkJCXByanAuc2V0RW5hYmxlZFZhbGlkYXRvcnModm1kcyk7Ci0KLQkJCXVwZGF0ZVRhc2tMaXN0KHByb2plY3QpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzb3VyY2VVdGlsQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJX3Jlc291cmNlVXRpbENsYXNzID0gY2xheno7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIHVzZSBieSBiYXRjaCBFSkIgZGVwbG95IG9ubHkuIE9ubHkgaW4gYmF0Y2ggbW9kZSBpcyBhbiBpbmZpbml0ZSBudW1iZXIgb2YKLQkgKiBtZXNzYWdlcyBhbGxvd2VkLgotCSAqIAotCSAqIEVuYWJsZSBhIHByb2plY3QgdG8gaGF2ZSBhbiBpbmZpbml0ZSBudW1iZXIgb2YgbWVzc2FnZXMuCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb01lc3NhZ2VMaW1pdChJUHJvamVjdCBwcm9qZWN0KSB7LyoKLQkJc2V0TWVzc2FnZUxpbWl0KHByb2plY3QsIFdvcmtiZW5jaFJlcG9ydGVyLk5PX01FU1NBR0VfTElNSVQpOwotCSovfQotCi0JLyoqCi0JICogVGhpcyBtZXNzYWdlIGlzIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIElmIHRoZSAibWF4IG1lc3NhZ2VzIHdlcmUgcmVwb3J0ZWQiCi0JICogSU1hcmtlciBleGlzdHMsIHJldHVybiBpdC4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXByaXZhdGUgSU1hcmtlcltdIGdldExpbWl0TWVzc2FnZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNYXJrZXJbXSBleGNlZWRlZE1lc3NhZ2UgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIFdvcmtiZW5jaFJlcG9ydGVyLmdldFVuaXF1ZUlkKGdldE1lc3NhZ2VMaW1pdE93bmVyKCkpKTsKLQkJaWYgKChleGNlZWRlZE1lc3NhZ2UgIT0gbnVsbCkgJiYgKGV4Y2VlZGVkTWVzc2FnZS5sZW5ndGggIT0gMCkpIHsKLQkJCXJldHVybiBleGNlZWRlZE1lc3NhZ2U7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIElNYXJrZXIgaXMgYSAibGltaXQgd2FzIGV4Y2VlZGVkIiBtZXNzYWdlLCBmYWxzZSBvdGhlcndpc2UuCi0vLwkgKi8KLS8vCXByaXZhdGUgYm9vbGVhbiBpc0xpbWl0TWVzc2FnZShJTWFya2VyIG1hcmtlcikgewotLy8JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmlzT3duZXIobWFya2VyLCBXb3JrYmVuY2hSZXBvcnRlci5nZXRVbmlxdWVJZChnZXRNZXNzYWdlTGltaXRPd25lcigpKSk7Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJuIGFsbCBvZiB0aGUgSU1hcmtlcnMgb24gdGhlIElQcm9qZWN0IGV4Y2x1ZGluZyB0aGUgImxpbWl0IHdhcyBleGNlZWRlZCIgbWVzc2FnZS4gSWYKLS8vCSAqIHRoZXJlIGFyZSBubyBtYXJrZXJzLCByZXR1cm4gbnVsbC4KLS8vCSAqLwotLy8JcHJpdmF0ZSBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzV2l0aG91dExpbWl0TWVzc2FnZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJSU1hcmtlcltdIGFsbFRhc2tzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotLy8JCWlmICgoYWxsVGFza3MgPT0gbnVsbCkgfHwgKGFsbFRhc2tzLmxlbmd0aCA9PSAwKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwotLy8JCS8vIERvbid0IGNoZWNrIGlmIHRoZSBsaW1pdCBtZXNzYWdlIGV4aXN0cyBiZWNhdXNlCi0vLwkJLy8gYW55IGludGVyYWN0aW9uIHdpdGggbWFya2VycyBpcyBjb3N0bHkuIFNpbmNlIHRoZQotLy8JCS8vIGludGVyYWN0aW9uIGhhcyB0byBiZSBkb25lIGF0IGxlYXN0IG9uY2UsIG1ha2UgdGhhdAotLy8JCS8vIHNpbmdsZSBvY2Nhc2lvbiBpbiB0aGUgZm9yIGxvb3AgYmVsb3cuCi0vLwkJSU1hcmtlcltdIHZhbGlkYXRvck1lc3NhZ2VzID0gbmV3IElNYXJrZXJbYWxsVGFza3MubGVuZ3RoXTsKLS8vCQlpbnQgY291bnQgPSAwOyAvLyBob3cgbWFueSBtYXJrZXJzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgcmVzdWx0IGFycmF5PwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVGFza3MubGVuZ3RoOyBpKyspIHsKLS8vCQkJSU1hcmtlciBtYXJrZXIgPSBhbGxUYXNrc1tpXTsKLS8vCQkJaWYgKGlzTGltaXRNZXNzYWdlKG1hcmtlcikpIHsKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQl9Ci0vLwkJCXZhbGlkYXRvck1lc3NhZ2VzW2NvdW50KytdID0gbWFya2VyOwotLy8JCX0KLS8vCi0vLwkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW2NvdW50XTsKLS8vCQlTeXN0ZW0uYXJyYXljb3B5KHZhbGlkYXRvck1lc3NhZ2VzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gUmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzCi0JICogcmVtb3ZlZCwgZmFsc2UgaWYgdGhlIG1lc3NhZ2UgZGlkbid0IGV4aXN0LgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBub3QgYmUgdXNlZCBhbnltb3JlIGFzIE1lc3NhZ2UgTGltaXQgaXMgcmVtb3ZlZCBmcm9tCi0JICogdGhlIGZyYW1ld29yayAtIFdUUDEuNU01Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlTWVzc2FnZUxpbWl0RXhjZWVkZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlJTWFya2VyW10gZXhjZWVkZWRNZXNzYWdlID0gZ2V0TGltaXRNZXNzYWdlKHByb2plY3QpOwotCQlpZiAoZXhjZWVkZWRNZXNzYWdlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMoZXhjZWVkZWRNZXNzYWdlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGFzdCB2YWxpZGF0aW9uIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGR1ZSB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMKLQkgKiBoYXZpbmcgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhc1ZhbGlkYXRpb25UZXJtaW5hdGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1hcmtlcltdIGV4Y2VlZGVkTWVzc2FnZSA9IGdldExpbWl0TWVzc2FnZShwcm9qZWN0KTsKLQkJcmV0dXJuIChleGNlZWRlZE1lc3NhZ2UgIT0gbnVsbCk7IC8vIFZhbGlkYXRpb24gd2FzIHRlcm1pbmF0ZWQgaWYgdGhlIG1lc3NhZ2UgZXhpc3RzLgotCX0KLQotCXByaXZhdGUgQ2xhc3MgZ2V0TWVzc2FnZUxpbWl0T3duZXIoKSB7Ci0JCWlmIChfbWVzc2FnZUxpbWl0T3duZXIgPT0gbnVsbCkgewotCQkJX21lc3NhZ2VMaW1pdE93bmVyID0gZ2V0Q2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gX21lc3NhZ2VMaW1pdE93bmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG93bmVyIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBvd25zIHZhbGlkYXRpb24gZnJhbWV3b3JrIHN0YXR1cwotCSAqIG1lc3NhZ2VzLgotCSAqIAotCSAqIE9OTFkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNob3VsZCB1c2UgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcm5hbE93bmVyKFN0cmluZyBvd25lcikgewotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBfaW50ZXJuYWxPd25lcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBpbnRlcm5hbE93bmVyID0gX2ludGVybmFsT3duZXJzW2ldOwotCQkJaWYgKG93bmVyLmVxdWFscyhpbnRlcm5hbE93bmVyKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNsYXNzIHRvIHRoZSBsaXN0IG9mIG93bmVycyBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLiBPTkxZIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yawotCSAqIHNob3VsZCB1c2UgdGhpcyBtZXRob2QgKGl0IGlzIHVzZWQgZm9yIG1lc3NhZ2VzIG93bmVkIGJ5IGZyYW1ld29yayBjbGFzc2VzIG9yIGNsYXNzZXMgdXNlZCBieQotCSAqIHRoZSBUVlQgcGx1Z2luLikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnRlcm5hbE93bmVyKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdbXSB0ZW1wSW50ZXJuYWxPd25lcnMgPSBuZXcgU3RyaW5nW19pbnRlcm5hbE93bmVycy5sZW5ndGggKyAxXTsKLQkJaWYgKF9pbnRlcm5hbE93bmVycy5sZW5ndGggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KF9pbnRlcm5hbE93bmVycywgMCwgdGVtcEludGVybmFsT3duZXJzLCAwLCBfaW50ZXJuYWxPd25lcnMubGVuZ3RoKTsKLQkJfQotCQl0ZW1wSW50ZXJuYWxPd25lcnNbX2ludGVybmFsT3duZXJzLmxlbmd0aF0gPSBXb3JrYmVuY2hSZXBvcnRlci5nZXRVbmlxdWVJZChjbGF6eik7Ci0KLQkJX2ludGVybmFsT3duZXJzID0gdGVtcEludGVybmFsT3duZXJzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjYWNoZU1lc3NhZ2UoSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsIE1lc3NhZ2VJbmZvIGluZm8pewotCQlMaXN0PE1lc3NhZ2VJbmZvPiBsaXN0ID0gX3ZhbGlkYXRvck1zZ3MuZ2V0KHZhbGlkYXRvcik7Ci0JCWlmKCBsaXN0ID09IG51bGwgKXsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VJbmZvPigpOwotCQkJX3ZhbGlkYXRvck1zZ3MucHV0KHZhbGlkYXRvciwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGQoaW5mbyk7Ci0JfQotCQotCXB1YmxpYyBMaXN0PE1lc3NhZ2VJbmZvPiBnZXRNZXNzYWdlcyhJVmFsaWRhdG9ySm9iIHZhbGlkYXRvcil7Ci0JCUxpc3Q8TWVzc2FnZUluZm8+IGxpc3QgPSBfdmFsaWRhdG9yTXNncy5nZXQodmFsaWRhdG9yKTsKLQkJaWYoIGxpc3QgPT0gbnVsbCApbGlzdCA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZUluZm8+KCk7CQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyTWVzc2FnZXMoSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IpewotCQlMaXN0PE1lc3NhZ2VJbmZvPiBsaXN0ID0gX3ZhbGlkYXRvck1zZ3MuZ2V0KHZhbGlkYXRvcik7Ci0JCWlmKCBsaXN0ICE9IG51bGwgKXsKLQkJCWxpc3QuY2xlYXIoKTsKLQkJfQotCQlfdmFsaWRhdG9yTXNncy5yZW1vdmUoIHZhbGlkYXRvciApOwotCX0KLQotCQotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldFByb2JsZW1WYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX3Byb2JsZW1WYWxpZGF0b3JzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhNDZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRmlsdGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotCi0vKioKLSAqIFJ1biBzb21lIHZhbGlkYXRvcnMgb24gYSBnaXZlbiBJUHJvamVjdC4gQW55IHZhbGlkYXRvcnMgd2hpY2ggY2Fubm90IGJlIGxvYWRlZCBvciB3aGljaCBhcmUgbm90Ci0gKiByZWdpc3RlcmVkIGFnYWluc3QgdGhpcyB0eXBlIG9mIHByb2plY3Qgd2lsbCBiZSBpZ25vcmVkLgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25PcGVyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVGQVVMVEVYVEVOU0lPTiA9IG51bGw7IC8vIEJ5IGRlZmF1bHQsIGFzc3VtZSB0aGF0IHRoZXJlCi0KLQkvLyBpcyBubyBkZWZhdWx0IGZhbGxiYWNrCi0JLy8gZXh0ZW5zaW9uCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIHRoYXQgcnVucyBhIGZ1bGwgdmFsaWRhdGlvbiBvbiB0aGUgbmFtZWQgdmFsaWRhdG9ycyBlaXRoZXIgaWYgdmFsaWRhdGlvbgotCSAqIG5lZWRzIHRvIChAc2VlIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCkpIG9yIGlmIDxjb2RlPmZvcmNlPC9jb2RlPiBpcyB0cnVlLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGZvcmNlLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBhc3luYyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJ1bnMgYSBmdWxsIHZhbGlkYXRpb24gb24gdGhlIG5hbWVkIHZhbGlkYXRvcnMgdXNpbmcgdGhlCi0JICogPGNvZGU+cnVsZUdyb3VwPC9jb2RlPiBwYXNzLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBvbmx5IGlmIHlvdSB3YW50IHRvIHJ1biBhIHZhbGlkYXRvciB0aGF0Ci0JICogc3VwcG9ydHMgdGhlIHR3byBwYXNzZXM6IEZBU1QgYW5kIEZVTEwuCi0JICogCi0JICogSWYgZm9yY2UgaXMgdHJ1ZSwgdmFsaWRhdGlvbiBpcyBydW4gd2hldGhlciBvciBub3QgaXQgbmVlZHMgdG8uCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhV29ya2VuY2hDb250ZXh0LCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIGFXb3JrZW5jaENvbnRleHQsIG51bGwsIG51bGwsIHJ1bGVHcm91cCwgZm9yY2UsIGFzeW5jKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIHRoYXQgcnVucyBhIGZ1bGwgdmFsaWRhdGlvbiBvbiB0aGUgbmFtZWQgdmFsaWRhdG9ycyB1c2luZyB0aGUKLQkgKiA8Y29kZT5ydWxlR3JvdXA8L2NvZGU+IHBhc3MuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIG9ubHkgaWYgeW91IHdhbnQgdG8gcnVuIGEgdmFsaWRhdG9yIHRoYXQKLQkgKiBzdXBwb3J0cyB0aGUgdHdvIHBhc3NlczogRkFTVCBhbmQgRlVMTC4KLQkgKiAKLQkgKiBJZiBmb3JjZSBpcyB0cnVlLCB2YWxpZGF0aW9uIGlzIHJ1biB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0by4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGludCBydWxlR3JvdXAsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBmb3JjZSwgYXN5bmMpOwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KSk7Ci0JCXNldEZpbGVEZWx0YXMoRmlsdGVyVXRpbC5nZXRGaWxlRGVsdGFzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBvcGVyYXRpb24gdGhhdCBydW5zIGEgZnVsbCB2YWxpZGF0aW9uIG9uIHRoZSBuYW1lZCB2YWxpZGF0b3JzIHVzaW5nIHRoZQotCSAqIDxjb2RlPnJ1bGVHcm91cDwvY29kZT4gcGFzcy4gVXNlIHRoaXMgY29uc3RydWN0b3Igb25seSBpZiB5b3Ugd2FudCB0byBydW4gYSB2YWxpZGF0b3IgdGhhdAotCSAqIHN1cHBvcnRzIHRoZSB0d28gcGFzc2VzOiBGQVNUIGFuZCBGVUxMLgotCSAqIAotCSAqIElmIGZvcmNlIGlzIHRydWUsIHZhbGlkYXRpb24gaXMgcnVuIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBmb3JjZSwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBudWxsLCBudWxsLCBydWxlR3JvdXAsIGZvcmNlLCBhc3luYyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGVFeHRlbnNpb24gcGFyYW1ldGVyIG11c3QgYmUgIi5YIiwgd2hlcmUgWCBpcyB0aGUgZXh0ZW5zaW9uLiBEbyBub3QgdHlwZSAiKi5YIiBvciAiWCIKLQkgKiAoaS5lLiwgd2l0aG91dCB0aGUgZG90KS4gVGhlIHBhcmFtZXRlciBjb3VsZCBhbHNvIGJlIHRoZSBmaWxlIG5hbWUsIGUuZy4gImZvby5YIi4KLQkgKiAKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGludm9rZXIgd2lzaGVzIHRvIGZvcmNlIHZhbGlkYXRpb24gb24gY2VydGFpbgotCSAqIHJlc291cmNlcywgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBzYXZlIHRoZWlyIGNoYW5nZXMuCi0JICogCi0JICogQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycyByZWdpc3RlcmVkIGZvciB0aGUKLQkgKiBmaWxlRXh0ZW5zaW9uIG9uIHRoZSBnaXZlbiBJUHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCBmaWxlRXh0ZW5zaW9uLCBERUZBVUxUX0RFRkFVTFRFWFRFTlNJT04sIGNoYW5nZWRSZXNvdXJjZXMsIGFzeW5jKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZmlsZUV4dGVuc2lvbiBwYXJhbWV0ZXIgbXVzdCBiZSAiLlgiLCB3aGVyZSBYIGlzIHRoZSBleHRlbnNpb24uIERvIG5vdCB0eXBlICIqLlgiIG9yICJYIgotCSAqIChpLmUuLCB3aXRob3V0IHRoZSBkb3QpLiBUaGUgcGFyYW1ldGVyIGNvdWxkIGFsc28gYmUgdGhlIGZpbGUgbmFtZSwgZS5nLiAiZm9vLlgiLgotCSAqIAotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgaW52b2tlciB3aXNoZXMgdG8gZm9yY2UgdmFsaWRhdGlvbiBvbiBjZXJ0YWluCi0JICogcmVzb3VyY2VzLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSB1c2VyIHRvIHNhdmUgdGhlaXIgY2hhbmdlcy4KLQkgKiAKLQkgKiBJZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycyBjb25maWd1cmVkIG9uIGZpbGVzIG5hbWVkICIuWCIsIHRoZW4gdXNlIHRoZSB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQKLQkgKiBvbiB2YWxpZGF0b3JzIG5hbWVkICIuWSIsIHdoZXJlIGRlZmF1bHRFeHRlbnNpb24gaWRlbnRpZmllcyB0aGUgZmFsbGJhY2sgZXh0ZW5zaW9uIHRvIHVzZS4KLQkgKiBkZWZhdWx0RXh0ZW5zaW9uIGZvbGxvd3MgdGhlIHNhbWUgc3ludGF4IGFzIGZpbGVFeHRlbnNpb24uCi0JICogCi0JICogQW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycyByZWdpc3RlcmVkIGZvciB0aGUKLQkgKiBmaWxlRXh0ZW5zaW9uIG9yIGRlZmF1bHRFeHRlbnNpb24gb24gdGhlIGdpdmVuIElQcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpbGVFeHRlbnNpb24sIFN0cmluZyBkZWZhdWx0RXh0ZW5zaW9uLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdCwgc2hvdWxkRm9yY2UoY2hhbmdlZFJlc291cmNlcyksIGFzeW5jKTsKLQotCQlib29sZWFuIGZpbHRlckluID0gZmFsc2U7IC8vIGZvcmNlIHRoZSByZXNvdXJjZXMgdG8gYmUgZmlsdGVyZWQgaW4gZXZlbiBpZiB0aGUgdmFsaWRhdG9yCi0JCS8vIGRvZXNuJ3Qgbm9ybWFsbHkgdGFrZSB0aGVtPwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvcnNGb3JFeHRlbnNpb24ocHJvamVjdCwgZmlsZUV4dGVuc2lvbik7IC8vIHJldHVybgotCQkvLyBhCi0JCS8vIGxpc3QKLQkJLy8gb2YKLQkJLy8gdmFsaWRhdG9ycwotCQkvLyB3aGljaAotCQkvLyBhcmUKLQkJLy8gY29uZmlndXJlZAotCQkvLyB0bwotCQkvLyBydW4KLQkJLy8gb24KLQkJLy8gZmlsZXMKLQkJLy8gd2l0aAotCQkvLyB0aGF0Ci0JCS8vIGV4dGVuc2lvbi4KLQkJLy8gQQotCQkvLyB2YWxpZGF0b3IKLQkJLy8gd2lsbAotCQkvLyBiZQotCQkvLyBpbgotCQkvLyB0aGUKLQkJLy8gbGlzdAotCQkvLyB3aGV0aGVyCi0JCS8vIGl0Ci0JCS8vIGhhcwotCQkvLyBiZWVuCi0JCS8vIGVuYWJsZWQKLQkJLy8gb3IKLQkJLy8gZGlzYWJsZWQKLQkJLy8gYnkKLQkJLy8gdGhlCi0JCS8vIHVzZXIuCi0JCWlmICgoZGVmYXVsdEV4dGVuc2lvbiAhPSBudWxsKSAmJiAoKHZtZHMgPT0gbnVsbCkgfHwgKHZtZHMubGVuZ3RoID09IDApKSkgewotCQkJZmlsdGVySW4gPSB0cnVlOwotCQkJdm1kcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yc0ZvckV4dGVuc2lvbihwcm9qZWN0LCBkZWZhdWx0RXh0ZW5zaW9uKTsKLQkJfQotCi0JCWlmICgodm1kcyA9PSBudWxsKSB8fCAodm1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcykpOwotCi0JCXNldEZpbGVEZWx0YXMoRmlsdGVyVXRpbC5nZXRGaWxlRGVsdGFzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGNoYW5nZWRSZXNvdXJjZXMsIGZpbHRlckluKSk7IC8vIGNvbnN0cnVjdAotCQkvLyBhbgotCQkvLyBhcnJheQotCQkvLyBvZgotCQkvLyBJRmlsZURlbHRhW10KLQkJLy8gdG8KLQkJLy8gd3JhcAotCQkvLyB0aGUKLQkJLy8gT2JqZWN0W107Ci0JCS8vIG9uZQotCQkvLyBJRmlsZURlbHRhCi0JCS8vIGZvcgotCQkvLyBlYWNoCi0JCS8vIE9iamVjdAotCQkvLyBpbgotCQkvLyB0aGUKLQkJLy8gYXJyYXkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGZvciB0aGUgdmFsaWRhdGlvbiBhc3luYyB0ZXN0aW5nLCBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0JICogY2FsbGVkIG91dHNpZGUgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqIAotCSAqIFJ1biB2YWxpZGF0aW9uIG9uIHRoZSBjaGFuZ2VkIHJlc291cmNlcyB3aXRoIHRoZSBnaXZlbiB2YWxpZGF0b3JzLiBBbGwgcmVzb3VyY2VzIG11c3QgYmUgZnJvbQotCSAqIHRoZSBzYW1lIHByb2plY3Q7IGlmIHRoZXkncmUgbm90LCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEFsbCB2YWxpZGF0b3JzCi0JICogbXVzdCBiZSBhYmxlIHRvIHJ1biBvbiB0aGUgcmVzb3VyY2VzJyBwcm9qZWN0OyBpZiBub3QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlCi0JICogdGhyb3duLiBJZiB0aGUgdm1kcyBhcmUgZWl0aGVyIGVtcHR5IG9yIG51bGwsIGFuIElsbGVnYWxBcmd1bWVudEV4ZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBJZgotCSAqIHRoZSBwcm9qZWN0IGlzIGNsb3NlZCBvciBkb2Vzbid0IGV4aXN0IHRoZW4gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIFRoZSBpZmlsZURlbHRhVHlwZSBpcyBvbmUgb2YgdGhlIElGaWxlRGVsdGEgY29uc3RhbnRzOiBBRERFRCwgQ0hBTkdFRCwgb3IgREVMRVRFRC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcywgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgaW50IGlmaWxlRGVsdGFUeXBlLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJLy8gSGF2ZSB0byBoYXZlIHRoZSBJUHJvamVjdCBhcyBhIHBhcmFtZXRlciBiZWNhdXNlIFZhbGlkYXRpb25PcGVyYXRpb24gbmVlZHMgdGhlIElQcm9qZWN0LAotCQkvLyBhbmQgdGhlIHN1cGVyKC4uKQotCQkvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSBpbiB0aGlzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZC4KLQkJc3VwZXIocHJvamVjdCwgZm9yY2UsIGFzeW5jKTsKLQotCQlpZiAoKHZtZHMgPT0gbnVsbCkgfHwgKHZtZHMubGVuZ3RoID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfQkFEVk1EKSk7Ci0JCX0KLQotCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19PUEVOUFJKLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfRVhJU1RQUkosIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCi0JCWlmICgoY2hhbmdlZFJlc291cmNlcyAhPSBudWxsKSAmJiAoY2hhbmdlZFJlc291cmNlcy5sZW5ndGggPiAwKSkgewotCQkJU2V0PElQcm9qZWN0PiB0ZW1wU2V0ID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwID0gY2hhbmdlZFJlc291cmNlc1tpXS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKCFwLmlzT3BlbigpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19PUEVOUFJKLCBuZXcgU3RyaW5nW117cC5nZXROYW1lKCl9KSk7Ci0JCQkJfQotCQkJCWlmICghcC5leGlzdHMoKSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfRVhJU1RQUkosIG5ldyBTdHJpbmdbXXtwLmdldE5hbWUoKX0pKTsKLQkJCQl9Ci0JCQkJdGVtcFNldC5hZGQocHJvamVjdCk7Ci0JCQl9Ci0KLQkJCWlmICghdGVtcFNldC5jb250YWlucyhwcm9qZWN0KSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19CQURQUkosIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJCX0KLQkJCWlmICh0ZW1wU2V0LnNpemUoKSAhPSAxKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJdGVyYXRvcjxJUHJvamVjdD4gaXRlcmF0b3IgPSB0ZW1wU2V0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJUHJvamVjdCBwID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1ZmZlci5hcHBlbmQocC5nZXROYW1lKCkpOwotCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX01VTFRJUFJKLCBuZXcgU3RyaW5nW117YnVmZmVyLnRvU3RyaW5nKCl9KSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAoIVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBwcm9qZWN0KSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19CQURWQUwsIG5ldyBTdHJpbmdbXXt2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgcHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCQl9Ci0JCX0KLQotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHZtZHMpKTsKLQkJc2V0RmlsZURlbHRhcyhGaWx0ZXJVdGlsLmdldEZpbGVEZWx0YXMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSwgY2hhbmdlZFJlc291cmNlcywgaWZpbGVEZWx0YVR5cGUpKTsgLy8gY29uc3RydWN0Ci0JCS8vIGFuIGFycmF5IG9mIElGaWxlRGVsdGFbXSB0byB3cmFwIHRoZSBJUmVzb3VyY2VbXTsgb25lIElGaWxlRGVsdGEgZm9yIGVhY2ggSVJlc291cmNlIGluIHRoZSBhcnJheQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIGFycmF5IG9mIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB2YWxpZGF0b3JzLCBjcmVhdGUgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyB0bwotCSAqIGJlIHJ1bi4gVGhlIGFycmF5IGlzIG5vdCBjaGVja2VkIGZvciBkdXBsaWNhdGVzIG9yIGZvciBpbnZhbGlkIHZhbGlkYXRvcnMgKGkuZS4sIGEgdmFsaWRhdG9yCi0JICogb2YgdGhhdCBjbGFzcyB0eXBlIGlzIG5vdCBsb2FkZWQsIG9yIHRoZSB2YWxpZGF0b3IgaXMgbG9hZGVkIGJ1dCBjYW5ub3QgcnVuIGFnYWluc3QgdGhpcyB0eXBlCi0JICogb2YgSVByb2plY3QuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcnMoU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IHZhbGlkYXRvck5hbWVzKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEobmFtZSk7Ci0JCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkvLyBObyB2YWxpZGF0b3IsIHdpdGggdGhhdCBwbHVnaW4gaWQsIGNhbiBiZSBydW4gb24gdGhhdCBwcm9qZWN0LgotCQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJCS8vIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IG5hdHVyZS4KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUpOwotCQkJfQotCQkJZW5hYmxlZC5hZGQodm1kKTsKLQkJfQotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBzZXRGb3JjZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1J1bihib29sZWFuIGZvcmNlKSB7Ci0JCXNldEZvcmNlKGZvcmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5ODMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvV29ya2JlbmNoQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWdpc3RyeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcmVnaXN0cmF0aW9uIG9mIHN5bWJvbGljIG1vZGVsIG5hbWVzLCBhbmQgYWxzbyBwcm92aWRlcyB0aGUgbWVjaGFuaXNtIGZvcgotICogcmVnaXN0ZXJpbmcgdGhlIGxvYWQgbW9kZWwgbWV0aG9kIHdoaWNoIGxvYWRzIGEgc3BlY2lmaWMgdHlwZSBvZiBNT0YgbW9kZWwsIGFzIGlkZW50aWZpZWQgYnkgdGhlCi0gKiBzeW1ib2xpYyBtb2RlbCBuYW1lLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQ29udGV4dCBpbXBsZW1lbnRzIElXb3JrYmVuY2hDb250ZXh0IHsKLQlwcml2YXRlIElQcm9qZWN0IAlfcHJvamVjdDsKLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsTWV0aG9kPiAJX21vZGVsUmVnaXN0cnk7Ci0JcHJpdmF0ZSBpbnQgCQlfcnVsZUdyb3VwID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25GaWxlVVJJczsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9ICJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdvcmtiZW5jaENvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9tb2RlbFJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE1ldGhvZD4oKTsKLQotCQlyZWdpc3Rlck1vZGVsKElSdWxlR3JvdXAuUEFTU19MRVZFTCwgImxvYWRSdWxlR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy90aGUgZm9sbG93aW5nIHdpbGwgcmVnaXN0ZXIgdGhlIGhlbHBlcidzIHN5bWJvbGljIG1ldGhvZHMKLQkgICAgQ2xhc3MgW10gYXJncyA9IG5ldyBDbGFzc1sxXSA7Ci0JICAgIGFyZ3NbMF0gPSBTdHJpbmcuY2xhc3MgOyAgLy8gYSBzdHJpbmcgYXJndW1lbnQgZGVub3RpbmcgYSBzcGVjaWZpYyBKU1AuCi0JCXJlZ2lzdGVyTW9kZWwoR0VUX0ZJTEUsICJnZXRGaWxlIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCAiZ2V0RmlsZXMiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgc28gdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQgY2FuCi0JICogY2xlYW4gdXAgYW55IHJlc291cmNlcyBpdCBhbGxvY2F0ZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIHRoZSBjbGVhbnVwIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgc3VidGFzayBtZXNzYWdlcyBzaG91bGQgYmUgc2VudCB0byB0aGUgSVJlcG9ydGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gRGVmYXVsdDogbm90aGluZyB0byBjbGVhbiB1cAotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGNsb3NpbmcsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UgdGhvc2UKLQkgKiByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhCi0JICogbm8tb3AuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2luZygpIHsKLQkJY2xvc2luZyhnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGNsb3NpbmcsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UgdGhvc2UKLQkgKiByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhCi0JICogbm8tb3AuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgY2xvc2luZygpIGluc3RlYWQsIGFuZCB1c2UgZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2luZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UKLQkgKiB0aG9zZSByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZQotCSAqIGEgbm8tb3AuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoKSB7Ci0JCWRlbGV0aW5nKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgSVByb2plY3QgaXMgYmVpbmcgZGVsZXRlZCwgcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuIFdoZW4gdGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQsIGlmIHRoZSBoZWxwZXIgaGFzIGNhY2hlZCBhbnkgcmVzb3VyY2VzIGZyb20gdGhlIElQcm9qZWN0LCBpdCBzaG91bGQgcmVsZWFzZQotCSAqIHRob3NlIHJlc291cmNlcy4gSWYgeW91IGRvIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgaW4geW91ciBoZWxwZXIsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogYSBuby1vcC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBPdmVycmlkZSBkZWxldGluZygpIGluc3RlYWQsIGFuZCB1c2UgZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGF0aCBvZiBhIHJlc291cmNlLCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiBJZiB0aGUgSVJlc291cmNlIGlzIG5vdCBhIG1lbWJlcgotCSAqIG9mIHRoZSBjb250YWluZXIsIHJldHVybiBudWxsLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRvcnMgb2YgdGhpcyBjbGFzczsKLQkgKiBzcGVjaWZpY2FsbHksIGluIHRoZWlyIGdldFBvcnRhYmxlTmFtZSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKFN0cmluZyBmdWxsUGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChmdWxsUGF0aCA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHJlbFBhdGggPSBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgobmV3IFBhdGgoZnVsbFBhdGgpLCBjb250YWluZXIpOwotCQlpZiAocmVsUGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVBhdGggb2YgYSByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4gSWYgdGhlIElSZXNvdXJjZSBpcyBub3QgYSBtZW1iZXIKLQkgKiBvZiB0aGUgY29udGFpbmVyLCByZXR1cm4gbnVsbC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIG9mIHRoaXMgY2xhc3M7Ci0JICogc3BlY2lmaWNhbGx5LCBpbiB0aGVpciBnZXRQb3J0YWJsZU5hbWUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKElSZXNvdXJjZSByZXNvdXJjZSwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChyZXNvdXJjZSA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlSZXNvdXJjZSBmb3VuZFJlc291cmNlID0gbnVsbDsKLQkJSVBhdGggcmVsUGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBjb250YWluZXIpOwotCQlpZiAocmVsUGF0aCAhPSBudWxsKSB7Ci0JCQkvLyBpZiByZWxQYXRoIGlzIG51bGwsIHRoZSByZXNvdXJjZSBpcyBub3QgYSBkaXJlY3QgbWVtYmVyIG9mIHRoZSBjb250YWluZXIKLQkJCXRyeSB7Ci0JCQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgeyAvLyBmaW5kTWVtYmVyIHdvbid0IHdvcmsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWZvdW5kUmVzb3VyY2UgPSBjb250YWluZXIuZ2V0RmlsZShyZWxQYXRoKTsKLQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCWZvdW5kUmVzb3VyY2UgPSBjb250YWluZXIuZ2V0Rm9sZGVyKHJlbFBhdGgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm91bmRSZXNvdXJjZSA9IGNvbnRhaW5lci5maW5kTWVtYmVyKHJlbFBhdGgsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUKLQkJCQkJLy8gcGhhbnRvbSByZXNvdXJjZXMKLQkJCQkJaWYgKChmb3VuZFJlc291cmNlICE9IG51bGwpICYmICFmb3VuZFJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQlmb3VuZFJlc291cmNlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZm91bmRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm91bmRSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGZpbGUgaGFzIGJlZW4gZm91bmQKLQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZ0ZpcnN0U2VnbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElQYXRoLCBpZiB0aGUgSVBhdGggaXMgYWJzb2x1dGUsIGFuZCBpcyBhIHBhcnQgb2YgdGhlIElDb250YWluZXIsIHJldHVybiBhbiBJUGF0aAotCSAqIHdoaWNoIGlzIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuIElmIHRoZSBJUGF0aCBpcyBub3QgcGFydCBvZiB0aGUgSUNvbnRhaW5lciwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChwYXRoID09IG51bGwpIHx8IChjb250YWluZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkvLyBJcyB0aGUgcGF0aCBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyPwotCQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpKTsKLQkJCWlmICgobWF0Y2hpbmdGaXJzdFNlZ21lbnRzID4gMCkgJiYgKG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9PSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50Q291bnQoKSkpIHsKLQkJCQkvLyBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyCi0JCQkJcmV0dXJuIHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZ0ZpcnN0U2VnbWVudHMpOwotCQkJfQotCQkJLy8gbm90IHBhcnQgb2YgdGhlIElDb250YWluZXIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIHBhdGggaXMgcmVsYXRpdmUKLQkJLy8gSXMgdGhlIHBhdGggcGFydCBvZiB0aGUgSUNvbnRhaW5lcj8KLQkJLy9UT0RPIGRvbid0IGhhdmUgdGltZSB0byBpbXBsZW1lbnQgdGhpcyBub3csIGJ1dCBzaG91bGQgaW4gZnV0dXJlLiAtIFJ1dGgKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSU1lc3NhZ2UncyB0YXJnZXQgb2JqZWN0LCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgb2JqZWN0LCBzbyB0aGF0IHRoZQotCSAqIHVzZXIgY2FuIGxvY2F0ZSBpdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrYmVuY2hGaWxlRGVsdGEpIHsKLQkJCVdvcmtiZW5jaEZpbGVEZWx0YSB3ZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKSBvYmplY3Q7Ci0JCQlpZiAod2ZkLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIHdpbGwgYmUgbnVsbCBpZiBXb3JrYmVuY2hGaWxlRGVsdGEgd2FzIGNvbnN0cnVjdGVkIGZyb20gYW4gT2JqZWN0Ci0JCQkJLy8gaW5zdGVhZCBvZiBhbiBJUmVzb3VyY2UKLQkJCQlyZXR1cm4gd2ZkLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIE9iamVjdCwgaWYgdGhlIG9iamVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIElGaWxlIGluIHRoZSB3b3JrYmVuY2gsIHJldHVybiB0aGUgSUZpbGUuCi0JICogT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLiBJbiBlY2xpcHNlLCBpbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgdGFzawotCSAqIGxpc3QgZW50cnksIHRoZSBJUmVzb3VyY2UsIHRvIHdoaWNoIHRoZSBlbnRyeSBhcHBsaWVzLCBtdXN0IGJlIGlkZW50aWZpZWQuIFRoZSBJUmVwb3J0ZXIKLQkgKiBpbnRlcmZhY2UgcGFzc2VzIGluIGFuIE9iamVjdCBpbiB0aGVzZSBtZXRob2RzOgotCSAqIAotCSAqIGFkZFZhbGlkYXRpb25NZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSAvLyBPYmplY3QgaXMgYSBwYXJ0IG9mIElNZXNzYWdlCi0JICogCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSwKLQkgKiAKLQkgKiBUaHVzLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgbmVlZHMgdG8ga25vdyBob3csIGdpdmVuIHRoZSBPYmplY3QsIHdoaWNoIElGaWxlIHRoYXQgdGhlIE9iamVjdAotCSAqIHJlcHJlc2VudHMgaW4gdGhlIHdvcmtiZW5jaCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHRhc2sgbGlzdCBlbnRyeS4KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIFdvcmtiZW5jaFJlcG9ydGVyIHdpbGwgYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBJUHJvamVjdAotCSAqIGluc3RlYWQgb2YgYW4gSUZpbGUuCi0JICogIAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gcmVzb3VyY2UgbWF5IGJlIG51bGwgaWYgV29ya2JlbmNoRmlsZURlbHRhIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIE9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBhbiBJUmVzb3VyY2UKLQkJCXJlcyA9ICgoV29ya2JlbmNoRmlsZURlbHRhKSBvYmopLmdldFJlc291cmNlKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCX0KLQotCQlpZiAoKHJlcyA9PSBudWxsKSB8fCAoIXJlcy5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBnZXRGaWxlKG9iaik7Ci0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBJUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gRUpCTmF0dXJlUnVudGltZSwgcmV0dXJuIHRoZSBJSmF2YVByb2plY3Qgd2hpY2gKLQkgKiByZXByZXNlbnRzIGl0LgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotLy8JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJTWVzc2FnZSdzIHRhcmdldCBvYmplY3QsIHJldHVybiB0aGUgbGluZSBudW1iZXIsIG9mIHRoZSBJRmlsZSwgd2hpY2ggdGhlIHRhcmdldAotCSAqIG9iamVjdCByZXByZXNlbnRzLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90IHBvc3NpYmxlLAotCSAqIHJldHVybiAiMCIuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2VVdGlsIHV0aWwgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldFJlc291cmNlVXRpbCgpOwotCQlpZiAodXRpbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdXRpbC5nZXRMaW5lTm8ob2JqZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCwgcmV0dXJuIHRoZSBsaW5lIG51bWJlciwgb2YgdGhlIElGaWxlLCB3aGljaCB0aGUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlcHJlc2VudHMsIGlmIHBvc3NpYmxlLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90Ci0JICogcG9zc2libGUsIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZXRoZXIgb3Igbm90IHRoZSBJUmVzb3VyY2UgaXMgYW4gSUZpbGUsIElGb2xkZXIsIG9yIElQcm9qZWN0LgotCSAqIExpbmUgbnVtYmVycyBhcmUgdmFsaWQgb25seSBmb3IgSUZpbGUgdHlwZXM7IGlmIHRoZSByZXNvdXJjZSBpcyBub3QgYW4gSUZpbGUsIHRoZW4gYSB0ZXh0Ci0JICogZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uIG11c3QgYmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZiAoKHJlcyA9PSBudWxsKSB8fCAhKHJlcyBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCS8vIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24KLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbihvYmplY3QpOwotCQkvLyBkZWZhdWx0IHRvIGEgbGluZSBudW1iZXIsIGlmIGl0J3MgYXZhaWxhYmxlLiBFbHNlLCB1c2UgYSB0ZXh0IGRlc2NyaXB0aW9uLgotCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVObyhvYmplY3QpOwotCQlpZiAobGluZU51bWJlciA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbihvYmplY3QpOwotCQl9Ci0JCS8vIHJldHVybiB0aGUgbGluZSBudW1iZXIKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGxpbmVOdW1iZXIpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgbmFtZSBvZiBhIGxvYWQgbWV0aG9kLCBhbmQgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgaXQgdGFrZXMgKHRoaXMgbWV0aG9kIGlzIGFsd2F5cwotCSAqIGNhbGxlZCB3aXRoIG51bGwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIpLCByZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaAotCSAqIHJlcHJlc2VudHMgdGhlIGxvYWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJtVHlwZXMpIHsKLQkJTWV0aG9kIG0gPSBudWxsOwotCQl0cnkgewotCQkJbSA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQ29udGV4dC5nZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8gYmUgdmFsaWRhdGVkLiBFYWNoIElXb3JrYmVuY2hDb250ZXh0IGtub3dzIGhvdyB0bwotCSAqIHRyYXZlcnNlIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0LCBmb3IgZXhhbXBsZSwgYW4gRUpCIHByb2plY3Qgb3IgYSB3ZWIgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQkgIC8qKgotCSAgICogR2V0IHRoZSBJRmlsZSBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAgICogCi0JICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmV0cmlldmUuCi0JICAgKiBAcmV0dXJuIEFuIElGaWxlIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzcGVjaWZpZWQgb3IgbnVsbCBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZC4KLQkgICAqLwotCSAgcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVuYW1lKQotCSAgewotCSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgbmFtZSA9ICIgKyBmaWxlbmFtZSk7Ci0JICAgIElSZXNvdXJjZSByZXMgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihmaWxlbmFtZSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCSAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIAotCSAgICB7Ci0JICAgICAgcmV0dXJuIChJRmlsZSkgcmVzOwotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLQkgICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotCSAgICogCi0JICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0JICAgKiBAcmV0dXJuIFRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIHJlbGV2YW50IGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzIHNwZWNpZmllZC4KLQkgICAqLwotCSAgcHVibGljIENvbGxlY3Rpb248SUZpbGU+IGdldEZpbGVzKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0JICB7Ci0JICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JICAgIExpc3Q8SUZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKLQkgICAgZ2V0RmlsZXMoZmlsZXMsIHByb2plY3QsIHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JICAgIHJldHVybiBmaWxlczsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0JICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLQkgICAqIAotCSAgICogQHBhcmFtIGZpbGVzIFRoZSBmaWxlcyByZWxldmFudCBmb3IgdGhlIGNsYXNzIG5hbWUuCi0JICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGZpbGVzIGluLgotCSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBnZXRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBmaWxlcywgSUNvbnRhaW5lciByZXNvdXJjZSwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBJUmVzb3VyY2UgW10gcmVzb3VyY2VBcnJheSA9IHJlc291cmNlLm1lbWJlcnMoZmFsc2UpOwotCSAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKQotCSAgICAgIHsgICAgICAgCi0JICAgICAgICBpZiAoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNBcHBsaWNhYmxlVG8odmFsaWRhdG9yQ2xhc3NOYW1lLCByZXNvdXJjZUFycmF5W2ldKSkgCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldIGluc3RhbmNlb2YgSUZpbGUpIAotCQkJCSAgZmlsZXMuYWRkKChJRmlsZSlyZXNvdXJjZUFycmF5W2ldKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCSAgICAgICAgIGdldEZpbGVzKGZpbGVzLChJQ29udGFpbmVyKXJlc291cmNlQXJyYXlbaV0sIHZhbGlkYXRvckNsYXNzTmFtZSkgOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JICB9Ci0JICAKLQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotLy8JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIE5PX0NPTlRBSU5FUlM7Ci0vLwkJfQotLy8KLS8vCQlJSmF2YVByb2plY3QganAgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLS8vCQlpZiAoanAgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gTk9fQ09OVEFJTkVSUzsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhqcCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lcltdIGdldFByb2plY3RTb3VyY2VDb250YWluZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotLy8JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotLy8KLS8vCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCWNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cnVlIG1lYW5zIGlnbm9yZSB1bnJlc29sdmVkCi0vLwkJCS8vIChtaXNzaW5nKSB2YXJpYWJsZXMsIGluc3RlYWQgb2YKLS8vCQkJLy8gdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0vLwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotLy8JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLS8vCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLS8vCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0OjpnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhJSmF2YVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJLy8gVHJhdmVyc2UgdGhlIGNsYXNzcGF0aCwgYW5kIGNhbGN1bGF0ZSBhIGxpc3Qgb2YganVzdCB0aGUKLS8vCQkvLyBJRm9sZGVycyBhbmQgSVByb2plY3RzIChpLmUuLCBJQ29udGFpbmVycykgd2hpY2ggY29udGFpbiBzb3VyY2UKLS8vCQlJQ29udGFpbmVyW10gaWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lcltjbGFzc3BhdGgubGVuZ3RoXTsKLS8vCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLS8vCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotLy8JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLS8vCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLS8vCQkJCUlQYXRoIHJlbEVudHJ5UGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChlbnRyeVBhdGgsIHByb2plY3QpOwotLy8JCQkJaWYgKHJlbEVudHJ5UGF0aCA9PSBudWxsKSB7Ci0vLwkJCQkJLy8gY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byBzb21ldGhpbmcgd2hpY2ggZG9lc24ndCBleGlzdAotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCUlSZXNvdXJjZSBvdXRwdXRSZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZWxFbnRyeVBhdGgpOwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlID09IG51bGwpIHsKLS8vCQkJCQkvLyBjbGFzc3BhdGggZW50cnkgcmVmZXJzIHRvIHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGV4aXN0Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotLy8JCQkJCWljb250YWluZXJzW3ZhbGlkQ291bnQrK10gPSAoSUNvbnRhaW5lcikgb3V0cHV0UmVzb3VyY2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vICBmb2xsb3dpbmcgbGluZSBjYXVzZXMgYSBDbGFzc0Nhc3RFeGNlcHRpb24sIHNvIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBJQ29udGFpbmVycwotLy8JCS8vIGV4cGxpY2l0bHkKLS8vCQkvLwlyZXR1cm4gKElDb250YWluZXJbXSlpY29udGFpbmVycy50b0FycmF5KCk7Ci0vLwkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50XTsKLS8vCQlTeXN0ZW0uYXJyYXljb3B5KGljb250YWluZXJzLCAwLCBjb250YWluZXJzLCAwLCB2YWxpZENvdW50KTsKLS8vCQlyZXR1cm4gY29udGFpbmVyczsKLS8vCX0KLQotCXB1YmxpYyBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGVuIGJ5IEFXb3JrYmVuY2hIZWxwZXJzLCBpZiB0aGV5IHdpc2ggdG8gcGVyZm9ybSBzb21lCi0JICogaW5pdGlhbGl6YXRpb24gb25jZSB0aGUgSVByb2plY3QgaXMgc2V0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHRvIGFub3RoZXIgSVdvcmtiZW5jaENvbnRleHQsIHRoZW4gdGhhdAotCSAqIElXb3JrYmVuY2hDb250ZXh0J3Mgc2V0UHJvamVjdCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGluIGFuIElKYXZhUHJvamVjdCwgYW5kIGlmIGl0IGlzIGluIG9uZSBvZiB0aGUgc291cmNlCi0JICogZm9sZGVycyBpbiB0aGUgSUphdmFQcm9qZWN0LiBJZiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgaGFwcGVucyB0byBiZSB0aGUgcHJvamVjdCdzCi0JICogb3V0cHV0IGZvbGRlciB0b28sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuIElmIHJlcyBpcyBudWxsLCBvciBpcyBub3QgZm91bmQgaW4gb25lIG9mCi0JICogdGhlIHNvdXJjZSBjb250YWluZXJzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZS4KLQkgKi8KLS8vCXB1YmxpYyBib29sZWFuIGlzSW5KYXZhU291cmNlUGF0aChJUmVzb3VyY2UgcmVzKSB7Ci0vLwkJaWYgKHJlcyA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCUlDb250YWluZXJbXSBjb250YWluZXJzID0gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMocmVzLmdldFByb2plY3QoKSk7Ci0vLwkJZm9yIChpbnQgYyA9IDA7IGMgPCBjb250YWluZXJzLmxlbmd0aDsgYysrKSB7Ci0vLwkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChyZXMsIGNvbnRhaW5lcnNbY10pOwotLy8JCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwpIHsKLS8vCQkJCS8vIGZpbGUgaGFzIGJlZW4gZm91bmQKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCBhbmQgY2FuIGJlIGxvYWRlZCBieSBXb3JrYmVuY2hDb250ZXh0J3MKLQkgKiAibG9hZE1vZGVsIiBtZXRob2QuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWUgdGhlIGNvbW1lbnQgYWJvdmUgV29ya2JlbmNoQ29udGV4dCdzCi0JICogInJlZ2lzdGVyTW9kZWwiIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlpZiAoc3ltYm9saWNOYW1lID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gX21vZGVsUmVnaXN0cnkuY29udGFpbnNLZXkoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN5bWJvbGljIG5hbWUsIGxvYWQgdGhlIE1PRiBtb2RlbCB3aGljaCBpcyBpZGVudGlmaWVkIGJ5IHRoYXQgbmFtZS4KLQkgKiAKLQkgKiBGb3Igc3VwcG9ydCBvZiBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoIGFzIGZpbGUgbmFtZXMsIHJlYWQgdGhlIGNvbW1lbnQgYWJvdmUgdGhlCi0JICogcmVnaXN0ZXJNb2RlbCBtZXRob2QuCi0JICogCi0JICogQHNlZSByZWdpc3Rlck1vZGVsCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gbG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzeW1ib2xpYyBuYW1lLCBsb2FkIHRoZSBNT0YgbW9kZWwgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGF0IG5hbWUuCi0JICogCi0JICogRm9yIHN1cHBvcnQgb2YgZHluYW1pYyBzeW1ib2xpYyBuYW1lcywgc3VjaCBhcyBmaWxlIG5hbWVzLCByZWFkIHRoZSBjb21tZW50IGFib3ZlIHRoZQotCSAqIHJlZ2lzdGVyTW9kZWwgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgcmVnaXN0ZXJNb2RlbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbG9hZGVyID0gX21vZGVsUmVnaXN0cnkuZ2V0KHN5bWJvbGljTmFtZSk7Ci0JCQlpZiAobG9hZGVyID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiBsb2FkZXIuaW52b2tlKHRoaXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRSdWxlR3JvdXAoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihnZXRSdWxlR3JvdXAoKSk7IC8vIGhhdmUgdG8gd3JhcCB0aGUgaW50IGluIGFuIEludGVnZXIgYmVjYXVzZSBjYW4ndCBjYXN0Ci0JCS8vIGFuIGludCB0byBhbiBPYmplY3QKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYnkKLQkgKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWZvcmUgdGhlIElWYWxpZGF0b3IncyB2YWxpZGF0ZSBtZXRob2QgaXMgY2FsbGVkLCB0byBzZXQgdGhlIGdyb3VwIG9mCi0JICogcnVsZXMgd2hpY2ggdGhlIElWYWxpZGF0b3Igc2hvdWxkIGNoZWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bGVHcm91cChpbnQgcmcpIHsKLQkJX3J1bGVHcm91cCA9IHJnOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZCBtZXRob2QgZm9yIGEgc3ltYm9saWMgbmFtZS4gQSBsb2FkIG1ldGhvZCBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHdoaWNoIHRha2VzCi0JICogbm8gcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIFJlZk9iamVjdC4KLQkgKiAKLQkgKiBFdmVyeSBzdWJjbGFzcyBvZiBXb3JrYmVuY2hDb250ZXh0LCBmb3IgZXZlcnkgc3RhdGljIHR5cGUgb2Ygc3ltYm9saWMgbmFtZSB3aGljaCBpdCBzdXBwb3J0cywKLQkgKiBzaG91bGQgY2FsbCByZWdpc3Rlck1vZGVsLiBGb3IgSVdvcmtiZW5jaEhlbHBlcnMgd2hpY2ggc3VwcG9ydCBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoCi0JICogYXMgZmlsZSBuYW1lcywgZWFjaCBJV29ya2JlbmNoQ29udGV4dCBzaG91bGQgb3ZlcnJpZGUgdGhlICJsb2FkTW9kZWwiIG1ldGhvZC4gVGhlaXIKLQkgKiAibG9hZE1vZGVsIiBzaG91bGQgZmlyc3QgY2FsbCB0aGlzIGNsYXNzJyAiaXNSZWdpc3RlcmVkIiBtZXRob2QgdG8gc2VlIGlmIHRoZXkncmUgZGVhbGluZwotCSAqIHdpdGggYSBzdGF0aWMgc3ltYm9saWMgbmFtZSwgb3IgYSBkeW5hbWljIG9uZS4gSWYgdGhlIHN5bWJvbGljIG5hbWUgaXMgcmVnaXN0ZXJlZCwgdGhlCi0JICogY2hpbGQncyAibG9hZE1vZGVsIiBtZXRob2Qgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgV29ya2JlbmNoQ29udGV4dCdzICJsb2FkTW9kZWwiCi0JICogbWV0aG9kLiBPdGhlcndpc2UsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlc3VsdCBiYXNlZCBvbiBpdHMgb3duIHByb2Nlc3NpbmcuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBsb2FkIG1ldGhvZCBpZGVudGlmaWVkIGJ5IGxvYWRNZXRob2ROYW1lIGlzIGxvY2F0ZWQgJiBzdG9yZWQKLQkgKiBmb3IgZnV0dXJlIHJldHJpZXZhbCBieSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBXaGVuIHRoZSBJVmFsaWRhdG9yIGNhbGxzICJsb2FkTW9kZWwiIHdpdGggYQotCSAqIHN5bWJvbGljIG5hbWUsIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2ggd2FzIGxvYWRlZCBieSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBhbmQKLQkgKiB0aGUgcmVzdWx0IChSZWZPYmplY3QpIHJldHVybmVkIGJ5IHRoYXQgbWV0aG9kIGlzIHJldHVybmVkIGJ5ICJsb2FkTW9kZWwiLgotCSAqIAotCSAqIHN5bWJvbGljTmFtZSBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcuIGxvYWRNZXRob2ROYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlCi0JICogZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZ2lzdGVyTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIGxvYWRNZXRob2ROYW1lKSB7Ci0JCXJlZ2lzdGVyTW9kZWwoc3ltYm9saWNOYW1lLCBsb2FkTWV0aG9kTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBsb2FkIG1ldGhvZCBmb3IgYSBzeW1ib2xpYyBuYW1lLiBBIGxvYWQgbWV0aG9kIGlzIGRlZmluZWQgYXMgYSBtZXRob2Qgd2hpY2ggdGFrZXMKLQkgKiBubyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgUmVmT2JqZWN0LgotCSAqIAotCSAqIEV2ZXJ5IHN1YmNsYXNzIG9mIFdvcmtiZW5jaENvbnRleHQsIGZvciBldmVyeSBzdGF0aWMgdHlwZSBvZiBzeW1ib2xpYyBuYW1lIHdoaWNoIGl0IHN1cHBvcnRzLAotCSAqIHNob3VsZCBjYWxsIHJlZ2lzdGVyTW9kZWwuIEZvciBJV29ya2JlbmNoSGVscGVycyB3aGljaCBzdXBwb3J0IGR5bmFtaWMgc3ltYm9saWMgbmFtZXMsIHN1Y2gKLQkgKiBhcyBmaWxlIG5hbWVzLCBlYWNoIElXb3JrYmVuY2hDb250ZXh0IHNob3VsZCBvdmVycmlkZSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBUaGVpcgotCSAqICJsb2FkTW9kZWwiIHNob3VsZCBmaXJzdCBjYWxsIHRoaXMgY2xhc3MnICJpc1JlZ2lzdGVyZWQiIG1ldGhvZCB0byBzZWUgaWYgdGhleSdyZSBkZWFsaW5nCi0JICogd2l0aCBhIHN0YXRpYyBzeW1ib2xpYyBuYW1lLCBvciBhIGR5bmFtaWMgb25lLiBJZiB0aGUgc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCB0aGUKLQkgKiBjaGlsZCdzICJsb2FkTW9kZWwiIG1ldGhvZCBzaG91bGQganVzdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBXb3JrYmVuY2hDb250ZXh0J3MgImxvYWRNb2RlbCIKLQkgKiBtZXRob2QuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IGJhc2VkIG9uIGl0cyBvd24gcHJvY2Vzc2luZy4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGxvYWQgbWV0aG9kIGlkZW50aWZpZWQgYnkgbG9hZE1ldGhvZE5hbWUgaXMgbG9jYXRlZCAmIHN0b3JlZAotCSAqIGZvciBmdXR1cmUgcmV0cmlldmFsIGJ5IHRoZSAibG9hZE1vZGVsIiBtZXRob2QuIFdoZW4gdGhlIElWYWxpZGF0b3IgY2FsbHMgImxvYWRNb2RlbCIgd2l0aCBhCi0JICogc3ltYm9saWMgbmFtZSwgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaCB3YXMgbG9hZGVkIGJ5IHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIGFuZAotCSAqIHRoZSByZXN1bHQgKFJlZk9iamVjdCkgcmV0dXJuZWQgYnkgdGhhdCBtZXRob2QgaXMgcmV0dXJuZWQgYnkgImxvYWRNb2RlbCIuCi0JICogCi0JICogc3ltYm9saWNOYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZy4gbG9hZE1ldGhvZE5hbWUgbXVzdCBub3QgYmUgbnVsbCBvciB0aGUKLQkgKiBlbXB0eSBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVnaXN0ZXJNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgbG9hZE1ldGhvZE5hbWUsIENsYXNzW10gcGFybXMpIHsKLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChsb2FkTWV0aG9kTmFtZSwgcGFybXMpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkxvYWQgbWV0aG9kICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsb2FkTWV0aG9kTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IChwYXJtcyAhPSBudWxsKSAmJiAoaSA8IHBhcm1zLmxlbmd0aCk7IGkrKykgewotCQkJCQlidWZmZXIuYXBwZW5kKHBhcm1zW2ldKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSBtdXN0IGV4aXN0LiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbm5vdCBzdXBwb3J0IG1vZGVsICIgKyBzeW1ib2xpY05hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCVRyYWNpbmcubG9nKGJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlfbW9kZWxSZWdpc3RyeS5wdXQoc3ltYm9saWNOYW1lLCBtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciBmdWxsIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgcnVubmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGZvciBldmVyeQotCSAqIElSZXNvdXJjZSB3aGljaCBpcyBmaWx0ZXJlZCBpbiBieSB0aGUgSVZhbGlkYXRvciwgc28gdGhhdCB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGNhbiByZWNlaXZlCi0JICogbm90aWZpY2F0aW9uIHRoYXQgb25lIG9mIHRoZSByZXNvdXJjZXMsIHdoaWNoIHZhbGlkYXRpb24gd2lsbCBydW4gb24sIGlzIGJlaW5nIGZpbHRlcmVkIGluLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIGRlZmF1bHQ6IGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLCB0byBpbml0aWFsaXplIHRoZSBJV29ya2JlbmNoQ29udGV4dCBzbyB0aGF0Ci0JICogaXQgY2FuIGdhdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogCi0JICogSWYgYW4gSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHNvbWUgbW9kZWwgbG9hZGluZyB0byBhbm90aGVyIElXb3JrYmVuY2hDb250ZXh0LCB0aGlzIG1ldGhvZAotCSAqIHNob3VsZCBiZSBvdmVycmlkZW4gc28gdGhhdCB0aGUgZGVsZWdhdGVlIElXb3JrYmVuY2hDb250ZXh0IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJLy8gUHJvamVjdCB3aWxsIGJlIHNldCBiYWNrIHRvIG51bGwgb25jZSB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCBpcyBjb21wbGV0ZS4KLQkJCWluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgdGhhdCB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4gVGhlcmUgd2lsbCBiZQotCSAqIGNhbGxzIHRvIGNsb3NpbmcoSVByb2plY3QpIGFuZCBwb3NzaWJseSBkZWxldGluZyhJUHJvamVjdCkgZm9sbG93aW5nIHRoaXMgY2FsbCwgYnV0IHRoZQotCSAqIHJlc291cmNlcyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQgYnkgdGhlIHRpbWUgdGhhdCB0aG9zZSBtZXRob2RzIGFyZSBjYWxsZWQsIHNvIEVWRVJZVEhJTkcKLQkgKiBzaG91bGQgYmUgY2xlYW5lZCB1cCBpbiB0aGlzIG1ldGhvZC4gVGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgdGhlIHByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8KLQkgKiBzaHV0IGRvd24uIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IElQcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIFRoZSBJUHJvamVjdAotCSAqIG1heSwgb3IgbWF5IG5vdCwgYmUgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQkvLyBEZWZhdWx0IGlzIHRvIGFzc3VtZSB0aGF0IG5vIHJlc291cmNlcyB3ZXJlIGFsbG9jYXRlZDsgdGhlcmVmb3JlLAotCQkvLyBubyBjbGVhbnVwIG5lZWRzIHRvIGJlIGRvbmUuCi0JCXNodXRkb3duKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBJV29ya2JlbmNoQ29udGV4dCB0aGF0IHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLiBUaGVyZSB3aWxsIGJlCi0JICogY2FsbHMgdG8gY2xvc2luZyhJUHJvamVjdCkgYW5kIHBvc3NpYmx5IGRlbGV0aW5nKElQcm9qZWN0KSBmb2xsb3dpbmcgdGhpcyBjYWxsLCBidXQgdGhlCi0JICogcmVzb3VyY2VzIG1heSBhbHJlYWR5IGJlIGNsb3NlZCBieSB0aGUgdGltZSB0aGF0IHRob3NlIG1ldGhvZHMgYXJlIGNhbGxlZCwgc28gRVZFUllUSElORwotCSAqIHNob3VsZCBiZSBjbGVhbmVkIHVwIGluIHRoaXMgbWV0aG9kLiBUaGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyB0aGUgcHJvamVjdCB3aGljaCBpcyBhYm91dCB0bwotCSAqIHNodXQgZG93bi4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZXZlcnkgSVByb2plY3QgaW4gdGhlIHdvcmtiZW5jaC4gVGhlIElQcm9qZWN0Ci0JICogbWF5LCBvciBtYXkgbm90LCBiZSBjbG9zZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgc2h1dGRvd24oKSBpbnN0ZWFkLCBhbmQgdXNlIGdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gRGVmYXVsdCBpcyB0byBhc3N1bWUgdGhhdCBubyByZXNvdXJjZXMgd2VyZSBhbGxvY2F0ZWQ7IHRoZXJlZm9yZSwKLQkJLy8gbm8gY2xlYW51cCBuZWVkcyB0byBiZSBkb25lLgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQlTdHJpbmdbXSB1cmlzID0gbmV3IFN0cmluZ1t2YWxpZGF0aW9uRmlsZVVSSXMuc2l6ZSgpXTsKLQkJdmFsaWRhdGlvbkZpbGVVUklzLnRvQXJyYXkodXJpcyk7Ci0JCXJldHVybiB1cmlzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRhdGlvbkZpbGVVUklzLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRhdGlvbkZpbGVVUklzKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvbkZpbGVVUklzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZGF0aW9uRmlsZVVSSXMgVGhlIHZhbGlkYXRpb25GaWxlVVJJcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkZpbGVVUklzKExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRmlsZVVSSXMpIHsKLQkJdGhpcy52YWxpZGF0aW9uRmlsZVVSSXMgPSB2YWxpZGF0aW9uRmlsZVVSSXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUzZTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hGaWxlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotCi0KLS8qKgotICogRWNsaXBzZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBGaWxlRGVsdGEgd2hpY2ggYWxzbyBjYWNoZXMgdGhlIElSZXNvdXJjZSB3aGljaCBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZSBGaWxlRGVsdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hGaWxlRGVsdGEgZXh0ZW5kcyBGaWxlRGVsdGEgewotCXByaXZhdGUgSVJlc291cmNlIF9yZXNvdXJjZTsKLQlwcml2YXRlIE9iamVjdCBfY2hhbmdlZFJlc291cmNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJGSUxFIE5BTUU6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQSA9ICIgIERFTFRBOiAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFID0gIiAgUkVTT1VSQ0U6ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIiAgT0JKRUNUOiAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgV29ya2JlbmNoRmlsZURlbHRhKFN0cmluZyBhRmlsZU5hbWUsIGludCBhRmlsZURlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIoYUZpbGVOYW1lLCBhRmlsZURlbHRhKTsKLQkJc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlzZXRPYmplY3QocmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBXb3JrYmVuY2hGaWxlRGVsdGEoT2JqZWN0IGNoYW5nZWRSZXNvdXJjZSkgewotCQlzdXBlcihudWxsLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQlzZXRPYmplY3QoY2hhbmdlZFJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY2hhbmdlZCByZXNvdXJjZSBpcyBub3QgYW4gSVJlc291cmNlIChlLmcuLCBhIFJlZk9iamVjdCksIHRoZW4gdGhlIGdldEZpbGVOYW1lIG1ldGhvZAotCSAqIHdpbGwgcmV0dXJuIG51bGwsIGdldFJlc291cmNlIHdpbGwgcmV0dXJuIG51bGwsIGFuZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgb2JqZWN0LiBJZgotCSAqIHRoZSBjaGFuZ2VkUmVzb3VyY2UgaXMgYW4gSVJlc291cmNlLCB0aGVuIGJvdGggdGhpcyBtZXRob2QgYW5kIHRoZSBnZXRSZXNvdXJjZSBtZXRob2Qgd2lsbAotCSAqIHJldHVybiB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBfY2hhbmdlZFJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG8pIHsKLQkJX2NoYW5nZWRSZXNvdXJjZSA9IG87Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoRklMRV9OQU1FKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRGaWxlTmFtZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoREVMVEEpOwotCQlidWZmZXIuYXBwZW5kKGdldERlbHRhVHlwZSgpKTsKLQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0UmVzb3VyY2UoKSkpOwotCQlidWZmZXIuYXBwZW5kKE9CSkVDVCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0T2JqZWN0KCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hSZXBvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGY1MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIElWYWxpZGF0b3IgaW5zdGFuY2VzIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBidXQgc2hvdWxkIG5ldmVyIGNhc3QgdGhhdAotICogSVJlcG9ydGVyIGluc3RhbmNlIHRvIFdvcmtiZW5jaFJlcG9ydGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdXNlciBhbmQgdGhlIElWYWxpZGF0b3IgaW4gdGhlIGVjbGlwc2Ugd29ya2JlbmNoCi0gKiBlbnZpcm9ubWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBNYW55Ci0gKiByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgotICogPHA+Ci0gKiBPbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtYXkgaW5zdGFudGlhdGUgb3IgYWx0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gKi8KLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NRVNTQUdFX0xJTUlUID0gLTE7Ci0KLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfbW9uaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgbWVzc2FnZU93bmVyLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIG1lc3NhZ2VPd25lciwgbnVsbCwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgbWVzc2FnZU93bmVyLCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBtZXNzYWdlT3duZXIsIGNsLCBtZXNzYWdlLCBudWxsLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwgCi0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJYWRkTWVzc2FnZShyZXNvdXJjZSwgY2xhenosIG51bGwsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwgCi0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24sU3RyaW5nIG1hcmtlcklkKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGNsYXp6LCBudWxsLCBtZXNzYWdlLCB0YXJnZXRPYmplY3ROYW1lLCBsb2NhdGlvbixtYXJrZXJJZCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgY2xhenosIENsYXNzTG9hZGVyIGNsLCBJTWVzc2FnZSBtZXNzYWdlLCAKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSlyZXR1cm47Ci0KLQkJaWYgKGNsID09IG51bGwpY2wgPSBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOwotCi0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGdldFVuaXF1ZUlkKGNsYXp6KSwgY2wsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgQ2xhc3NMb2FkZXIgY2wsIElNZXNzYWdlIG1lc3NhZ2UsIAotCQlTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWFya2VySWQpIHsKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpcmV0dXJuOwotCi0JCWlmIChjbCA9PSBudWxsKWNsID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKLQotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBnZXRVbmlxdWVJZChjbGF6eiksIGNsLCBtZXNzYWdlLCB0YXJnZXRPYmplY3ROYW1lLCBsb2NhdGlvbiwgbWFya2VySWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBtZXNzYWdlT3duZXJJZCwgY2wsIG1lc3NhZ2UsIG51bGwsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBDbGFzc0xvYWRlciBjbCwgCi0JCUlNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJaW50IHNldmVyaXR5ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2sobWVzc2FnZU93bmVySWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZS5nZXRJZCgpLCAKLQkJCQltZXNzYWdlLmdldFRleHQoY2wpLCBzZXZlcml0eSx0YXJnZXRPYmplY3ROYW1lLCBtZXNzYWdlLmdldEdyb3VwTmFtZSgpLCAKLQkJCQltZXNzYWdlLmdldE9mZnNldCgpLCBtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXJJZCwgQ2xhc3NMb2FkZXIgY2wsIAotCQlJTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWFya2VySWQpIHsKLQkJaW50IHNldmVyaXR5ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2sobWVzc2FnZU93bmVySWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZS5nZXRJZCgpLCAKLQkJCQltZXNzYWdlLmdldFRleHQoY2wpLCBzZXZlcml0eSxtYXJrZXJJZCx0YXJnZXRPYmplY3ROYW1lLCBtZXNzYWdlLmdldEdyb3VwTmFtZSgpLCAKLQkJCQltZXNzYWdlLmdldE9mZnNldCgpLCBtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVJlc291cmNlIHJlc291cmNlLCBJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbClyZXR1cm47Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJLy8gbG9nCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcyA9IHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24KLQkgKiAgICAgICAgICAgICBmcmFtZXdvcmsuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElSZXNvdXJjZSByZXNvdXJjZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCS8vIGxvZwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJdHJ5IHsKLQkJCS8vU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgb2JqZWN0KTsKLQkJCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gZ2V0VGFyZ2V0T2JqZWN0TmFtZSggZ2V0SGVscGVyKCByZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZhbGlkYXRvciksIG9iamVjdCk7CQkJCi0JCQlyZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMsIHRhcmdldE9iamVjdE5hbWUpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSkgewotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcywgdGFyZ2V0T2JqZWN0TmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIG1lc3NhZ2VPd25lciwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtnZXRVbmlxdWVJZChtZXNzYWdlT3duZXIpfSwgbnVsbCwgZ3JvdXBOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXJJZCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXttZXNzYWdlT3duZXJJZH0sIG51bGwsIGdyb3VwTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcklkLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVySWQsIHRhcmdldE9iamVjdE5hbWUsIGdyb3VwTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIENsYXNzIGluc3RhbmNlLCByZXR1cm4gdGhlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGluc3RhbmNlLiAoVXNlZCBhcyB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhlIG1lc3NhZ2Ugb3duZXIuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEl0IGlzIHNhZmUgdG8gbG9hZCB0aGlzIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UgYmVjYXVzZQotCQkvLyB0aGUgQ2xhc3MgbmFtZSB3aWxsIG5vdCBjaGFuZ2UgZHVyaW5nIFdTQUQncyBzZXNzaW9uLgotCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpLmludGVybigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFVuaXF1ZUlkKHZhbGlkYXRvci5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvbihJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uVGV4dChoZWxwZXIsIG51bGwpOwotCQl9Ci0JCWludCBsaW5lTm8gPSBtZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQkJaWYgKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvblRleHQoaGVscGVyLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YobGluZU5vKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvblRleHQoSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsb2NhdGlvbiA9IGhlbHBlci5nZXRMb2NhdGlvbih0YXJnZXRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKChsb2NhdGlvbiA9PSBudWxsKSB8fCAobG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2F0aW9uID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcm90ZWN0ZWQgZm9yIHRoZSBTYWJlclJlcG9ydGVyLiBNYWtlIHRoaXMgbWV0aG9kIHByaXZhdGUgYWdhaW4KLQkvLyBvbmNlIHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMgSU1hcmtlci5QUklPUklUWS4KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG51bGwpOwotCQl9Ci0JCXJldHVybiBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRhcmdldE9iamVjdE5hbWUgPSBoZWxwZXIuZ2V0VGFyZ2V0T2JqZWN0TmFtZSh0YXJnZXRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldE9iamVjdE5hbWU7Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSAicHJvdGVjdGVkIiBmb3IgdGhlIFNhYmVyUmVwb3J0ZXIuIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kISBUaGlzCi0JLy8gbWV0aG9kIHdpbGwgYmUgbWFkZSBwcml2YXRlIG9uY2Ugc3VwcG9ydCBmb3IgbWFya2VyIFBSSU9SSVRZIGF0dHJpYnV0ZXMgaXMgaW4gdGhlIGZyYW1ld29yay4KLQlwcm90ZWN0ZWQgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZNRChJVmFsaWRhdG9yIHZhbGlkYXRvcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gYWxyZWFkeSBsb2dnZWQgaW4gdGhlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcgotCQl9Ci0JCXJldHVybiB2bWQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQuIFRoZSBJVmFsaWRhdGlvbkNvbnRleHQgd2lsbCBiZSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hSZXBvcnRlcihJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEFuIElSZXBvcnRlciBpbnN0YW5jZSBtdXN0IGV4aXN0IGZvciBlYWNoIFJ1bm5hYmxlIGluIG9yZGVyIGZvciB0aGUgdmFsaWRhdG9yIHRvIHJlcG9ydAotCSAqIHN0YXR1cyBtZXNzYWdlcy4gSVByb2plY3QgYW5kIElQcm9ncmVzc01vbml0b3IgbXVzdCBub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoUmVwb3J0ZXIoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX21vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8vIFRPRE8gVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHJvdGVjdGVkIGZvciB0aGUgU2FiZXJSZXBvcnRlci4gTWFrZSBpdCBwcml2YXRlIGFnYWluIG9uY2UgdGhlCi0JLy8gZnJhbWV3b3JrIHN1cHBvcnQgSU1hcmtlci5QUklPUklUWS4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIoIGdldFByb2plY3QoKSwgdmFsaWRhdG9yICk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKElQcm9qZWN0IHByb2plY3QsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIoIHByb2plY3QsIHZhbGlkYXRvciApOwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIF9tb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0RGVmYXVsdFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcHJqID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJqICE9IG51bGwpIHsKLQkJCXJldHVybiBwcmo7Ci0JCX0KLQkJLy8gcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElNZXNzYWdlIGlzIGNyZWF0ZWQsIHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIG9mIGNyZWF0aW5nIGl0IHdpdGggYSB0YXJnZXQgb2JqZWN0LgotCSAqIFRoYXQgdGFyZ2V0IG9iamVjdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIG9iamVjdCBoYXMgdGhlIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGUKLQkgKiBJTWVzc2FnZS4gVGhpcyBtZXRob2QsIGdpdmVuIHRoZSB0YXJnZXQgb2JqZWN0LCByZXR1cm5zIHRoZSBJUmVzb3VyY2Ugd2hpY2ggcmVwcmVzZW50cyB0aGF0Ci0JICogb2JqZWN0IGluIHRoZSB3b3JrYmVuY2guCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRNZXNzYWdlUmVzb3VyY2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqZWN0OwotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrYmVuY2hGaWxlRGVsdGEpIHsKLQkJCQkvLyByZXNvdXJjZSBtYXkgYmUgbnVsbCBpZiB0aGUgV29ya2JlbmNoRmlsZURlbHRhIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIE9iamVjdAotCQkJCS8vIGluc3RlYWQgb2YgYW4gSVJlc291cmNlCi0JCQkJcmVzb3VyY2UgPSAoKFdvcmtiZW5jaEZpbGVEZWx0YSkgb2JqZWN0KS5nZXRSZXNvdXJjZSgpOwotCQkJfQotCi0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IGdldEhlbHBlcih2YWxpZGF0b3IpOwotCQkJCQlyZXNvdXJjZSA9IGhlbHBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0cnkgewotCQkJCQkJLy8gVW5saWtlbHkgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24sIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMKLQkJCQkJCS8vIGludm9rZWQgYnkgdGhlIHZhbGlkYXRvciwgYW5kIGlmIHRoZSB2YWxpZGF0b3IgaXMgaW52b2tlZCwgaXQncyBsaWtlbHkKLQkJCQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vLgotCQkJCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0KLQkJCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0KLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIEV2ZW4gdGhlIElWYWxpZGF0b3IgaXMgaW52YWxpZC4gVW5mb3J0dW5hdGVseSwgY2FuJ3QgZGlzYWJsZSB0aGUKLQkJCQkJCS8vIHZhbGlkYXRvciBiZWNhdXNlIGl0IGNhbid0IGJlIGZvdW5kIGJ5IHRoZSByZWdpc3RyeSByZWFkZXIuCi0JCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZTIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gRXZlbiB0aGUgSVZhbGlkYXRvciBpcyBpbnZhbGlkLiBVbmZvcnR1bmF0ZWx5LCBjYW4ndCBkaXNhYmxlIHRoZQotCQkJCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBnZXREZWZhdWx0UmVzb3VyY2UoKTsKLQkJfQotCi0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0RGVmYXVsdFJlc291cmNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2hvdyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW5kaWNhdGluZyB3aGljaCBzdWJ0YXNrIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+bWVzc2FnZTwvY29kZT4gbWF5IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4gPGJyPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAobWVzc2FnZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNpc0NhbmNlbGxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCWlmIChnZXRQcm9ncmVzc01vbml0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjYWRkTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSAgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXNzYWdlUmVzb3VyY2UodmFsaWRhdG9yLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gbnVsbDsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSBnZXRIZWxwZXIodmFsaWRhdG9yKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vCi0JCQkJCQkJCQotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMyKSB7Ci0JCQkJbG9nRGlzYWJsZWRWYWxpZGF0b3IoZXhjMik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQlsb2dEaXNhYmxlZFZhbGlkYXRvcihleGMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCQlSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVkFMSURfUkVTT1VSQ0UpLCAKLQkJCQkJbmV3IE9iamVjdFtde21lc3NhZ2UuZ2V0VGV4dCgpLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSl9KTsKLQkJCQlUcmFjaW5nLmxvZyhyZXN1bHQpOwkJCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiggdmFsaWRhdG9yIGluc3RhbmNlb2YgSVZhbGlkYXRvckpvYiApewotCQkJY2FjaGVNZXNzYWdlKCAoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IsIHJlc291cmNlLCB2YWxpZGF0b3IuZ2V0Q2xhc3MoKSwgbWVzc2FnZSwgCi0JCQkJZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG1lc3NhZ2UpLCBnZXRMb2NhdGlvbihoZWxwZXIsIG1lc3NhZ2UpLCBnZXRNYXJrZXJJZCh2bWQsIG1lc3NhZ2UpICk7Ci0JCX1lbHNlCi0JCQlhZGRNZXNzYWdlKHJlc291cmNlLCB2YWxpZGF0b3IuZ2V0Q2xhc3MoKSwgbWVzc2FnZSwgZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG1lc3NhZ2UpLCAKLQkJCQlnZXRMb2NhdGlvbihoZWxwZXIsIG1lc3NhZ2UpLGdldE1hcmtlcklkKHZtZCxtZXNzYWdlKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFya2VySWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmICh2bWQuZ2V0TWFya2VySWRzKCkgIT0gbnVsbCkgewotCQkJaWYgKHZtZC5nZXRNYXJrZXJJZHMoKS5sZW5ndGggPT0gMSkKLQkJCQlyZXR1cm4gdm1kLmdldE1hcmtlcklkcygpWzBdOwotCQkJZWxzZSBpZiAodm1kLmdldE1hcmtlcklkcygpLmxlbmd0aCA+IDEpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZU1hcmtlcklkID0gbWVzc2FnZS5nZXRNYXJrZXJJZCgpOwotCQkJCWlmIChtZXNzYWdlTWFya2VySWQgIT0gbnVsbCAmJiBtZXNzYWdlTWFya2VySWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCVN0cmluZyBmaXJzdE1hcmtlcklkID0gdm1kLmdldE1hcmtlcklkcygpWzBdOwotCQkJCQlTdHJpbmcgcGx1Z2luUXVhbGlmaWVyID0gZmlyc3RNYXJrZXJJZC5zdWJzdHJpbmcoMCwgZmlyc3RNYXJrZXJJZC5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTWVzc2FnZU1hcmtlcklkID0gbnVsbDsKLQkJCQkJaWYgKG1lc3NhZ2VNYXJrZXJJZC5pbmRleE9mKHBsdWdpblF1YWxpZmllcikgPT0gLTEpCi0JCQkJCQlxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQgPSBwbHVnaW5RdWFsaWZpZXIgKyAiLiIgKyBtZXNzYWdlTWFya2VySWQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJcXVhbGlmaWVkTWVzc2FnZU1hcmtlcklkID0gbWVzc2FnZU1hcmtlcklkOwotCQkJCQlpZiAoQXJyYXlzLmFzTGlzdCh2bWQuZ2V0TWFya2VySWRzKCkpLmNvbnRhaW5zKHF1YWxpZmllZE1lc3NhZ2VNYXJrZXJJZCkpCi0JCQkJCQlyZXR1cm4gcXVhbGlmaWVkTWVzc2FnZU1hcmtlcklkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nRGlzYWJsZWRWYWxpZGF0b3IoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJLy8gRXZlbiB0aGUgSVZhbGlkYXRvciBpcyBpbnZhbGlkLiBVbmZvcnR1bmF0ZWx5LCBjYW4ndCBkaXNhYmxlIHRoZQotCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1lc3NhZ2UuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZGlzcGxheVN1YnRhc2sobWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsgLy8gZ2V0SGVscGVyIGNvdWxkIGJlIG51bGwgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIGJlZm9yZSBzb21ldGhpbmcKLQkJCS8vIHdhcyBmdWxseSBpbml0aWFsaXplZAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIG9iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBudWxsOwotCQl0cnkgewotCQkJLy9oZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQloZWxwZXIgPSBnZXRIZWxwZXIodmFsaWRhdG9yKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBVbmxpa2VseSB0aGF0IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcwotCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJLy8gdGhhdCB0aGUgaGVscGVyIGhhcyBiZWVuIGxvYWRlZCB0b28uCi0KLQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgb2JqZWN0KTsKLQkJcmVtb3ZlQWxsTWVzc2FnZXMocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzLCB0YXJnZXRPYmplY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIG9iaik7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL2hlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCWhlbHBlciA9IGdldEhlbHBlciggcmVzb3VyY2UuZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3IgKTsKLQkJfSAKLQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVW5saWtlbHkgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24sIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMKLQkJCS8vIGludm9rZWQgYnkgdGhlIHZhbGlkYXRvciwgYW5kIGlmIHRoZSB2YWxpZGF0b3IgaXMgaW52b2tlZCwgaXQncyBsaWtlbHkKLQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vLgotCi0JCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1tdIHZhbGlkYXRvck5hbWVzID0gdm1kLmdldFZhbGlkYXRvck5hbWVzKCk7Ci0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG9iaik7Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzLCB0YXJnZXRPYmplY3ROYW1lLCBncm91cE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhY2hlTWVzc2FnZSggSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsCi0JCUlSZXNvdXJjZSByZXNvdXJjZSwJQ2xhc3MgY2xhenosIElNZXNzYWdlIG1lc3NhZ2UsCi0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtYXJrZXJJZCApewotCQkKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpcmV0dXJuOwotCQkKLQkJQ2xhc3NMb2FkZXIgY2wgPSBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOwotCQlTdHJpbmcgdGV4dCA9IG1lc3NhZ2UuZ2V0VGV4dChjbCk7Ci0JCU1lc3NhZ2VJbmZvIG1zZ0luZm8gPSBuZXcgTWVzc2FnZUluZm8oZ2V0VW5pcXVlSWQoY2xhenopLCByZXNvdXJjZSwgbG9jYXRpb24sCi0JCQkJdGV4dCwgdGFyZ2V0T2JqZWN0TmFtZSwgbWFya2VySWQsIG1lc3NhZ2UgKTsKLQotCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5jYWNoZU1lc3NhZ2UoIHZhbGlkYXRvciwgbXNnSW5mbyApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmI5MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVByb2plY3RWYWxpZGF0aW9uSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8qKiB2YWxpZGF0aW9uSGVscGVyIC0gZXh0ZW5zaW9uIHBvaW50IG5hbWUuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9IRUxQRVIgPSAidmFsaWRhdGlvbkhlbHBlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqIGhlbHBlckNsYXNzIC0gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBleHRlbnNpb24uICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEVMUEVSX0NMQVNTID0gImhlbHBlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0VmFsaWRhdGlvbkhlbHBlcj4gX3ZhbGlkYXRpb25IZWxwZXJzOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCS5nZXRFeHRlbnNpb25Qb2ludChWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgVkFMSURBVElPTl9IRUxQRVIpOwotCQlpZiAocG9pbnQgPT0gbnVsbClyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsUmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmICghcmVjb2duaXplZCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogTG9ncyB0aGUgZXJyb3IgaW4gdGhlIGRlc2t0b3AgbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0VmFsaWRhdGlvbkhlbHBlcj4gZ2V0VmFsaWRhdGlvbkhlbHBlcnMoKSB7Ci0JCWlmIChfdmFsaWRhdGlvbkhlbHBlcnMgPT0gbnVsbCkKLQkJCV92YWxpZGF0aW9uSGVscGVycyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RWYWxpZGF0aW9uSGVscGVyPigpOwotCQlyZXR1cm4gX3ZhbGlkYXRpb25IZWxwZXJzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFZBTElEQVRJT05fSEVMUEVSKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSAoSVByb2plY3RWYWxpZGF0aW9uSGVscGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0hFTFBFUl9DTEFTUyk7Ci0JCQlnZXRWYWxpZGF0aW9uSGVscGVycygpLmFkZChoZWxwZXIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciBnZXRWYWxpZGF0aW9uSGVscGVyKCkgewotCQlpZiAoZ2V0VmFsaWRhdGlvbkhlbHBlcnMoKS5pc0VtcHR5KCkpcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uSGVscGVycygpLmdldCgwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmY2I5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BsdWdpbi9WYWxpZGF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5EZXBlbmRlbmN5SW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RVbmF2YWlsYWJsZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlVW5hdmFpbGFibGVFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgcGx1Zy1pbidzIGFjdGl2YXRvciBjbGFzcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAJVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRSA9ICJ2YWxpZGF0ZV9iYXNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiAtIHRoZSBwbHVnLWluIGlkICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgCVBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGx1Z2luIF9wbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSAJCV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQlVJTERFUl9JRCA9IFBMVUdJTl9JRCArICIudmFsaWRhdGlvbmJ1aWxkZXIiOyAvLyROT04tTkxTLTEkLy8gcGx1Z2luIGlkIG9mIHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfRVhUX1BUX0lEID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHZhbGlkYXRvciAKLQotCXB1YmxpYyBWYWxpZGF0aW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoX3BsdWdpbiA9PSBudWxsKV9wbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSdzIHByb3BlcnR5IGZpbGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIGdldEJ1bmRsZVByb3BlcnR5RmlsZU5hbWUoKSBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUncyBwcm9wZXJ0eSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJ1bmRsZVByb3BlcnR5RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBWQUxJREFUSU9OX1BST1BfRklMRV9OQU1FOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotCQlpZiAoX21lc3NhZ2UgPT0gbnVsbCkgewotCQkJX21lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOwotCQkJX21lc3NhZ2Uuc2V0QnVuZGxlTmFtZShnZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCkpOwotCQl9Ci0JCS8vIGNsZWFyIHRoZSBtZXNzYWdlIGZvciByZXVzZQotCQlfbWVzc2FnZS5zZXRJZChudWxsKTsKLQkJX21lc3NhZ2Uuc2V0UGFyYW1zKG51bGwpOwotCQlfbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QobnVsbCk7Ci0JCV9tZXNzYWdlLnNldEdyb3VwTmFtZShudWxsKTsKLQkJX21lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2YXRlZCgpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLCAKLQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCAKLQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLQkJRGVwZW5kZW5jeUluZGV4IGRpID0gKERlcGVuZGVuY3lJbmRleClWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXREZXBlbmRlbmN5SW5kZXgoKTsKLQkJSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJd3MuYWRkU2F2ZVBhcnRpY2lwYW50KHRoaXMsIGRpKTsKLQkJd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihWYWxPcGVyYXRpb25NYW5hZ2VyLmdldERlZmF1bHQoKSwgCi0JCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoIEV2ZW50TWFuYWdlci5nZXRNYW5hZ2VyKCkgKTsJCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggVmFsT3BlcmF0aW9uTWFuYWdlci5nZXREZWZhdWx0KCkgKTsJCQotCQlFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLnNodXRkb3duKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSB0aGlzIGV4Y2VwdGlvbiB0byB0aGUgbG9nLgotCSAqIDxwPgotCSAqIFdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiBvZiBtb3ZpbmcgdG8gYSBuZXcgYXBwcm9hY2ggZm9yIGxvY2FsaXplZCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgbmV3IAotCSAqIGFwcHJvYWNoIGZvciBleGNlcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSB0aHJvd2FibGUsIHRoaXMgY2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIG5vcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpewotCQlpZiAoZSA9PSBudWxsKXJldHVybjsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0JCWdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm9qZWN0VW5hdmFpbGFibGVFcnJvcihQcm9qZWN0VW5hdmFpbGFibGVFcnJvciBlKXsKLQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpaGFuZGxlRXhjZXB0aW9uKGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IoUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yIGUpewotCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSloYW5kbGVFeGNlcHRpb24oZSk7Ci0JfQotCQotCS8qKiAKLQkgKiBXcml0ZSBhIG1lc3NhZ2UgaW50byB0aGUgbG9nLiAKLQkgKiAKLQkgKiBXZSBhcmUgaW4gdGhlIHRyYW5zaXRpb24gb2YgbW92aW5nIHRvIGEgbmV3IGFwcHJvYWNoIGZvciBsb2NhbGl6ZWQgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIG5ldyAKLQkgKiBhcHByb2FjaCBmb3IgZXhjZXB0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgbWVzc2FnZSBzZXZlcml0eSwgc2VlIElTdGF1cwotCSAqIEBwYXJhbSBtZXNzYWdlIGEgbG9jYWxpemVkIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ZhbGlkYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ZhbGlkYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTQ2MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9WYWxpZGF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHdheSB0byBhY2Nlc3MgYW4gaW5zdGFuY2Ugb2YgdGhlIFZhbGlkYXRpb25GYWN0b3J5SW1wbAotICogaW5zdGFuY2UsIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHNvbWUgb2YgdGhlIGludGVybmFsIHN0YXRlCi0gKiBvZiB2YWxpZGF0b3JzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICogW2lzc3VlOiBMTSAtIDIgaXNzdWVzLgotICogIDEuIEkgZG9uJ3QgdGhpbmsgdGhlIG5hbWUgJ2ZhY3RvcnknIHByb3ZpZGVzIGEgZ29vZCBkZXNjcmlwdGlvbiBvZiAKLSAqICAgICB0aGlzIGludGVyZmFjZS4gVW5sZXNzIEknbSBtaXN0YWtlbiB0aGUgVmFsaWRhdGlvbkZhY3RvcnkgZG9lc24ndAotICogICAgIGFjdHVhbGx5IGNyZWF0ZSB2YWxpZGF0b3JzIGJ1dCBzaW1wbHkgcmV0dXJucyBleGlzdGluZyB2YWxpZGF0b3JzLgotICogICAgIExvb2tpbmcgYXQgdGhlIGltcGxlbWVudGF0aW9uIHRoaXMgaXMgY3VycmVudGx5IHRoZSBjYXNlLiBJIHN1Z2dlc3QKLSAqICAgICByZW5hbWluZyB0aGlzIHRvIFZhbGlkYXRvclJlZ2lzdHJ5IG9yIHNvbWV0aGluZyBzaW1pbGFyLgotICogIDIuIEkgdGhpbmsgdGhlIGNvbW1vbiB3YXkgZm9yIGNyZWF0aW5nIGEgZmFjdG9yeSBpcyB0byBjcmVhdGUgYSBjbGFzcwotICogICAgIHdpdGggYSBzdGF0aWMgbWV0aG9kIHN1Y2ggYXMgZ2V0RmFjdG9yeS4gSWYgdGhpcyBpcyB0byBiZSBhIGZhY3RvcnkKLSAqICAgICBpdCBzaG91bGQgcHJvYmFibHkgYmUgc3RydWN0dXJlZCBhcyBwZXIgdGhlIGNvbnZlbnRpb24uXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25GYWN0b3J5IHsKLQkKLQlWYWxpZGF0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IFZhbGlkYXRpb25GYWN0b3J5SW1wbC5nZXRJbnN0YW5jZSgpOwotCS8qKgotCSAqIFRoaXMgYXBpIHJldHVybnMgdGhlIElWYWxpZGF0b3IgZ2l2ZW4gdGhlIHZhbGlkYXRvclVuaXF1ZU5hbWUgaWQuIFRoZSB1bmlxdWUKLQkgKiBpZCBuYW1lIGlzIHRoZSBjbGFzcyBuYW1lIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgbmFtZSBlbGVtZW50IGluIHRoZSAKLQkgKiBwbHVnaW4gZXh0ZW5zaW9uIG9mIHRoZSB2YWxpZGF0b3IuCi0JICogQHBhcmFtIHZhbGlkYXRvclVuaXF1ZUlkCi0JICogQHJldHVybiBJVmFsaWRhdG9yCi0JICogQHBsYW5uZWRmb3IgV1RQIDEuMAotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9yVW5pcXVlSWQpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9FbXB0eVNjaGVkdWxpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9FbXB0eVNjaGVkdWxpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2I1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRW1wdHlTY2hlZHVsaW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eVNjaGVkdWxpbmdSdWxlIGltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlIHsKLQkJCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIAotICAgIHsKLSAgICAgICAgIHJldHVybiBydWxlID09IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotICAgICAgICAgcmV0dXJuIHJ1bGUgPT0gdGhpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9GaWxlRGVsdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0ZpbGVEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU2YmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0ZpbGVEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotCi0KLS8qKgotICogPHA+Ci0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJRmlsZURlbHRhCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhCi0gKiAKLSAqICBbaXNzdWU6IENTIC0gaXMgdGhlcmUgYSByZWFzb24gdGhhdCB3ZSBuZWVkIHRvIGV4cG9zZSB0aGlzIGltcGwgY2xhc3MgYXMgYW4gQVBJPwotICogICBJdCB3b3VsZCBzZWVtIGJldHRlciB0byBvbmx5IGV4cG9zZSBJRmlsZURlbHRhLiAgSSBjYW4ndCB0aGluayBvZiBhIHJlYXNvbiB3aGVyZSAKLSAqICAgYSB0eXBpY2FsIGNsaWVudCB3b3VsZCBuZWVkIHRvIGNyZWF0ZSBvbmUgb2YgdGhlc2UuXQotICovCi1wdWJsaWMgY2xhc3MgRmlsZURlbHRhIGltcGxlbWVudHMgSUZpbGVEZWx0YSB7Ci0JcHJpdmF0ZSBpbnQgZmlsZURlbHRhOwotCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIEZpbGVEZWx0YQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRmlsZURlbHRhKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcy4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUgc3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gYUZpbGVEZWx0YSBzcGVjaWZpZXMgdGhlIAotCSAqLwotCXB1YmxpYyBGaWxlRGVsdGEoU3RyaW5nIGFGaWxlTmFtZSwgaW50IGFGaWxlRGVsdGEpIHsKLQkJZmlsZU5hbWUgPSBhRmlsZU5hbWU7Ci0JCWZpbGVEZWx0YSA9IGFGaWxlRGVsdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlsZURlbHRhI2dldERlbHRhVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXREZWx0YVR5cGUoKSB7Ci0JCXJldHVybiBmaWxlRGVsdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlsZURlbHRhI2dldEZpbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0IHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCB0aGUgZmlsZSAKLQkgKiBoYXMgdW5kZXJnb25lLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWx0YVR5cGUoaW50IGRlbHRhVHlwZSkgewotCQlmaWxlRGVsdGEgPSBkZWx0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCWZpbGVOYW1lID0gYUZpbGVOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lGaWxlRGVsdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lGaWxlRGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0OGVlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JRmlsZURlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCwgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24sIHRvIGVuY2Fwc3VsYXRlIHRoZSBjaGFuZ2UgCi0gKiBzdGF0dXMgb2YgYSByZXNvdXJjZS4gSUZpbGVEZWx0YSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCBoYXMgCi0gKiBjaGFuZ2VkLCBhbmQgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjaGFuZ2Ugd2hpY2ggaGFzIG9jY3VycmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIDwvcD4KLSAqIFtpc3N1ZTogTE0gLSBGcm9tIHNwZWFraW5nIHdpdGggVmlqYXkgdGhlIG5hbWUgSUZpbGVEZWx0YSBkb2Vzbid0IHJlYWxseSBjYXB0dXJlCi0gKiAgd2hhdCB0aGlzIGludGVyZmFjZSBpcyBmb3IuIFZhbGlkYXRpb24gbWF5IG9jY3VyIG9mIGZpbGVzLCBpdCBtYXkgb2NjdXIgb24gcmVzb3VyY2VzLAotICogIG9yIGl0IG1heSBvY2N1ciBvbiBzb21ldGhpbmcgbW9yZSBhYnN0cmFjdCBzaW1wbHkga25vd24gYXMgYW4gYXJ0aWZhY3QuIFRoZSBkZWx0YSBwYXJ0Ci0gKiAgb2YgdGhlIG5hbWUgYWxzbyBzZWVtcyBtaXNsZWFkaW5nIGFzIHRoaXMgaW50ZXJmYWNlIGRvZXNuJ3QgcHJvdmlkZSB0aGUgZGVsdGEgYnV0Ci0gKiAgcmF0aGVyIHByb3ZpZGVzIHRoZSB0eXBlIG9mIGNoYW5nZS4gSSBzdWdnZXN0IHJlbmFtaW5nIHRoaXMgaW50ZXJmYWNlIHRvIElNb2RpZmllZEFydGlmYWN0Ci0gKiAgb3Igc29tZXRoaW5nIGFsb25nIHRob3NlIGxpbmVzIHRvIGJldHRlciBjYXB0dXJlIGl0cyB1c2UuIF0KLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZURlbHRhIHsKLQkKLQkvKiogMSAtIHRoZSBmaWxlIGhhcyBiZWVuIGFkZGVkICovCi0JaW50IEFEREVEID0gMTsKLQkKLQkvKiogMiAtIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgKi8KLQlpbnQgQ0hBTkdFRCA9IDI7Ci0JCi0JLyoqIDMgLSB0aGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkICovCi0JaW50IERFTEVURUQgPSAzOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY2hhbmdlIHdoaWNoIGhhcyBvY2N1cnJlZDoKLQkgKiBJRmlsZURlbHRhLkFEREVELCBJRmlsZURlbHRhLkNIQU5HRUQsIG9yIElGaWxlRGVsdGEuREVMRVRFRC4KLQkgKiA8L3A+Ci0JICogQHJldHVybiByZXR1cm5zIHRoZSBkZWx0YSB0eXBlLgotCSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLQkgKiAKLQkgKiBbaXNzdWU6IExNIC0gRnJvbSBteSBleHBlcmllbmNlIGEgdmFsaWRhdG9yIHNpbXBseSBuZWVkcyB0byBrbm93IHdoYXQgYXJ0aWZhY3QgbmVlZHMKLQkgKiAgdG8gYmUgdmFsaWRhdGVkLiBDYW4geW91IHByb3ZpZGUgYSB1c2UgY2FzZSB3aGVyZSB0aGUgdHlwZSBvZiBjaGFuZ2UgaXMgbmVlZGVkIGZvcgotCSAqICB2YWxpZGF0aW9uPyBdCi0JICovCi0JaW50IGdldERlbHRhVHlwZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWNsaXBzZSByZXNvdXJjZSBmaWxlIHdoaWNoIGhhcyBjaGFuZ2VkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3Qgbm90IGJlIAotCSAqIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLgotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpbGUgbmFtZS4KLQkgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0JICogCi0JICogW2lzc3VlOiBMTSAtIEZvbGxvd2luZyBteSBjb21tZW50cyBhYm92ZSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgcmVuYW1lZCB0byBnZXRBcnRpZmFjdE5hbWUgb3IKLQkgKiAgc29tZXRoaW5nIHRoYXQgZm9sbG93cyBhbG9uZyB3aXRoIHRoZSBpbnRlcmZhY2UgcmVuYW1lLiBdCi0JICovCi0JU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JTWVzc2FnZUFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSU1lc3NhZ2VBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4NWY2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JTWVzc2FnZUFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotCi0vKioKLSAqIDxwPgotICogSW50ZXJmYWNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBtZXNzYWdlcyB3aGljaCBhcmUgc3RvcmVkIHdpdGhpbiBhIHJlcG9ydGVyIHdoaWNoIHJldGFpbnMKLSAqIGl0cyBtZXNzYWdlIGhpc3RvcnkuCi0gKiA8L3A+Ci0gKiAKLSAqIFtpc3N1ZTogQ1MgLSBUaGlzIGludGVyZmFjZSBzZWVtcyBsaWtlIG92ZXJraWxsLiAgSSdkIHRoaW5rIHRoYXQgYW4gSVJlcG9ydCBzaG91bGQgc2ltcGx5IGhhdmUgYSBnZXRNZXNzYWdlcygpIG1ldGhvZC4KLSAqIEkgdGhpbmsgTWVzc2FnZUZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBhdCB0aGUgJ2Rpc3BsYXknIGxldmVsIGFuZCBub3QgYXQgdGhpcyBsZXZlbCBvZiB0aGUgQVBJLl0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZUFjY2VzcyB7Ci0JLyoqCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgQSBmaWx0ZXIgd2hpY2ggc3BlY2lmaWVzIGEgc3Vic2V0IG9mIG1lc3NhZ2VzIHRvIHJldHJpZXZlLiBudWxsIHNwZWNpZmllcywgImFsbAotCSAqICAgICAgICAgICAgbWVzc2FnZXMiLgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdGhlIHRhcmdldCBvYmplY3QKLQkgKi8KLQlhYnN0cmFjdCBMaXN0IGdldE1lc3NhZ2VzKE1lc3NhZ2VGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIEEgZmlsdGVyIHdoaWNoIHNwZWNpZmllcyBhIHN1YnNldCBvZiBtZXNzYWdlcyB0byByZXRyaWV2ZS4gbnVsbCBzcGVjaWZpZXMsICJhbGwKLQkgKiAgICAgICAgICAgIG1lc3NhZ2VzIi4KLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGxvY2FsIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZXMgaW50by4gbnVsbCBzcGVjaWZpZXMsICJ1c2UgZGVmYXVsdAotCSAqICAgICAgICAgICAgbG9jYWxlIi4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdGhlIHRhcmdldCBvYmplY3QsIHRyYW5zbGF0ZWQgaW50byB0aGUgc3BlY2lmaWVkCi0JICogbG9jYWxlLgotCSAqLwotCWFic3RyYWN0IExpc3QgZ2V0TWVzc2FnZXNBc1RleHQoTWVzc2FnZUZpbHRlciBmaWx0ZXIsIExvY2FsZSB0YXJnZXRMb2NhbGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk4MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElNZXNzYWdlIGludGVyZmFjZSwgcHJvdmlkZWQgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUKLSAqIElWYWxpZGF0b3JzLiBJZiBhbiBJVmFsaWRhdG9yIG5lZWRzIHRvIHJ1biBpbiBib3RoIEFBVCBhbmQgV1NBRCB0aGVuIHRoaXMgSU1lc3NhZ2UgaW1wbGVtZW50YXRpb24KLSAqIHNob3VsZCBiZSB1c2VkOyBpZiB0aGUgSVZhbGlkYXRvciBydW5zIGluIFdTQUQgYWxvbmUsIHRoZSBXU0FEIExvY2FsaXplZE1lc3NhZ2UgbWF5IGJlIHVzZWQgaW4KLSAqIHBsYWNlIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZQotICogCi0gKiBbaXNzdWU6IENTIC0gSSdkIHN1Z2dlc3Qgc3BsaXR0aW5nIHRoaXMgY2xhc3MgaW50byBNZXNzYWdlIGFuZCBCdW5kbGVNZXNzYWdlICh3aGVyZSB0aGUgbGF0dGVyIGluaGVyaXRzCi0gKiBmcm9tIHRoZSBmb3JtZXIuICBXZSBoYXZlIG1hbnkgbWVzc2FnZXMgdGhhdCBjb21lIChmcm9tIHhlcmNlcykgcHJldHJhbnNsYXRlZCBhbmQgZG9uJ3QgcmVxdWlyZSAnYnVuZGxlJwotICogcmVsYXRlZCBmaWVsZHMgYW5kIG1ldGhvZHMuIFNwbGl0dGluZyB0aGlzIGNsYXNzIHdvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgd2hlcmUgYnVuZGxlIHJlbGF0ZWQKLSAqIGZ1bmN0aW9uIGlzIGNvbWluZyBpbnRvIHBsYXkuIEJlbG93IEkndmUgbGlzdGVkIG91dCB3aGF0IHdvdWxkIGdvIGludG8gQnVuZGxlTWVzc2FnZSB0byBkZW1vbnN0cmF0ZSBob3cgCi0gKiB3ZSBjYW4gc2ltcGxpZnkgdGhlICdNZXNzYWdlJyBjbGFzcyBieSBmYWN0b3Jpbmcgb3V0IHRoZSBidW5kbGUgcmVsYXRlZCBkZXRhaWxzLgotICogCi0gKiBNZXNzYWdlCi0gKglwcml2YXRlIE9iamVjdCB0YXJnZXRPYmplY3QgPSBudWxsOwotICoJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBOYW1lID0gbnVsbDsKLSAqCXByaXZhdGUgaW50IGxpbmVOdW1iZXIgPSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQ7Ci0gKglwcml2YXRlIGludCBsZW5ndGggPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0gKglwcml2YXRlIGludCBvZmZzZXQgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0gKgotICogICAgCi0gKiBCdW5kbGVNZXNzYWdlCi0gKglwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0gKglwcml2YXRlIFN0cmluZ1tdIHBhcmFtcyA9IG51bGw7Ci0gKglwcml2YXRlIFN0cmluZyBidW5kbGVOYW1lID0gbnVsbDsKLSAqICAgCi0gKiAgIC0gZ2V0SWQoKQotICogICAtIGdldEJ1bmRsZSguLi4pCi0gKiAgIC0gZ2V0QnVuZGxlTmFtZSgpCi0gKiAgIC0gZ2V0UGFyYW1zKCkKLSAqICAgLSBnZXRUZXh0KExvY2FsZSkKLSAqICAgLSBnZXRUZXh0KENsYXNzTG9hZGVyKQotICogICAtIGdldFRleHQoTG9jYWxlLCBDbGFzc0xvYWRlcikKLSAqICAgLSBzZXRJZChTdHJpbmcpCi0gKiAgIC0gc2V0QnVuZGxlTmFtZShTdHJpbmcpCi0gKiAgIC0gc2V0UGFyYW1zKFN0cmluZ1tdKQotICogXQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZSBpbXBsZW1lbnRzIElNZXNzYWdlIHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZ1tdIHBhcmFtczsKLQlwcml2YXRlIGludCBzZXZlcml0eSA9IE1lc3NhZ2VGaWx0ZXIuQU5ZX1NFVkVSSVRZOwotCXByaXZhdGUgT2JqZWN0IHRhcmdldE9iamVjdDsKLQlwcml2YXRlIFN0cmluZyBidW5kbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGdyb3VwTmFtZTsKLQlwcml2YXRlIGludCBsaW5lTnVtYmVyID0gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtZXNzYWdlQXR0cmlidXRlczsKLQlwcml2YXRlIFN0cmluZyBtYXJrZXJJZDsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBNZXNzYWdlCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBNZXNzYWdlIG9iamVjdCB3aXRoIGJ1bmRsZSBuYW1lLCBzZXZlcml0eSBhbmQgYSB1bmlxdWUgaWQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFCdW5kbGVOYW1lIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5IAotCSAqIAkJCU11c3QgYmUgb25lIG9mIHRoZSBzZXZlcml0aWVzIHNwZWNpZmllZCBpbiBJTWVzc2FnZS4gCi0JICogQHBhcmFtIGFuSWQgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuCi0JICovCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCkgewotCQl0aGlzKGFCdW5kbGVOYW1lLCBhU2V2ZXJpdHksIGFuSWQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBNZXNzYWdlIG9iamVjdCB3aXRoIGJ1bmRsZSBuYW1lLCBzZXZlcml0eSwgYSB1bmlxdWUgaWQsIGFuZCAKLQkgKiBhIGxpc3Qgb2YgcGFyYW1ldGVycy4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQnVuZGxlTmFtZSAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4gCi0JICogQHBhcmFtIGFTZXZlcml0eSAKLQkgKiAJCQlNdXN0IGJlIG9uZSBvZiB0aGUgc2V2ZXJpdGllcyBzcGVjaWZpZWQgaW4gSU1lc3NhZ2UuCi0JICogQHBhcmFtIGFuSWQgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuCi0JICogQHBhcmFtIGFQYXJhbXMgCi0JICogCQkJTWF5IGJlIG51bGwsIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzIGluIHRoZSBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBhQnVuZGxlTmFtZSwgaW50IGFTZXZlcml0eSwgU3RyaW5nIGFuSWQsIFN0cmluZ1tdIGFQYXJhbXMpIHsKLQkJdGhpcyhhQnVuZGxlTmFtZSwgYVNldmVyaXR5LCBhbklkLCBhUGFyYW1zLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIE1lc3NhZ2Ugb2JqZWN0IHdpdGggYnVuZGxlIG5hbWUsIHNldmVyaXR5LCBhIHVuaXF1ZSBpZCwgYW5kIAotCSAqIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCB0aGUgdGFyZ2V0IG9iamVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFCdW5kbGVOYW1lIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5IAotCSAqIAkJCU11c3QgYmUgb25lIG9mIHRoZSBzZXZlcml0aWVzIHNwZWNpZmllZCBpbiBJTWVzc2FnZS4KLQkgKiBAcGFyYW0gYW5JZCAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4KLQkgKiBAcGFyYW0gYVBhcmFtcyAKLQkgKiAJCQlNYXkgYmUgbnVsbCwgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgaW4gdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIHRhcmdldE9iamVjdCAKLQkgKiAJCQlNYXkgYmUgbnVsbCwgaWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgcGVydGFpbiB0byBhIHBhcnRpY3VsYXIgCi0JICogCQkJb2JqZWN0LgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBhQnVuZGxlTmFtZSwgaW50IGFTZXZlcml0eSwgU3RyaW5nIGFuSWQsIFN0cmluZ1tdIGFQYXJhbXMsIE9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7Ci0JCWJ1bmRsZU5hbWUgPSBhQnVuZGxlTmFtZTsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCWlkID0gYW5JZDsKLQkJcGFyYW1zID0gYVBhcmFtczsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCwgU3RyaW5nW10gYVBhcmFtcywgT2JqZWN0IGFUYXJnZXRPYmplY3QsIFN0cmluZyBhR3JvdXBOYW1lKSB7Ci0JCWJ1bmRsZU5hbWUgPSBhQnVuZGxlTmFtZTsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCWlkID0gYW5JZDsKLQkJcGFyYW1zID0gYVBhcmFtczsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQkJZ3JvdXBOYW1lID0gYUdyb3VwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2VzLCBhcyBpZGVudGlmaWVkIGJ5Ci0JICogCi0JICogQGxpbmsgI2dldEJ1bmRsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3RyeSB0byAgbG9hZCB0aGUgYnVuZGxlIGZyb20gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHBsdWdpbgotCQkJYnVuZGxlID0gZ2V0RnJhbWV3b3JrQnVuZGxlKGxvY2FsZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldEZyYW1ld29ya0J1bmRsZShMb2NhbGUgbG9jYWxlKSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldEJ1bmRsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRHcm91cE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBOYW1lKCkgewotCQlyZXR1cm4gZ3JvdXBOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRMaW5lTnVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBsaW5lTnVtYmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0T2Zmc2V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFBhcmFtcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIHBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRUYXJnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRleHQoQ2xhc3NMb2FkZXIpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBnZXRUZXh0KExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRleHQoTG9jYWxlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBnZXRUZXh0KGxvY2FsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRUZXh0KExvY2FsZSwgQ2xhc3NMb2FkZXIpCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZShsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhnZXRJZCgpKTsKLQotCQkJaWYgKGdldFBhcmFtcygpICE9IG51bGwpIHsKLQkJCQltZXNzYWdlID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIChPYmplY3RbXSlnZXRQYXJhbXMoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihnZXRJZCgpKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZ2V0SWQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldEJ1bmRsZU5hbWUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZU5hbWUoU3RyaW5nIGFCdW5kbGVOYW1lKSB7Ci0JCWJ1bmRsZU5hbWUgPSBhQnVuZGxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldEdyb3VwTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXBOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWdyb3VwTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNzZXRJZChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNzZXRMZW5ndGgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPCAwKSB7Ci0JCQlsZW5ndGggPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0JCX0KLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNzZXRMaW5lTm8oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVObyhpbnQgbGluZU51bWJlcikgewotCQlpZiAobGluZU51bWJlciA8IDApIHsKLQkJCXRoaXMubGluZU51bWJlciA9IElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldE9mZnNldChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCW9mZnNldCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQkJfQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldFBhcmFtcyhTdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbXMoU3RyaW5nW10gbmV3UGFyYW1zKSB7Ci0JCXBhcmFtcyA9IG5ld1BhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldFNldmVyaXR5KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgbmV3U2V2ZXJpdHkpIHsKLQkJc2V2ZXJpdHkgPSBuZXdTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldFRhcmdldE9iamVjdChPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0T2JqZWN0KE9iamVjdCBvYmopIHsKLQkJdGFyZ2V0T2JqZWN0ID0gb2JqOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWlmKG1lc3NhZ2VBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlQXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYobWVzc2FnZUF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJbWVzc2FnZUF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJfQotCQltZXNzYWdlQXR0cmlidXRlcy5wdXQoYXR0cmlidXRlTmFtZSx2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBtZXNzYWdlQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtlcklkKCkgewotCQlyZXR1cm4gbWFya2VySWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFya2VySWQoU3RyaW5nIG1hcmtlcklkKSB7Ci0JCXRoaXMubWFya2VySWQgPSBtYXJrZXJJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTk3YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEVuY2Fwc3VsYXRlcyBjb21tb24gbWVzc2FnZSBmaWx0ZXJpbmcgcGFyYW1ldGVycy4gTWVzc2FnZSBGaWx0ZXJzIGFyZSB1c2VkIHdoZW4gcmV0cmlldmluZwotICogbWVzc2FnZXMgdmlhIGFuIElNZXNzYWdlQWNjZXNzLiBUaGUgZmlsdGVyIGVuY2Fwc3VsYXRlcyBhIHNpbXBsZSBzZXQgb2YgdHlwaWNhbCBmaWx0ZXIgY3JpdGVyaWEKLSAqIHdoaWNoIGlzIHVzZWQgdG8gc2VsZWN0IGEgc3Vic2V0IG9mIG1lc3NhZ2VzIHRvIHJldHJpZXZlLiBJZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIG9mIHRoZSBtZXNzYWdlCi0gKiBmaWx0ZXIgYXJlIHNwZWNpZmllZCwgdGhleSBzaG91bGQgYmUgbG9naWNhbGx5IEFORCdkIHRvZ2V0aGVyIGJ5IHRoZSBNZXNzYWdlQWNjZXNzCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VGaWx0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOWV9TRVZFUklUWSA9IC0xOwotCi0JLyoqCi0JICogPHA+Ci0JICogTWVzc2FnZXMgbWF0Y2hpbmcgdGhpcyBzZXZlcml0eShzKSB3aWxsIGJlIHJldHJpZXZlZC4gT25lIG9mIFNldmVyaXR5RW51bSBYWFhfc2V2ZXJpdHkKLQkgKiBjb25zdGFudHMsIG9yIEFOWV9TRVZFUklUWSB0byBzcGVjaWZ5IHRoYXQgbWVzc2FnZXMgb2YgYW55IHNldmVyaXR5IHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMKLQkgKiBmaWVsZCBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBmaWx0ZXIgYXR0cmlidXRlcyB0byBuYXJyb3cgdGhlIHNlbGVjdGlvbiBzZXQgZnVydGhlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHkgPSBBTllfU0VWRVJJVFk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgdmFsaWRhdG9yIHdoaWNoIHJlcG9ydGVkIHRoZSBtZXNzYWdlcyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZC4gQWxsIG1lc3NhZ2VzIHdoaWNoIHdlcmUKLQkgKiByZXBvcnRlZCB1c2luZyB2YWxpZGF0b3IgbWF0Y2hpbmcgdGhpcyB2YWxpZGF0b3Igd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBmaWVsZCBjYW4gYmUgY29tYmluZWQKLQkgKiB3aXRoIG90aGVyIGZpbHRlciBhdHRyaWJ1dGVzIHRvIG5hcnJvdyB0aGUgc2VsZWN0aW9uIHNldCBmdXJ0aGVyLgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHRhcmdldCBvYmplY3Qgb2YgdGhlIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLCBvciBudWxsIHRvIHNwZWNpZnkgdG8gcmV0cmlldmUKLQkgKiBtZXNzYWdlcyBvZiBhbnkgdGFyZ2V0LiBBbGwgbWVzc2FnZXMgaGF2aW5nIGEgdGFyZ2V0IG9iamVjdCBtYXRjaGluZyB0aGlzIG9iamVjdCB3aWxsIGJlCi0JICogcmV0dXJuZWQuIFRoaXMgZmllbGQgY2FuIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgZmlsdGVyIGF0dHJpYnV0ZXMgdG8gbmFycm93IHRoZSBzZWxlY3Rpb24gc2V0Ci0JICogZnVydGhlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgdGFyZ2V0T2JqZWN0OwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5Ci0JICogCQkJU2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogCQkJSVZhbGlkYXRvciB3aGljaCByZXBvcnRlZCB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBhVGFyZ2V0T2JqZWN0Ci0JICogCQkJVGFyZ2V0IG9iamVjdCBvZiB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRmlsdGVyKGludCBhU2V2ZXJpdHksIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3QgYVRhcmdldE9iamVjdCkgewotCQlzdXBlcigpOwotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXRhcmdldE9iamVjdCA9IGFUYXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2V2ZXJpdHkgZmlsdGVyIGNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRhcmdldCBvYmplY3QgZmlsdGVyIGNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRvciB0byBmaWx0ZXIgb24uCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2V2ZXJpdHkgZmlsdGVyIGNvbnN0cmFpbnQuCi0JICogCi0JICogQHBhcmFtIG5ld1NldmVyaXR5Ci0JICogICAgICAgICAgICBzZXZlcml0eSBmaWx0ZXIgY29uc3RyYWludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBuZXdTZXZlcml0eSkgewotCQlzZXZlcml0eSA9IG5ld1NldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGFyZ2V0IG9iamVjdCBmaWx0ZXIgY29uc3RyYWludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0T2JqZWN0Ci0JICogICAgICAgICAgICAgdGFyZ2V0IG9iamVjdCBmaWx0ZXIgY29uc3RyYWludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0IG5ld1RhcmdldE9iamVjdCkgewotCQl0YXJnZXRPYmplY3QgPSBuZXdUYXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWxpZGF0b3IgdG8gcmV0dXJuIG1lc3NhZ2VzIGZvci4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICB2YWxpZGF0b3IgdG8gcmV0dXJuIG1lc3NhZ2VzIGZvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTcwYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBleGNlcHRpb24gaXMgdGhlIG9ubHkgZXhjZXB0aW9uIHdoaWNoIHNob3VsZCBiZSB0aHJvd24gYnkgSVZhbGlkYXRvcnMuIFRoZSBtZXNzYWdlIGluIHRoaXMKLSAqIGV4Y2VwdGlvbiBtdXN0IGJlIHN1aXRhYmxlIGZvciBzaG93aW5nIHRvIHRoZSB1c2VyLiBBbGwgVmFsaWRhdGlvbkV4Y2VwdGlvbnMgd2lsbCBoYXZlIHRoZWlyCi0gKiBtZXNzYWdlIGV4dHJhY3RlZCB3aGVuIHRoZXkncmUgY2F1Z2h0LCBhbmQgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biB0byB0aGUgdXNlci4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIFRocm93YWJsZSBfbG93TGV2ZWxFeGNlcHRpb247Ci0JcHJpdmF0ZSBJTWVzc2FnZSBfbWVzc2FnZTsKLQlwcml2YXRlIENsYXNzTG9hZGVyIF9sb2FkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMzODc1MTY5OTMxMjQyMjk5NDlMOwotCi0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBzdHJpbmcuIDxicj4KLQkgKiA8YnI+Ci0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIElNZXNzYWdlLCB3aGljaCBpcyBMb2NhbGUtaW5kZXBlbmRlbnQsIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlIHRvIGJlIHNob3duIHRvCi0JICogICAgICAgICAgICBiZSBzaG93biB0byB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkV4Y2VwdGlvbihJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCXRoaXMobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCBhIGdpdmVuIG1lc3NhZ2Ugc3RyaW5nLCBhbmQgbG93LWxldmVsIGV4Y2VwdGlvbi4gPGJyPgotCSAqIDxicj4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgSU1lc3NhZ2UgTG9jYWxlLWluZGVwZW5kZW50IG1lc3NhZ2UgdG8gYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgcmVsZXZhbnQgbG93LWxldmVsIGV4Y2VwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gPGJyPgotCSAqICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3AgRm9yIGV4YW1wbGUsIHdoZW4gYSBtZXRob2QgZmFpbHMgYmVjYXVzZSBvZiBhIG5ldHdvcmsKLQkgKiAgICAgICAgICAgIGNvbW11bmljYXRpb25zICZuYnNwOyZuYnNwOyZuYnNwIHByb2JsZW0sIHRoaXMgd291bGQgYmUgdGhlCi0JICogICAgICAgICAgICA8Y29kZT5qYXZhLmlvLklPRXhjZXB0aW9uPC9jb2RlPiAmbmJzcDsmbmJzcDsmbmJzcCBkZXNjcmliaW5nIHRoZSBleGFjdCBuYXR1cmUKLQkgKiAgICAgICAgICAgIG9mIHRoZSBwcm9ibGVtLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uRXhjZXB0aW9uKElNZXNzYWdlIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIoKTsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQlfbG93TGV2ZWxFeGNlcHRpb24gPSBleGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbG93LWxldmVsIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIF9sb3dMZXZlbEV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJTWVzc2FnZSB0byBiZSBzaG93biB0byB0aGUgdXNlciwgb3IgbnVsbCBpZiB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgYmUgaGFuZGxlZAotCSAqIGludGVybmFsbHkuCi0JICovCi0JcHVibGljIElNZXNzYWdlIGdldEFzc29jaWF0ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpZiB0aGUgSVZhbGlkYXRvciB3aGljaCB0aHJldyB0aGlzIGV4Y2VwdGlvbiB3YXMgbG9hZGVkIGJ5IGEgZGlmZmVyZW50IENsYXNzTG9hZGVyIHRoYW4gdGhlCi0JICogZnJhbWV3b3JrLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBDbGFzc0xvYWRlciBvZiB0aGUgSVZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBfbG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QgaWYgaXQgd2FzCi0JICogICAgICAgICB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoU3RyaW5nKSBjcmVhdGVkfXdpdGggYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmc7Ci0JICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKCkgY3JlYXRlZH13aXRoCi0JICogICAgICAgICBubyBlcnJvciBtZXNzYWdlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZS5nZXRUZXh0KGdldENsYXNzTG9hZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAJCQlUaGUgbG9jYWxlIG9mIHdoaWNoIHRvIGdldCB0aGUgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZyBvZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IGlmIGl0IHdhcwotCSAqICAgICAgICAge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKFN0cmluZykgY3JlYXRlZH13aXRoIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nOwotCSAqICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZSgpIGNyZWF0ZWR9d2l0aAotCSAqICAgICAgICAgbm8gZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gX21lc3NhZ2UuZ2V0VGV4dChsb2NhbGUsIGdldENsYXNzTG9hZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIElmIHRoZSBJVmFsaWRhdG9yIHdoaWNoIHRocmV3IHRoaXMgZXhjZXB0aW9uIHdhcyBsb2FkZWQgYnkgYSBkaWZmZXJlbnQgQ2xhc3NMb2FkZXIgdGhhbiB0aGUKLQkgKiBmcmFtZXdvcmssIHRoaXMgbWV0aG9kIHNob3VsZCBzZXQgdGhlIENsYXNzTG9hZGVyIHRvIGJlIHRoZSBDbGFzc0xvYWRlciBvZiB0aGUgSVZhbGlkYXRvci4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGxvYWRlcgotCSAqICAJCUNsYXNzTG9hZGVyIG9mIHRoZSB2YWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQkJX2xvYWRlciA9IGxvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyB0aHJvd2FibGUgb2JqZWN0LiBJZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICogd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZShTdHJpbmcpIGNyZWF0ZWR9d2l0aCBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlbgotCSAqIHRoZSByZXN1bHQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhyZWUgc3RyaW5nczoKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhpcyBvYmplY3QKLQkgKiA8bGk+IjogIiAoYSBjb2xvbiBhbmQgYSBzcGFjZSkKLQkgKiA8bGk+VGhlIHJlc3VsdCBvZiB0aGUge0BsaW5rICNnZXRNZXNzYWdlfW1ldGhvZCBmb3IgdGhpcyBvYmplY3QKLQkgKiA8L3VsPgotCSAqIElmIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3Qgd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZSgpIGNyZWF0ZWR9Ci0JICogd2l0aCBubyBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlbiB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoaXMgb2JqZWN0IGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdG9TdHJpbmcoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgdGhyb3dhYmxlIG9iamVjdC4gSWYgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqIHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoU3RyaW5nKSBjcmVhdGVkfXdpdGggYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoZW4KLQkgKiB0aGUgcmVzdWx0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRocmVlIHN0cmluZ3M6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoaXMgb2JqZWN0Ci0JICogPGxpPiI6ICIgKGEgY29sb24gYW5kIGEgc3BhY2UpCi0JICogPGxpPlRoZSByZXN1bHQgb2YgdGhlIHtAbGluayAjZ2V0TWVzc2FnZX1tZXRob2QgZm9yIHRoaXMgb2JqZWN0Ci0JICogPC91bD4KLQkgKiBJZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoKSBjcmVhdGVkfQotCSAqIHdpdGggbm8gZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoZW4gdGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGlzIG9iamVjdCBpcyByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZyhMb2NhbGUgbG9jYWxlKSB7Ci0JCVN0cmluZyBzID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShsb2NhbGUpOwotCQlyZXR1cm4gKG1lc3NhZ2UgIT0gbnVsbCkgPyAocyArICI6ICIgKyBtZXNzYWdlKSA6IHM7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0b3JMYXVuY2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdG9yTGF1bmNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzN2U4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0b3JMYXVuY2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5NZXNzYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBUaGlzIHNpbmdsZXRvbiBsYXVuY2hlcyB0aGUgdmFsaWRhdGlvbiBvbiBhIHNpbmdsZSB2YWxpZGF0b3IuIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBjbGFzcydzCi0gKiA8Y29kZT5zdGFydDwvY29kZT4gbWV0aG9kIHRvIGJlZ2luIHRoZSB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTGF1bmNoZXIgewotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvckxhdW5jaGVyIF9sYXVuY2hlcjsKLQotCXByaXZhdGUgVmFsaWRhdG9yTGF1bmNoZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGxhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTGF1bmNoZXIgZ2V0TGF1bmNoZXIoKSB7Ci0JCWlmIChfbGF1bmNoZXIgPT0gbnVsbCkgewotCQkJX2xhdW5jaGVyID0gbmV3IFZhbGlkYXRvckxhdW5jaGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9sYXVuY2hlcjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyB0aGUgbGF1bmNoIHBvaW50IG9mIHRoZSB2YWxpZGF0aW9uLiBJdCBydW5zIHZhbGlkYXRpb24gb24gdGhlIHZhbGlkYXRvcgotCSAqIGFjY2Vzc2VkIGJ5IHRoZSBJVmFsaWRhdGlvbkNvbnRleHQuIFdoZW4gdGhlIHZhbGlkYXRpb24gaXMgY29tcGxldGUsIGVhY2ggdmFsaWRhdG9yIG1heSBwZXJmb3JtIHJlc291cmNlCi0JICogY2xlYW51cCwgaWYgbmVjZXNzYXJ5LgotCSAqIDxwPgotCSAqIElmIDxjb2RlPmhlbHBlcjwvY29kZT4sPGNvZGU+dmFsaWRhdG9yPC9jb2RlPiwgb3IgPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IGFyZSBudWxsLAotCSAqIHZhbGlkYXRpb24gaXMgbm90IHBlcmZvcm1lZC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBtYXkgYmUgbnVsbCwgb3IgZW1wdHksIGlmIGEgZnVsbAotCSAqIGJ1aWxkIHNob3VsZCBiZSBkb25lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyIAotCSAqIAkJCWxvYWRzIGFuIG9iamVjdC4gCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIAkJCXZhbGlkYXRvciBvYmplY3QgdG8gbGF1bmNoIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogCQkJSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgZmluYWwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICgoaGVscGVyID09IG51bGwpIHx8ICh2YWxpZGF0b3IgPT0gbnVsbCkgfHwgKHJlcG9ydGVyID09IG51bGwpKXJldHVybjsKLQotCQkvLyBDYW4ndCBmb3JjZSBlYWNoIHZhbGlkYXRvciB0byBjaGVjayBpZiBpdCdzIGNhbmNlbGxlZCBvciBub3QsCi0JCS8vIHNvIGNoZWNrIGZvciBjYW5jZWxsYXRpb24gaGVyZS4gSG9wZWZ1bGx5IHRoZSB1c2VyIHdvbid0IHdhaXQgdG9vIGxvbmcuCi0JCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKXJldHVybjsKLQkJCi0KLQkJLy8gSWYgdGhlIHZhbGlkYXRvciBpcyBhYm91dCB0byBwZXJmb3JtIGEgZnVsbCBidWlsZCwgcmVtb3ZlIGFsbCBvZiBpdHMgcHJldmlvdXMgdmFsaWRhdGlvbgotCQkvLyBtZXNzYWdlcy4KLQkJaWYgKChoZWxwZXIuZ2V0VVJJcygpID09IG51bGwpIHx8IChoZWxwZXIuZ2V0VVJJcygpLmxlbmd0aCA9PSAwKSkgewotCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJfQotCQlpZiggdmFsaWRhdG9yIGluc3RhbmNlb2YgSVZhbGlkYXRvckpvYiApewotCQkJKChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvcikudmFsaWRhdGVJbkpvYihoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfWVsc2V7Ci0JCQl2YWxpZGF0b3IudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQkJaWYoIHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCS8vdGhlICB2YWxpZGF0b3JzIHdobyBoYXZlIGltcGxlbWVudGVkIElWYWxpZGF0b3JKb2IgYnV0IGFyZSBydW5uaW5nIHN5bmNocm9ub3VzbHkKLQkJCS8vd291bGQgbG9nIG1lc3NhZ2VzIG5vdyAuLi4KLQkJCVZhbGlkYXRvck1hbmFnZXIgbWdyID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCQlmaW5hbCBMaXN0IGxpc3QgPSBtZ3IuZ2V0TWVzc2FnZXMoKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yKTsKLQotCSAgICAJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSggaXQuaGFzTmV4dCgpICl7Ci0JCQkJTWVzc2FnZUluZm8gaW5mbyA9IChNZXNzYWdlSW5mbylpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQlUYXNrTGlzdFV0aWxpdHkuYWRkVGFzayggaW5mby5nZXRNZXNzYWdlT3duZXJJZCgpLCBpbmZvLmdldFJlc291cmNlKCksCi0JCQkJCQkJaW5mby5nZXRMb2NhdGlvbigpLCBpbmZvLmdldE1zZygpLmdldElkKCksIGluZm8uZ2V0VGV4dCgpLAotCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0U2V2ZXJpdHkoKSwgaW5mby5nZXRUYXJnZXRPYmplY3ROYW1lKCksCi0JCQkJCQkJaW5mby5nZXRNc2coKS5nZXRHcm91cE5hbWUoKSwgaW5mby5nZXRNc2coKS5nZXRPZmZzZXQoKSwgaW5mby5nZXRNc2coKS5nZXRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCX0JCQkJCQkJCQkJCi0JCQl9Ci0JCQltZ3IuY2xlYXJNZXNzYWdlcyggKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yICk7Ci0JCX0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWExYTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLgotICogPC9wPgotICogPHA+Ci0gKiBHaXZlbiB0aGVzZSB0aHJlZSB2YWx1ZXMgYXMgaW5wdXQsIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBxdWVyaWVkIGZvciB0aGUgZmluYWwgbWVzc2FnZSBzdHJpbmcuCi0gKiAoaS5lLiwgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGFyYW1ldGVycyBhbHJlYWR5IHN1YnN0aXR1dGVkIGluLikgRWl0aGVyIHRoZSBkZWZhdWx0IExvY2FsZSBjYW4gYmUKLSAqIHVzZWQsIG9yIHRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgYSBMb2NhbGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogPC9wPgotICogCi0gKiBbaXNzdWU6IENTIC0gVGhlICdJTWVzc2FnZScgaW50ZXJmYWNlIHdvdWxkIGJlIHNpbXBsZXIgd2l0aG91dCB0aGUgYnVuZGxlIHJlbGF0ZWQgZGV0YWlscy4gIEknZCBsaWtlIHRvIHVuZGVyc3RhbmQKLSAqIHdoeSB3ZSBjYW4gJ3ByZWNvbXB1dGUnIHRoZSB0cmFuc2xhdGVkIG1lc3NhZ2UuIElzIHRoZXJlIHNvbWUgYmVuZWZpdCB0byBwZXJmb3JtICdsYXRlIGNvbXB1dGF0aW9uJyBvZiB0aGVzZSBtZXNzYWdlcz8KLSAqIEhvdyBkb2VzIHRoaXMgY29tcGFyZSB0byB0aGUgZWNsaXBzZSBNYXJrZXIgKGFzIGZhciBhcyBJIGtub3cgdGhlIE1hcmtlcidzIHRleHQoKSBpcyBwcmVMb2NhbGl6ZWQpLgotICogSGVyZSdzIGEgbGlzdCBvZiB0aGUgbWV0aG9kcyB0aGF0IGFyZSByZWxhdGVkIHRvICdidW5kbGUgc3BlY2lmaWMnIGFzcGVjdHMgYW5kIGNvdWxkIGJlIHNlcGFyYXRlIG91dCAob3IgZGVzaWduZWQgYXdheSk/Ci0gKiAgICAKLSAqICAgLSBnZXRJZCgpCi0gKiAgIC0gZ2V0QnVuZGxlKC4uLikKLSAqICAgLSBnZXRCdW5kbGVOYW1lKCkKLSAqICAgLSBnZXRQYXJhbXMoKQotICogICAtIGdldFRleHQoTG9jYWxlKQotICogICAtIGdldFRleHQoQ2xhc3NMb2FkZXIpCi0gKiAgIC0gZ2V0VGV4dChMb2NhbGUsIENsYXNzTG9hZGVyKQotICogICAtIHNldElkKFN0cmluZykKLSAqICAgLSBzZXRCdW5kbGVOYW1lKFN0cmluZykKLSAqICAgLSBzZXRQYXJhbXMoU3RyaW5nW10pCi0gKiBdCi0gKiAKLSAqICAgLSB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgT2JqZWN0IHZhbHVlKQotICogICAtIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotICogXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlIHsKLQlpbnQgT0ZGU0VUX1VOU0VUID0gLTE7IC8vIHNlZSBnZXRMZW5ndGgoKSwgZ2V0T2Zmc2V0KCkKLQlpbnQgTElORU5PX1VOU0VUID0gMDsKLQkKLQkvKioKLQkgKiBUeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IGVycm9yIG1lc3NhZ2VzLgotCSAqLwotCWludCBISUdIX1NFVkVSSVRZID0gMHgwMDAxOwotCS8qKgotCSAqIFR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgd2FybmluZyBtZXNzYWdlcy4KLQkgKi8KLQlpbnQgTk9STUFMX1NFVkVSSVRZID0gMHgwMDAyOwotCS8qKgotCSAqIFR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgaW5mb3JtYXRpb24gbWVzc2FnZXMuCi0JICovCi0JaW50IExPV19TRVZFUklUWSA9IDB4MDAwNDsKLQkvKioKLQkgKiBTcGVjaWZ5IGhpZ2ggKGVycm9yKSBhbmQgbm9ybWFsICh3YXJuaW5nKSBtZXNzYWdlcy4gVHlwaWNhbGx5IHVzZWQgd2l0aCBhIE1lc3NhZ2VGaWx0ZXIsIHRvCi0JICogZmlsdGVyIG91dCBpbmZvcm1hdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlpbnQgRVJST1JfQU5EX1dBUk5JTkcgPSBISUdIX1NFVkVSSVRZIHwgTk9STUFMX1NFVkVSSVRZOwotCS8qKgotCSAqIFNwZWNpZnkgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGEgTWVzc2FnZUZpbHRlci4KLQkgKi8KLQlpbnQgQUxMX01FU1NBR0VTID0gRVJST1JfQU5EX1dBUk5JTkcgfCBMT1dfU0VWRVJJVFk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotCSAqIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpCi0JICogbWVhbnMgbm8gZ3JvdXAuCi0JICogPC9wPgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGdyb3VwIHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuCi0JICovCi0JU3RyaW5nIGdldEdyb3VwTmFtZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgaWRzIGFyZSB1c2VkIGFzIHRoZSBjb25zdGFudHMgaW4gcHJvcGVydHkgYnVuZGxlcwotCSAqIHdoaWNoIGxvY2FsaXplIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCBmYXNoaW9uLiBUaGUgaWQgaXMgdGhlCi0JICoga2V5LCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBzdHJpbmcgdG8gYmUgbG9hZGVkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsCi0JICogb3IgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiA8L3A+Ci0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSBhcmVhLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuIElmIHVuc2V0LCB2YWx1ZSA9Ci0JICogSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULgotCSAqIAotCSAqIEBzZWUgI2dldE9mZnNldCgpCi0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogSWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLQkgKiB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgKiBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBJZiBubyBsaW5lIG51bWJlciBoYXMgYmVlbiBzZXQsICNMSU5FTk9fVU5TRVQgd2lsbCBiZQotCSAqIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIGxpbmUgbnVtYmVyIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvYmxlbS4KLQkgKiAKLQkgKi8KLQlpbnQgZ2V0TGluZU51bWJlcigpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLiBJZiB1bnNldCwgdmFsdWUgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuIEZvciBleGFtcGxlLCBpZgotCSAqIHRoZSBqYXZhIGNvbXBpbGVyIHdlcmUgYSB2YWxpZGF0b3IsIGFuZCBpdCByZXBvcnRlZCB0aGF0IGEgdmFyaWFibGUgbmFtZSB3YXMgdW5rbm93biwgb2Zmc2V0Ci0JICogd291bGQgaWRlbnRpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVua25vd24gdmFyaWFibGUuIChUaGUgcG9zaXRpb24gaXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4pCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gb2Zmc2V0IG9mIHRoZSBtZXNzYWdlCi0JICovCi0JaW50IGdldE9mZnNldCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSB0aGUgdmFsdWVzIHdoaWNoIGFyZQotCSAqIHN1YnN0aXR1dGVkIGludG8gcGFyYW1ldGVyIHNsb3RzIGluIGxvY2FsaXplZCBtZXNzYWdlIHRleHQgZGRzY3JpcHRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmdbXSBnZXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLiBPbmUgb2YgU2V2ZXJpdHlFbnVtIGNvbnN0YW50cy4KLQkgKiAKLQkgKiBAc2VlIElNZXNzYWdlI0hJR0hfU0VWRVJJVFkKLQkgKiBAc2VlIElNZXNzYWdlI05PUk1BTF9TRVZFUklUWQotCSAqIEBzZWUgSU1lc3NhZ2UjTE9XX1NFVkVSSVRZCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlCi0JICovCi0JaW50IGdldFNldmVyaXR5KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHRoaXMgSU1lc3NhZ2UgaXMgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFnYWluc3QsIGlmIGFueS4gbnVsbCB3aWxsIGJlCi0JICogcmV0dXJuZWQgaWYgdGhpcyBpcyBhIGdlbmVyYWwgbWVzc2FnZSB3aGljaCBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgb2JqZWN0OyBmb3IKLQkgKiBleGFtcGxlLCAiaW50ZXJuYWwgZXJyb3IiLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgbWVzc2FnZQotCSAqLwotCU9iamVjdCBnZXRUYXJnZXRPYmplY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgTG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciAKLQkgKiAJCQkJVGhlIENsYXNzTG9hZGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBSZXNvdXJjZUJ1bmRsZS4KLQkgKiAgICAgICAgICAgIAotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogICAgICAgICAgICAKLQkgKiBAcmV0dXJuIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogQHBhcmFtIGNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFJlc291cmNlQnVuZGxlLgotCSAqICAgICAgICAgICAgCi0JICogQHJldHVybiBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgd2l0aCB0aGUKLQkgKiBidW5kbGUgbG9hZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpOwotCQotCS8qKgotCSAqIFByb3ZpZGVzIGEgd2F5IHRvIHN0b3JlIHNvbWUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgYSBtZXNzYWdlIHdvdWxkIGxpa2UgdG8gc3RvcmUKLQkgKiB0aGF0IGNhbiB1c2VkIGJ5IHNvbWUgb3RoZXIgcGFydGllcyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGF0dHJpYnV0ZSB2YWx1ZXMuIEJhc2ljYWxseQotCSAqIGEgY29udmllbmluY2UgdG8gcGFzcyBvYmplY3QgdmFsdWVzIGFyb3VuZCB0aGF0IGNhbiBjb25zdW1lZCBieSBvdGhlciBPYmplY3RzIGl0IHRoZXkgbmVlZCBpdAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHJldHVybiBhbiBPYmplY3QgYmFzaWNhbGx5IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBuYW1lLgotCSAqLwotCQotCSBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGF0dHJpYnV0ZU5hbWUgYW5kIHZhbHVlIGFzIGtleSB2YWx1ZSBwYWlyCi0JICogQHNlZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICovCi0JCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0JICAgCi0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIAotCSAqIAkJCU5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldEJ1bmRsZU5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotCSAqIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpCi0JICogbWVhbnMgbm8gZ3JvdXAuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogCQkJTmFtZSBvZiB0aGUgZ3JvdXAuCi0JICovCi0Jdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0IHRoZSBpZCBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBpZHMgYXJlIHVzZWQgYXMgdGhlIGNvbnN0YW50cyBpbiBwcm9wZXJ0eSBidW5kbGVzIHdoaWNoCi0JICogbG9jYWxpemUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IGZhc2hpb24uIFRoZSBpZCBpcyB0aGUga2V5LAotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIHN0cmluZyB0byBiZSBsb2FkZWQuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwgb3IKLQkgKiB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiAgICAgICAgICAgIElkIG9mIHRoZSBtZXNzYWdlLgotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSwgc3RhcnRpbmcgZnJvbSB0aGUgb2Zmc2V0LiBJZiB1bnNldCwgdmFsdWUgPQotCSAqIElNZXNzYWdlLk9GRlNFVF9VTlNFVC4KLQkgKiAKLQkgKiBAc2VlICNzZXRPZmZzZXQoaW50KQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoIAotCSAqCQkJc2V0cyB0aGUgbGVuZ3RoIAkJCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBpcyBhIHRhcmdldCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU1lc3NhZ2UsIGFuZCB0aGF0IHRhcmdldCBvYmplY3QgaXMgYSBmaWxlLAotCSAqIHRoZW4gYW4gb3B0aW9uYWwgbGluZSBudW1iZXIgbWF5IGJlIHNldC4gVGhlIGxpbmUgbnVtYmVyIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAqIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGlzIG1lc3NhZ2UuIFRvIGluZGljYXRlIG5vIGxpbmUgbnVtYmVyLCB1c2UgI0xJTkVOT19VTlNFVC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGxpbmVOdW1iZXIgCi0JICoJCQlzZXRzIHRoZSBsaW5lIG5vLiAJCi0JICovCi0Jdm9pZCBzZXRMaW5lTm8oaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLiBJZiB1bnNldCwgdmFsdWUgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuIEZvciBleGFtcGxlLCBpZiB0aGUKLQkgKiBqYXZhIGNvbXBpbGVyIHdlcmUgYSB2YWxpZGF0b3IsIGFuZCBpdCByZXBvcnRlZCB0aGF0IGEgdmFyaWFibGUgbmFtZSB3YXMgdW5rbm93biwgb2Zmc2V0Ci0JICogd291bGQgaWRlbnRpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVua25vd24gdmFyaWFibGUuIChUaGUgcG9zaXRpb24gaXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4pCi0JICogPC9wPgotCSAqIEBwYXJhbSBvZmZzZXQgCi0JICoJCQlzZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLiBNZXNzYWdlIHBhcmFtZXRlcnMgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHN1YnN0aXR1dGVkCi0JICogaW50byBwYXJhbWV0ZXIgc2xvdHMgaW4gbG9jYWxpemVkIG1lc3NhZ2UgdGV4dCBkZXNjcmlwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpZiBnZXRJZCgpIHJldHVybnMgIk1ZX0lEIiwgdGhlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaWRlbnRpZmllZCBieQotCSAqIGdldEJ1bmRsZU5hbWUoKSBpcyBzZWFyY2hlZCBmb3IgdGhlIG1lc3NhZ2UgbmFtZWQgIk1ZX0lEIiwgYW5kIGlmIGZvdW5kLAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKSBpcyBpbnZva2VkIG9uIHRoZSBtZXNzYWdlLCB3aXRoCi0JICogICAgICA8Y29kZT5uZXdQYXJhbXM8L2NvZGU+IHBhc3NlZCBpbiBhcyB0aGUgT2JqZWN0W10uCi0JICogQHBhcmFtIG5ld1BhcmFtcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldFBhcmFtcyhTdHJpbmdbXSBuZXdQYXJhbXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIE9uZSBvZiBTZXZlcml0eUVudW0gY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSU1lc3NhZ2UjSElHSF9TRVZFUklUWQotCSAqIEBzZWUgSU1lc3NhZ2UjTk9STUFMX1NFVkVSSVRZCi0JICogQHNlZSBJTWVzc2FnZSNMT1dfU0VWRVJJVFkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlCi0JICovCi0Jdm9pZCBzZXRTZXZlcml0eShpbnQgbmV3U2V2ZXJpdHkpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQXNzb2NpYXRlIHRoaXMgSU1lc3NhZ2Ugd2l0aCB0aGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBwcm9ibGVtLiBBIG51bGwgdmFsdWUgaXMgcGVybWl0dGVkLiBJZiBhCi0JICogbWVzc2FnZSBpcyBhcHBsaWNhYmxlIHRvIG9uZSBvYmplY3QsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0LiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0Ci0JICogdmFsdWUgKG51bGwpIHNob3VsZCBiZSBrZXB0LiBHaXZlbiB0aGlzIHRhcmdldCBvYmplY3QsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlCi0JICogZXhhY3QgbG9jYXRpb24gb2YgdGhlIHByb2JsZW0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRPYmplY3QoT2JqZWN0IG9iaik7Ci0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhIE1lc3NhZ2Ugb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCUhhc2hNYXAgZ2V0QXR0cmlidXRlcygpOwotCQotCS8qKgotCSAqIHJldHVybiB0aGUgbWFya2VyIGlkIGlmIG9uZSBpcyBzZXQgb24gdGhpcyBvYmplY3Qgd2hlbiBjcmVhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcmtlcklkKCk7Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBtYXJrZXIgaWQgb24gYSBNZXNzYWdlIG9iamVjdAotCSAqLwotCSB2b2lkIHNldE1hcmtlcklkKFN0cmluZyBtYXJrZXJJZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhOWNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGFNb2RlbENvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoU3RyaW5nIFVSSSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MzNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGEKLSAqIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCBhIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIElWYWxpZGF0aW9uQ29udGV4dAotewotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotICAgKiAKLSAgICogQHJldHVybiBhbiBJUHJvamVjdCByZWZlcmVuY2UgdG8gdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcwotICAgKiAgICAgICAgIGJlaW5nIGludm9rZWQuCi0gICAqLwotICBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg2YWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoKLSAqIENDTSAtIFJlcG9ydGVyIGlzIG5vdyBwYXNzZWQgbG9jYWxlLWluZGVwZW5kZW50IG1lc3NhZ2VzLgotICogICAgICAgTWVzc2FnZXMgc2hvdWxkIG9ubHkgYmUgdHJhbnNsYXRlZCB0byBhIGxvY2FsZSB1cG9uIGFjY2Vzcy4KLSAqICAgICAgIE9yIGluIHNwZWNpYWwgbG9jYWxlLWRlcGVuZGVudCByZXBvcnRlciBpbXBsZW1lbnRhdGlvbnMgKGNvbnNvbGUgbG9nZ2VyKS4KLSAqLwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgdXNlZCBieSBJVmFsaWRhdG9yJ3MgdG8gcmVwb3J0IG1lc3NhZ2VzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElSZXBvcnRlciBjb3VsZAotICogc2ltcGx5IGxvZyB0aGUgbWVzc2FnZXMgdG8gc3Rkb3V0LCBhIGZpbGUsIG9yIHJldGFpbiB0aGVtIGluIGEgYnVmZmVyIGZvciBsYXRlciBhY2Nlc3MgYnkgYSB1c2VyCi0gKiBpbnRlcmZhY2UuCi0gKiAKLSAqIFJlcG9ydGVyIGltcGxlbWVudGF0aW9ucyBzaG91bGQga2VlcCBub24tbG9jYWxpemVkIHZlcnNpb25zIG9mIHRoZWlyIG1lc3NhZ2VzCi0gKiAKLSAqIEFueSBtZXNzYWdlcyB3aGljaCBuZWVkIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcmUgZG9uZSB0aHJvdWdoIHRoaXMgY2xhc3MsIGFuZCBpZiB0aGUgdXNlcgotICogY2FuY2VscyB0aGUgY3VycmVudCBmdW5jdGlvbiwgdGhpcyBjbGFzcyBpcyB0aGUgb25lIHdoaWNoIHJlZ2lzdGVycyB0aGUgY2FuY2VsbGF0aW9uLgotICogCi0gKiBUaGUgSVJlcG9ydGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgdmFsaWRhdGlvbiBiZWdpbnMgYW5kIGVuZHMgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgotICogVGhlcmUgaXMgb25seSBvbmUgSVJlcG9ydGVyIGluc3RhbmNlIGNyZWF0ZWQgZm9yIGFsbCB2YWxpZGF0b3JzIHRoYXQgYXJlIHJ1biBvbiBhIElSZXNvdXJjZS4gVGhlIElSZXNvdXJjZQotICogcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IG1lc3NhZ2VzIHB1dCBvdXQgZWFjaCB2YWxpZGF0b3IgYW5kIGFkZCBhbmQgZGVsZXRlIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yCi0gKiBhdCBhIHRpbWUuIAotICogXSAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVwb3J0ZXIgewotCS8qKgotCSAqIDxwPgotCSAqIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuIEl0IHdpbGwgYmUgZGlzcGxheWVkIGxhdGVyLCB3aXRoIGFsbCBvZiB0aGUKLQkgKiBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgSVZhbGlkYXRvciBwYXNzZWQgaW4gaXMgbmVlZGVkIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uICh3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZQotCSAqIHJlbW92ZWQsIG9uZSB2YWxpZGF0b3Igc2hvdWxkIG5vdCByZW1vdmUgbWVzc2FnZXMgZW50ZXJlZCBieSBhbm90aGVyIHZhbGlkYXRvci4pIFRoZQotCSAqIHZhbGlkYXRvciBpcyBhbHNvIHF1ZXJpZWQgZm9yIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXNvdXJjZSBidW5kbGUsIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotCSAqIGxvY2FsaXphdGlvbiBvZiBtZXNzYWdlcyBpbiBhIGNsaWVudC1zZXJ2ZXIgZW52aXJvbm1lbnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb3JpZ2luCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdG9yIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIEEgbWVzc2FnZSB0byBiZSByZXBvcnRlZAotCSAqLwotCXZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIG9yaWdpbiwgSU1lc3NhZ2UgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdCBMb2NhbGUsIHRvIHRoZSB1c2VyCi0JICogaW1tZWRpYXRlbHkuIFRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgd2hpY2ggc3VidGFzayBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgbWVzc2FnZQotCSAqIGlzIG5vdCBzdG9yZWQuIFRoZSBzdWJ0YXNrIG1lc3NhZ2UgaW4gdGhpcyBjb250ZXh0IGlzIHRoZSBzdWJ0YXNrIGluIGEgSVByb2dyZXNzTW9udGlvciAKLQkgKiAKLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijc3ViVGFzayhTdHJpbmcpCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIElWYWxpZGF0b3IKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvciBUaGUgdmFsaWRhdG9yIGlzc3VpbmcgdGhlIHN1YnRhc2sgbWVzc2FnZS4KLQkgKiBAcGFyYW0gSVZhbGlkYXRvck1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAKLQkgKi8KLQl2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgYWNjZXNzIGludGVyZmFjZSB0byB0aGlzIHJlcG9ydGVyLCBvciBudWxsIGlmIG1lc3NhZ2UgYWNjZXNzIGlzIG5vdAotCSAqIHN1cHBvcnRlZC4KLQkgKiAgICAgCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogY2FsbGVkIGJ5IElWYWxpZGF0b3JzIHBlcmlvZGljYWxseSwgYmVjYXVzZSBubyBldmVudCBpcyBmaXJlZCB0byBub3RpZnkgSVZhbGlkYXRvcnMgdGhhdCB0aGUKLQkgKiB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24uIElmIGEgdmFsaWRhdG9yIGRvZXMgbm90IGNoZWNrIHRoaXMgbWV0aG9kLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0Ci0JICogaXMgaWdub3JlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGxlZCB2YWxpZGF0aW9uLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzQ2FuY2VsbGVkKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkCi0JICogZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9yaWdpbgotCSAqIAkJCW9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLiAgCi0JICovCi0Jdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLCBwZXJ0YWluaW5nIHRvIHRoZSBPYmplY3QKLQkgKiBwcm92aWRlZC4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIDxicj4KLQkgKiA8YnI+Ci0JICogSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZQotCSAqIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikgbWV0aG9kLikgPGJyPgotCSAqIDxicj4KLQkgKiA8cD4KLQkgKiBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9yaWdpbgotCSAqIAkJCW9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAJCQlPYmplY3QgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy4gT2JqZWN0IGlzIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgd2FzIHNldCBvbiB0aGUgSU1lc3NhZ2UKLQkgKiB3aGVuIGFkZGluZyB0aGUgbWVzc2FnZSBhcyBwcm9ibGVtIG1hcmtlci4KLQkgKiAKLSAJICovCi0Jdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0JICogdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gVGhpcyBtZXRob2QKLQkgKiB3aWxsIHJlbW92ZSBvbmx5IHRoZSBJTWVzc2FnZSdzIHRoYXQgYXJlIGluIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZS4gPGJyPgotCSAqIDxicj4KLQkgKiA8YnI+Ci0JICogCi0JICogVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuIDxicj4KLQkgKiA8YnI+Ci0JICogCi0JICogSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZQotCSAqIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikgbWV0aG9kLikKLQkgKiAKLQkgKiBJZiBncm91cE5hbWUgaXMgbnVsbCwgdGhhdCdzIHRoZSBzYW1lIGFzIG5vIGdyb3VwIChpLmUuLCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgdGhlCi0JICogPGNvZGU+cmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KTwvY29kZT4gbWV0aG9kLikgPGJyPgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW4KLQkgKiAJCQlvcmlnaW5hdG9yIHZhbGlkYXRvciBvZiB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogCQkJT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuIAotCSAqIEBwYXJhbSBncm91cE5hbWUKLQkgKiAJCQluYW1lIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLiAKLQkgKi8KLQl2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYTJlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLQotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRvIHNlcGFyYXRlIHRoZSBJVmFsaWRhdG9yIGZyb20gdGhlIG1vZGVsIGxvYWRpbmcuIEEgbW9kZWwgCi0gKiBpcyBhIGdyb3VwIG9mIG9iamVjdChzKSB0aGF0IG11c3QgZm9sbG93IHNvbWUgcnVsZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBtb2RlbCBpcyBsb2FkZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpcyBydW5uaW5nIGluIAotICogVUkgb3IgaGVhZGxlc3MgY29udGV4dC4gSWYgdGhlIDxjb2RlPmxvYWRNb2RlbDwvY29kZT4gbWV0aG9kIHdhcyBhIG1ldGhvZCBvbiB0aGUgSVZhbGlkYXRvciwgCi0gKiB0aGVuIHRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgdHdvIHZlcnNpb25zIG9mIHZhbGlkYXRvcnMsIG9uZSBmb3IgaGVhZGxlc3MgYW5kIG9uZSBmb3IgCi0gKiBVSS4gQmVjYXVzZSA8Y29kZT5sb2FkTW9kZWw8L2NvZGU+IGlzIHNlcGFyYXRlIGZyb20gdGhlIElWYWxpZGF0b3IsIHdlIHByb3ZpZGUgCi0gKiB0d28gZGlmZmVyZW50IElIZWxwZXJzIGluc3RlYWQsIGFuZCBzaGlwIHRoZSBvbmUgc3BlY2lmaWMgdG8gdGhlIGVudmlyb25tZW50LgotICogPC9wPgotICogPHA+Ci0gKiBFYWNoIElWYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBsb2FkcyBhIHNwZWNpZmljIG1vZGVsIGFzIGlkZW50aWZpZWQgYnkgYSBTdHJpbmcKLSAqIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4uIFRoZSBzeW1ib2xpY05hbWUgY2FuIGJlIGFueSB2YWx1ZSBleGNlcHQgbnVsbCBvciB0aGUgCi0gKiBlbXB0eSBzdHJpbmcuIEVhY2ggdmFsaWRhdG9yIGlkZW50aWZpZXMgdGhlIHN5bWJvbGljIG5hbWVzIHdoaWNoIGl0IG5lZWRzLCBhbmQgdGhlCi0gKiB0eXBlIG9mIG1vZGVsIHdoaWNoIG5lZWRzIHRvIGJlIHJldHVybmVkIHdoZW4gdGhhdCBzeW1ib2xpYyBuYW1lIGlzIGxvYWRlZCB2aWEgYSAKLSAqIDxjb2RlPmxvYWRNb2RlbDwvY29kZT4gbWV0aG9kLiBBbiBJVmFsaWRhdGlvbkNvbnRleHQgY2FuIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBJVmFsaWRhdG9yOyAKLSAqIHRoZSBoZWxwZXIgbmVlZHMgdG8gc3VwcG9ydCBldmVyeSBtb2RlbCB0aGF0IGVhY2ggdmFsaWRhdG9yIG5lZWRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uQ29udGV4dCB7Ci0JLyoqCi0JICogPHA+Ci0JICogTG9hZCB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+Ljxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gCi0JICogbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggCi0JICogSGVhZGxlc3MgYW5kIFVJLgotCSAqIAotCSAqIFRoZSBzeW1ib2xpY05hbWUgaXMgYSBzdHJpbmcgbmFtZSB0aGF0IGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIElWYWxpZGF0b3JDb250ZXh0LiBGb3IgYW4gZXhhbXBsZSBvdXIgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxvYWRNb2RlbCB1c2UKLQkgKiBtZXRob2QgbmFtZXMgZm9yIHN5bWJvbGljTmFtZXMgdG8gbG9hZCB0aGUgbW9kZWwgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZC4gVXNlcnMgY2FuCi0JICogdXNlIHRoZWlyIG93biBtb2RlbCBsb2FkIG1lY2hhbmlzbS4KLQkgKiBAc2VlIDxjb2RlPldvcmtiZW5jaENvbnRleHQ8L2NvZGU+Ci0JICogCi0JICogPC9wPgotCSAqIEBwbGFubmVkZm9yIDEuMAotCSAqLwotCU9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gYW5kIDxjb2RlPnBhcm1zPC9jb2RlPi4KLQkgKiA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+IG11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsaWRhdG9yIAotCSAqIG5lZWRzIHRvIGJlIHJ1biBpbiBib3RoIEhlYWRsZXNzIGFuZCBVSS4gSWYgPGNvZGU+cGFybXM8L2NvZGU+IGlzIG51bGwgdGhlbiB0aGlzCi0JICogbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMKLQkgKiAKLQkgKiBAbGluayAjbG9hZE1vZGVsKFN0cmluZykuCi0JICogCi0JICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tCi0JICogQGxpbmsgI2xvYWRNb2RlbChTdHJpbmcpIGJlY2F1c2UgaXQgdGFrZXMgcGFyYW1ldGVycywgZnJvbSB0aGUgSVZhbGlkYXRvciwgd2hpY2ggCi0JICogCQkgYXJlIGF2YWlsYWJsZSBvbmx5IGF0IHJ1bnRpbWUuIElmIHlvdSBuZWVkIHRvIHBhc3MgYSBsaXZlIG9iamVjdCB0byB0aGUgSVZhbGlkYXRpb25Db250ZXh0LCAKLQkgKiAJCSB0aGlzIGlzIHRoZSBsb2FkTW9kZWwgbWV0aG9kIHRvIHVzZS4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHN5bWJvbGljTmFtZSBTdHJpbmcgaWRlbnRpZmllciBmb3IgbW9kZWwKLQkgKiBAcGFyYW0gcGFybXMgCSAgIHBhcm1zIGxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHRoZSBtb2RlbCB0YWtlcyBmb3IgaW52b2NhdGlvbgotCSAqIAotCSAqIFtpc3N1ZSA6IENTIC0gSXQncyBub3QgYXQgYWxsIGNsZWFyIGhvdyB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIGdldCBwYXNzZWQgaW50byBhIGhlbHBlci4gIEknZCBzdWdnZXN0Ci0JICogcHJvdmlkaW5nIGdldFByb3BlcnR5KCkgYW5kIHNldFByb3BlcnR5KCkgbWV0aG9kcyBvbiB0aGUgY2xhc3MgdG8gYWxsb3cgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB0byBiZSAKLQkgKiBzdXBwbGllZCBhbmQgcXVlcmllZCBpbiBhIGdlbmVyaWMgbWFubmVyLl0KLQkgKi8KLQlPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IHdpdGggdGhlIGxpc3Qgb2YgVVJJJ3MgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZCBpbiB0aGUKLQkgKiBjYXNlIG9mIEluY3JlbWVudGFsIGJ1aWxkCi0JICovCi0JCi0JU3RyaW5nW10gZ2V0VVJJcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZTljOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIFZhbGlkYXRvcnMuIEEgVmFsaWRhdG9yIGlzIGEgY2xhc3Mgd2hpY2ggdmVyaWZpZXMgdGhhdCBvYmplY3RzCi0gKiBmb2xsb3cgc29tZSBydWxlcy4gRm9yIGV4YW1wbGUsIGluIGEgTU9GIG1vZGVsIHdoaWNoIHJlcHJlc2VudHMgYW4gRUpCIGphciwgdGhlIEVKQiBzcGVjaWZpY2F0aW9uCi0gKiBkZXRlcm1pbmVzIHRoZSBydWxlcy4gPGJyPgotICogPGJyPgotICogQSB2YWxpZGF0b3IgY2FuIHBlcmZvcm0gZnVsbCB2YWxpZGF0aW9uIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIEFsbCB2YWxpZGF0b3JzIG11c3QgaW1wbGVtZW50Ci0gKiBmdWxsIHZhbGlkYXRpb24gYnV0IGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgb3B0aW9uYWwuIDxicj4KLSAqIDxicj4KLSAqIEVhY2ggdmFsaWRhdG9yIG11c3Qgbm90IGJlIHRpZWQgdG8gYW55IHBhcnRpY3VsYXIgd29ya2JlbmNoIGltcGxlbWVudGF0aW9uLiA8YnI+Ci0gKiA8YnI+Ci0gKiBBIHZhbGlkYXRvcidzIHZlcmlmaWNhdGlvbiBzdGFydHMgd2hlbiB0aGUgVmFsaWRhdG9yTGF1bmNoZXIgc2luZ2xldG9uIGNhbGxzCi0gKiA8Y29kZT52YWxpZGF0ZTwvY29kZT4uCi0gKiAKLSAqIFtpc3N1ZTogTE0gLSBUaGlzIGludGVyZmFjZSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjYW5kaWRhdGUgZm9yCi0gKiAgYW4gYWJzdHJhY3QgY2xhc3MuIF0gICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yewotCS8qKgotCSAqIDxwPgotCSAqIFBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJZiBjbGVhbnVwIHdpbGwgdGFrZSBzb21lIHRpbWUsIHRoZQotCSAqIElWYWxpZGF0b3Igc2hvdWxkIHJlcG9ydCBzdWJ0YXNrIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIElSZXBvcnRlciBwYXJhbWV0ZXIuIFRoZQotCSAqIElSZXBvcnRlciBwYXJhbWV0ZXIgd2lsbCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHJlcG9ydGVyIHVzZWQgZm9yIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyCi0JICogQHBsYW5uZWRmb3IgV1RQIDEuMAotCSAqIAotCSAqIFtpc3N1ZSA6IENTIC0gUGVyaGFwcyB0aGUgSVZhbGlkYXRvciBzaG91bGQgYmUgcmVxdWlyZWQgdG8gcHJvdmlkZSBhICduYW1lJyB0aGF0IGNhbiBiZSB1c2VkIGRlc2NyaWJlIAotCSAqIHRoZSBydW5uaW5nIHZhbGlkYXRpb24gJ0pvYicuICBUaGVuIHRoZSBmcmFtZXdvcmsgY291bGQgYXV0b21hdGljYWxseSBzYXkgc29tZXRoaW5nIGxpa2UgJ1hZWiB2YWxpZGF0b3IgOiBjbGVhbnVwJy4KLQkgKiBSZWx5aW5nIG9uIHRoZSBJVmFsaWRhdG9yIHRvIHByb3ZpZGUgc3VidGFzayBpbmZvcm1hdGlvbiBzZWVtcyBlcnJvciBwcm9uZS5dCi0JICogW2lzc3VlOiBMTSAtIElzIHRoZSBjbGVhbnVwIG1ldGhvZCBuZWNlc3Nhcnk/IENhbiB0aGUgZnJhbWV3b3JrIHB1dCBhIHJlcXVpcmVtZW50IHRoYXQgY2xpZW50IHZhbGlkYXRvcnMgJ2NsZWFuIHVwJwotCSAqICBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIHZhbGlkYXRlIG1ldGhvZD8gXSAKLQkgKi8KLQl2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5oZWxwZXI8L2NvZGU+IGFuZCA8Y29kZT5yZXBvcnRlcjwvY29kZT4gbWF5IG5vdCBiZSBudWxsLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+Ci0JICogbWF5IGJlIG51bGwsIGlmIGEgZnVsbCBidWlsZCBpcyBkZXNpcmVkLiA8YnI+Ci0JICogPGJyPgotCSAqIEBwYXJhbSBoZWxwZXIgCi0JICogCQkJbG9hZHMgYW4gb2JqZWN0LiAKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiAJCQlJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvciBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyLgotCSAqIAotCSAqIFtpc3N1ZSA6IENTIC0gSSdtIGN1cmlvdXMgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIHZhbGlkYXRvciBpcyBub3QgaW52b2tlZCBkaXJlY3RseSBvbiBhIGZpbGUuICBJdCBzZWVtcyBpdCBzaG91bGQgYmUgdGhlCi0JICogZG9tYWluIG9mIGFub3RoZXIgQVBJIHRvIG1hbmFnZSBtYW5hZ2UgaW5jcmVtZW50YWwgZmlsZSBjaGFuZ2VzIGFuZCB0cmlnZ2VyaW5nIHZhbGlkYXRpb25zIGFjY29yZGluZ2x5LiAKLQkgKiBEbyB3ZSBoYXZlIGEgY3VycmVudCB1c2UgY2FzZSBpbiBXVFAgd2hlcmUgdGhlIHZhbGlkYXRvciBkb2VzIGFueXRoaW5nIG1vcmUgdmFsaWRhdGUgYSBmaWxlIGZyb20gdGhlIGNoYW5nZWRGaWxlcyBsaXN0P10KLQkgKi8KLQl2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDhhNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBKb2IgaW50ZXJmYWNlIGZvciB0aGUgdmFsaWRhdG9yLiBWYWxpZGF0b3JzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBhcmUgZXhlY3V0ZWQgYXMKLSAqIGJhY2tncm91bmQgam9icy4gCi0gKiBGb2xsb3dpbmcgaXMgYSAgc2VxdWVuY2Ugb2YgIGNhbGwgIDxici8+Ci0gKiB2YWxpZGF0b3IuZ2V0U2NoZWR1bGluZ1J1bGUoaGVscGVyKSA8YnIvPgotICogdmFsaWRhdG9yLnZhbGlkYXRlKHJlcG9ydGVyKQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRvckpvYiBleHRlbmRzIElWYWxpZGF0b3J7Ci0KLQlJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotCSAqIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotCSAqIDxicj4KLSAgICAgKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqICAgICAgICAgICAgSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIHVzZXIuCi0JICogQHBhcmFtIGhlbHBlciB3aWxsIG5vdCBiZSBudWxsLAotCSAqCQlsb2FkcyBhbiBvYmplY3QuCi0JICovCi0JSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNjaGVkdWxpbmcgcnVsZSwgd2hpY2ggdGhlIGZyYW1ld29yayBhcHBsaWVzIHRvIHRoZSBWYWxpZGF0b3Igam9iLCAKLQkgKiBAcGFyYW0gaGVscGVyIHdpbGwgbm90IGJlIG51bGwsCi0JICoJCWxvYWRzIGFuIG9iamVjdC4KLQkgKiBAcmV0dXJuCi0JICovCi0JSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2MmRkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkKLSAqIAotICogQHNlZSBJUmVwb3J0ZXIjYWRkTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkgbWV0aG9kIGlmIG5vIG1vcmUgbWVzc2FnZXMgY2FuIGJlIHJlcG9ydGVkCi0gKiAgICAgIGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGhhcyBiZWVuIHJlcG9ydGVkLgotICogW2lzc3VlOiBMTSAtIEdvaW5nIGFsb25nIHdpdGggbXkgY29tbWVudCBvbiB0aGUgYWRkTWVzc2FnZSBtZXRob2QgaW4gSVJlcG9ydGVyIEkgCi0gKiAgdGhpbmsgdGhpcyBjbGFzcyBzaG91bGQgYmUgaW50ZXJuYWwgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhIG5lZWQgZm9yIHRoaXMgY2xhc3MgdG8gYmUgZXhwb3NlZCB0byBjbGllbnRzLiBJZiB0b28gbWFueQotICogIG1lc3NhZ2VzIGFyZSBhZGRlZCB0aGUgZnJhbWV3b3JrIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRob3V0IG5vdGlmeWluZyB0aGUgY2xpZW50Ci0gKiAgdmFsaWRhdG9yLiBdCi0gKiAgQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gVGhlIGZyYW1ld29yayBpcwotICogIG5vdCBnb2luZyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCBieSBhIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDM0ODk3MTkwNzQ1NzY2OTQwTDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ3MGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjI7Ci0KLS8qKgotICogVGhlIGNsYXNzIHRoYXQgYWxsIFZhbGlkYXRvcnMgdGhhdCB3aXNoIHRvIHVzZSB2ZXJzaW9uIHR3byBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdWJjbGFzcy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBWMiBfcGFyZW50OwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSByZXNvdXJjZS4gVGhlIHZhbGlkYXRvciBpcyBjYWxsZWQgZnJvbSBhIFdvcmtzcGFjZUpvYiwgc28gdGhlIHZhbGlkYXRvciBpdHNlbGYgZG9lcyBub3QgbmVlZAotCSAqIHRvIGVzdGFibGlzaCBpdCdzIG93biBJV29ya3NwYWNlUnVubmFibGUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIHdheSB0aGUgcmVzb3VyY2UgY2hhbmdlZC4gSXQgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIGtpbmQgcGFyYW1ldGVyCi0JICogaW4gSVJlc291cmNlRGVsdGEuCi0JICogCi0JICogQHBhcmFtIHN0YXRlIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotCSAqIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhlIHZhbGlkYXRpb24gcGhhc2UsIHRoaXMgb2JqZWN0IHdpbGwgYmUgY2xlYXJlZCwKLQkgKiB0aGVyZWJ5IGFsbG93aW5nIGFueSBvZiB0aGlzIHN0YXRlIGluZm9ybWF0aW9uIHRvIGJlIGdhcmJhZ2VkIGNvbGxlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IgdGhhdCB5b3UgY2FuIHVzZSB0byByZXBvcnQgeW91ciBwcm9ncmVzcy4gVG8gYmUgYSB3ZWxsIGJlaGF2ZWQgdmFsaWRhdG9yIHlvdSBuZWVkCi0JICogdG8gY2hlY2sgdGhlIGlzQ2FuY2VsbGVkKCkgbWV0aG9kIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHZhbGlkYXRpb24uIFRoaXMgbWF5IGJlLCBidXQgdXN1YWxseSBpc24ndCwgbnVsbC4gCi0JICovCi0JcHVibGljIGFic3RyYWN0IFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGJlaW5nIGNsZWFuZWQsIHRoaXMgbWV0aG9kIGdpdmVzIHRoZSB2YWxpZGF0b3IgYSBjaGFuY2UgdG8gZG8gYW55IHNwZWNpYWwgY2xlYW51cC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCSAqIDxwPgotCSAqIElmIHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIGJlaW5nIGNsZWFuZWQsIHRoZW4gdGhlIGZpcnN0IGNhbGwgd2lsbCBoYXZlIGEgbnVsbCBwcm9qZWN0LCBhbmQgdGhlbiB0aGVyZSB3aWxsIGJlCi0JICogc3Vic2VxdWVudCBjYWxscyBmb3IgZWFjaCBvcGVuIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBiZWluZyBjbGVhbmVkLiBUaGlzIG1heSBiZSBudWxsLCB3aGljaCBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHdvcmtzcGFjZQotCSAqIGlzIGJlaW5nIGNsZWFuZWQuIAotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZSBhIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8KLQkgKiB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW4oSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewkJCi0JfQotCQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0JICogaW5pdGlhbGl6YXRpb24gdGhhdCB0aGV5IG1pZ2h0IG5lZWQuIAotCSAqICAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgaW4gdGhlIHZhbGlkYXRpb24gcGhhc2UsCi0JICogdGhpcyB3aWxsIGJlIG51bGwuIFRoYXQgaXMgdGhlIHNpZ25hbCB0byB0aGUgdmFsaWRhdG9yIHRoYXQgYSB0b3AgbGV2ZWwgdmFsaWRhdGlvbiBpcyBzdGFydGluZy4KLQkgKiBTdWJzZXF1ZW50bHksIHRoZSBwcm9qZWN0IHdpbGwgYmUgc2V0LCBhcyBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHByb2plY3RzIGFyZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXRlIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotCSAqIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewkJCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLQkgKiBjbGVhbnVwIHRoYXQgdGhleSBtaWdodCBuZWVkIHRvIGRvLiAgCi0JICogIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgd2FzIHZhbGlkYXRlZC4gVGhlIHZlcnkgbGFzdCBjYWxsIGluIHRoZSB2YWxpZGF0aW9uIHdpbGwgc2V0IHRoaXMgdG8gCi0JICogbnVsbCBzbyB0aGF0IHRoZSB2YWxpZGF0b3Iga25vd3MgdGhhdCBhbGwgdGhlIHByb2plY3RzIGhhdmUgbm93IGJlZW4gdmFsaWRhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZSBhIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8KLQkgKiB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7CQkKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHZhbGlkYXRvciBpcyBhbGxvd2VkIHRvIGFzc2VydCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB2YXJpb3VzIHJlc291cmNlcy4gVGhlIGRlZmF1bHQgd291bGQgYmUgdG8gCi0JICogc2NvcGUgdGhlc2UgYXNzZXJ0aW9ucyB3aXRoIHRoZSB2YWxpZGF0b3IncyBleHRlbnNpb24gcG9pbnQgaWQuIElmIGEgdmFsaWRhdG9yIHdvdWxkIGxpa2UgdG8gc2hhcmUKLQkgKiB0aGVzZSBhc3NlcnRpb25zIHdpdGggb3RoZXIgdmFsaWRhdG9ycywgdGhleSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIG92ZXJyaWRlIHRoZSBpZCB0aGF0IGlzIHVzZWQKLQkgKiB0byBzY29wZSB0aGUgYXNzZXJ0aW9ucy4KLQkgKiA8cD4KLQkgKiBTbyBmb3IgZXhhbXBsZSBpZiB5b3UgaGFkIHR3byB2YWxpZGF0b3JzIHRoYXQgd2FudGVkIHRvIHNoYXJlIHRoZSBhc3NlcnRpb25zLiBUaGUgc2Vjb25kIHZhbGlkYXRvciB3b3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnN3ZXIgdGhlIGZpcnN0IHZhbGlkYXRvcidzIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gbnVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZGVmYXVsdCBzY29wZSB3aWxsIGJlIHVzZWQuCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlcGVuZGVuY3lJZCgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3IgdGhhdCB5b3UgYmVsb25nIHRvLiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xzIGNvbnRyb2xzIHRoZSBmaWx0ZXJzIGFuZCB2YXJpb3VzIG90aGVyIHNldHRpbmdzLiAKLQkgKi8KLQlwdWJsaWMgVjIgZ2V0UGFyZW50KCl7Ci0JCXJldHVybiBfcGFyZW50OwotCX0KLQkKLQl2b2lkIHNldFBhcmVudChWMiBwYXJlbnQpewotCQlfcGFyZW50ID0gcGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRiODZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEEgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gYW5vdGhlciByZXNvdXJjZS4KLSAqIDxwPgotICogVGhpcyBpcyByZXR1cm5lZCBieSB0aGUgSURlcGVuZGVuY3lJbmRleC4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbnRSZXNvdXJjZSB7Ci0JcHJpdmF0ZSBJUmVzb3VyY2UgCV9yZXNvdXJjZTsKLQlwcml2YXRlIFZhbGlkYXRvcglfdmFsaWRhdG9yOwotCQotCXB1YmxpYyBEZXBlbmRlbnRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIFZhbGlkYXRvciB2YWxpZGF0b3IpewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIF9yZXNvdXJjZTsKLQl9Ci0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDY0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmllbmQgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZXNzYWdlcyhWYWxpZGF0b3IgdmFsaWRhdG9yLCBNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtYXApIHsKLQkJdmFsaWRhdG9yLnNldE1lc3NhZ2VzKG1hcCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDUzMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFRoaXMgc2VydmljZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlc291cmNlcyB0aGF0IGEgcGFydGljdWxhciByZXNvdXJjZSBkZXBlbmRzIG9uLgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIG9wdGlvbmFsIHNlcnZpY2UsIHZhbGlkYXRvcnMgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgSW50ZXJmYWNlIGFuZCBjYW4gc2ltcGx5IHN1cHBseQotICogdGhlaXIgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0aHJvdWdoIHRoZSBWYWxpZGF0aW9uUmVzdWx0IHJldHVybiByZXN1bHQuCi0gKiAKLSAqIEBzZWUgVmFsaWRhdGlvblJlc3VsdAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUluZGV4IHsKLQkKLQkvKioKLQkgKiBBc3NlcnQgdGhhdCBvbmUgcmVzb3VyY2UgZGVwZW5kcyBvbiBhbm90aGVyIHJlc291cmNlIGFzIHBhcnQgb2YgaXQncyB2YWxpZGl0eS4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgaWYgYW4gWE1MIGZpbGUgaXMgZGVwZW5kZW50IG9uIGFuIFhTRCBmaWxlIHRvIGJlIHZhbGlkLCB0aGUgcmVzb3VyY2UgdGhhdCBob2xkcwotCSAqIHRoZSBYTUwgZmlsZSB3b3VsZCBiZSB0aGUgZGVwZW5kZW50LCBhbmQgdGhlIHJlc291cmNlIHRoYXQgaG9sZHMgdGhlIFhTRCB3b3VsZCBiZSB0aGUgZGVwZW5kc09uLgotCSAqICAKLQkgKiBAcGFyYW0gaWQgdGhlIHZhbGlkYXRvciBpZCB0aGF0IGlzIGFzc2VydGluZyB0aGF0IHRoZSBkZXBlbmRlbmN5IGV4aXN0cy4KLQkgKiBAcGFyYW0gZGVwZW5kZW50IHRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgcmVzb3VyY2UuCi0JICogQHBhcmFtIGRlcGVuZHNPbiB0aGUgcmVzb3VyY2UgdGhhdCB0aGlzIGJlaW5nIGRlcGVuZGVkIG9uLgotCSAqLwotCXZvaWQgYWRkKFN0cmluZyBpZCwgSVJlc291cmNlIGRlcGVuZGVudCwgSVJlc291cmNlIGRlcGVuZHNPbik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZGVwZW5kZW5jeSBhc3NlcnRpb25zIGZvciB0aGlzIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQl2b2lkIGNsZWFyKElQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKiAKLQkgKiBBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmRzIG9uIHRoaXMgcmVzb3VyY2UuCi0JICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgcmVzb3VyY2Ugd2FzIGFuIFhTRCwgdGhpcyBjb3VsZCBhbnN3ZXIgYWxsIHRoZSBYTUwgZmlsZXMgdGhhdAotCSAqIGRlcGVuZGVkIG9uIGl0IGZvciB0aGVpciB2YWxpZGl0eS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgYSByZXNvdXJjZSB0aGF0IG90aGVyIHJlc291cmNlcyBtYXkgZGVwZW5kIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlcGVuZGVudCByZXNvdXJjZXMuCi0JICovCi0JTGlzdDxEZXBlbmRlbnRSZXNvdXJjZT4gZ2V0KElSZXNvdXJjZSByZXNvdXJjZSk7Ci0JCi0JLyoqIAotCSAqIEFuc3dlciBhbGwgdGhlIHJlc291cmNlcyB0aGF0IGRlcGVuZHMgb24gdGhpcyByZXNvdXJjZS4KLQkgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyByZXNvdXJjZSB3YXMgYW4gWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0JICogZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgdmFsaWRhdG9yIGlkIHRoYXQgYXNzZXJ0ZWQgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdGVkLgotCSAqIEBwYXJhbSByZXNvdXJjZSBhIHJlc291cmNlIHRoYXQgb3RoZXIgcmVzb3VyY2VzIG1heSBkZXBlbmQgb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZGVwZW5kZW50IHJlc291cmNlcy4gVGhpcyBtZXRob2QgY2FuIGFsc28gcmV0dXJuIG51bGwsIGlmIHRoZXJlIGFyZSBubwotCSAqIGRlcGVuZGVudCByZXNvdXJjZXMuCi0JICovCi0JSVJlc291cmNlW10gZ2V0KFN0cmluZyBpZCwgSVJlc291cmNlIHJlc291cmNlKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiBvdGhlciByZXNvdXJjZXMgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBiZWluZyB0ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgdmFsaWRhdG9yJ3MgYXNzZXJ0ZWQgYSBkZXBlbmRlbmN5IG9uIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JYm9vbGVhbiBpc0RlcGVuZGVkT24oSVJlc291cmNlIHJlc291cmNlKTsKLQkKLQkvKioKLQkgKiBSZXBsYWNlIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIGRlcGVuZGVudCBkZXBlbmRzT24uCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSB2YWxpZGF0b3IgaWQgdGhhdCBpcyBhc3NlcnRpbmcgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdHMuCi0JICogQHBhcmFtIGRlcGVuZGVudCB0aGUgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHJlc291cmNlLgotCSAqIEBwYXJhbSBkZXBlbmRzT24gYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgZGVwZW5kZWQgb24uIFRoaXMgY2FuIGJlIG51bGwgb3IgYSB6ZXJvIGxlbmd0aCBhcnJheSwKLQkgKiBpbiB3aGljaCBjYXNlIGFsbCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIHNldChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZVtdIGRlcGVuZHNPbik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlOTQyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBzZXJ2aWNlIHRoYXQgY29sbGVjdHMgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gb24gdmFsaWRhdGlvbiBvcGVyYXRpb25zLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGVyZm9ybWFuY2VNb25pdG9yIHsKLQkKLQlwdWJsaWMgZW51bSBDb2xsZWN0aW9uTGV2ZWwge05vbmUsIERlZmF1bHR9Ci0JCi0JLyoqIAotCSAqIEFkZCB0aGlzIHBlcmZvcm1hbmNlIGNvdW50ZXIgdG8gdGhlIG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgZGVjaWRlIHdoYXQgdG8gCi0JICogZG8gd2l0aCB0aGUgcmVzdWx0cywgaXQgbWF5IGxvZyB0aGVtIHRvIGEgZmlsZSwgb3IgaXQgbWF5IHNpbXBseSBob2xkIG9uIHRvIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGNvdW50ZXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFBlcmZvcm1hbmNlQ291bnRlcnMgY291bnRlcnMpOwotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHdlIGhhdmUgYmVlbiBhc2tlZCB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGV2ZW50cy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3RpbmcoKTsKLQkKLQkvKiogQW5zd2VyIHRydWUgaWYgb25seSBzdW1tYXJ5IGluZm9ybWF0aW9uIGlzIHdhbnRlZC4gKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1bW1hcnlPbmx5KCk7Ci0JCi0JLyoqIAotCSAqIFNldCB0aGUgcGVyZm9ybWFuY2UgZXZlbnQgY29sbGVjdGlvbiBsZXZlbC4gVGhpcyBjb250cm9scyB3aGljaCBwZXJmb3JtYW5jZSBldmVudHMgYXJlCi0JICogY29sbGVjdGVkLCBpbmNsdWRpbmcgbm9uZSBvZiB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgbGV2ZWwgdG8gY29sbGVjdC4gVGhlIGRlZmF1bHQgaXMgdG8gbm90IGNvbGxlY3QgYW55dGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbkxldmVsKENvbGxlY3Rpb25MZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBsZXZlbCBvZiBwZXJmb3JtYW5jZSBldmVudHMgdGhhdCBhcmUgYmVpbmcgY29sbGVjdGVkIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkxldmVsIGdldENvbGxlY3Rpb25MZXZlbCgpOwotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHNvIGZhci4gU29tZSBtb25pdG9ycyBkbwotCSAqIG5vdCBzYXZlIGNvdW50ZXJzLCBhbmQgdGhleSB3aWxsIGFsd2F5cyByZXR1cm4gYW4gZW1wdHkgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXNTdW1tYXJ5IGlmIHRydWUgb25seSBhbnN3ZXIgYSBzdW1tYXJ5IG9mIHRoZSBjb3VudGVycwotCSAqLwotCXB1YmxpYyBMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+IGdldFBlcmZvcm1hbmNlQ291bnRlcnMoYm9vbGVhbiBhc1N1bW1hcnkpOwotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29sbGVjdGVkIHBlcmZvcm1hbmNlIGNvdW50ZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UGVyZm9ybWFuY2VDb3VudGVycygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVGFyZ2V0T2JqZWN0QWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVRhcmdldE9iamVjdEFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjMjYzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVGFyZ2V0T2JqZWN0QWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgdG8gY29udmVydCBhbiBhcmJpdHJhcnkgdGFyZ2V0IG9iamVjdCBpbiBhIHZhbGlkYXRpb24gbWVzc2FnZSAobGlrZSBhbiBFT2JqZWN0KSB0byBhbgotICogSVJlc291cmNlLiBUaGUgSVJlc291cmNlIGNhbiB0aGVuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBmb3IgSU1hcmtlcnMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXJnZXRPYmplY3RBZGFwdG9yIHsKLQkKLQkvKiogCi0JICogTWFwIGFuIG9iamVjdCB0byBpdCdzIGFzc29jaWF0ZWQgcmVzb3VyY2UuIAotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiBhbiBhcHByb3ByaWF0ZSByZXNvdXJjZSBjYW4gbm90IGJlIGZvdW5kLgotCSAqLyAKLQlwdWJsaWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBhYmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1lc3NhZ2VzOwotCi0vKioKLSAqIEFzc29jaWF0ZSBhIG1lc3NhZ2Ugc2V2ZXJpdHkgd2l0aCBhIG1lc3NhZ2UgY2F0ZWdvcnkuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVNldmVyaXR5U2V0dGluZyB7Ci0JcHVibGljIGVudW0gU2V2ZXJpdHkgewotCQlFcnJvcihWYWxNZXNzYWdlcy5TZXZFcnJvciwgSU1hcmtlci5TRVZFUklUWV9FUlJPUiksCi0JCVdhcm5pbmcoVmFsTWVzc2FnZXMuU2V2V2FybmluZywgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKSwKLQkJSWdub3JlKFZhbE1lc3NhZ2VzLlNldklnbm9yZSwgSU1hcmtlci5TRVZFUklUWV9JTkZPKTsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIF9zZXZlcml0eUxhYmVsOwotCQlwcml2YXRlIFNldmVyaXR5KFN0cmluZyBsYWJlbCwgaW50IG1hcmtlclNldmVyaXR5KXsKLQkJCV9zZXZlcml0eUxhYmVsID0gbGFiZWw7Ci0JCQlfbWFya2VyU2V2ZXJpdHkgPSBtYXJrZXJTZXZlcml0eTsKLQkJfQotCQlwcml2YXRlIGludAkJX21hcmtlclNldmVyaXR5OwotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gX3NldmVyaXR5TGFiZWw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1hcmtlclNldmVyaXR5KCkgewotCQkJcmV0dXJuIF9tYXJrZXJTZXZlcml0eTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZwkJX2lkOwotCXByaXZhdGUgU3RyaW5nIAkJX2xhYmVsOwotCXByaXZhdGUgU2V2ZXJpdHkgCV9kZWZhdWx0OwotCXByaXZhdGUgU2V2ZXJpdHkgCV9jdXJyZW50OwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbGFiZWwgYW5kIGEgbWVzc2FnZSBzZXZlcml0eS4gCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhcnRpY3VsYXIgc2V0dGluZy4gVGhpcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICogc2NvcGUgb2YgdGhpcyBwYXJ0aWN1bGFyIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgYW4gZW5kIHVzZXIgc3RyaW5nLAotCSAqIHRoYXQgY2FuIGRlc2NyaWJlIGVpdGhlciBhbiBpbmRpdmlkdWFsIG1lc3NhZ2Ugb3IgYSBtZXNzYWdlIGNhdGVnb3J5LgotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0U2V2ZXJpdHkgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgZm9yIHRoaXMgbGFiZWwuIElmIHRoZSB1c2VyIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCi0JICogdGhpcyBpcyB3aGF0IHRoZSBzZXZlcml0eSB3aWxsIGJlLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTZXZlcml0eSBkZWZhdWx0U2V2ZXJpdHkpewotCQlfaWQgPSBpZDsKLQkJX2xhYmVsID0gbGFiZWw7Ci0JCV9kZWZhdWx0ID0gZGVmYXVsdFNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBfbGFiZWw7Ci0JfQotCi0JcHVibGljIFNldmVyaXR5IGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBfZGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU2V2ZXJpdHkgZ2V0Q3VycmVudCgpIHsKLQkJaWYgKF9jdXJyZW50ICE9IG51bGwpcmV0dXJuIF9jdXJyZW50OwotCQlyZXR1cm4gX2RlZmF1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9pZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50KFNldmVyaXR5IHNldmVyaXR5KSB7Ci0JCV9jdXJyZW50ID0gc2V2ZXJpdHk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfaWQgKyAiICIgKyBnZXRDdXJyZW50KCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIGNvcHkoKSB7Ci0JCU1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgPSBuZXcgTWVzc2FnZVNldmVyaXR5U2V0dGluZyhfaWQsIF9sYWJlbCwgX2RlZmF1bHQpOwotCQltcy5fY3VycmVudCA9IF9jdXJyZW50OwotCQlyZXR1cm4gbXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODZmNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNZXNzYWdlczsKLQotLyoqCi0gKiBTb21lIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIGZvciBhIHZhbGlkYXRpb24gaW52b2NhdGlvbi4gVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlLgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VDb3VudGVycyB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgCV92YWxpZGF0b3JJZDsKLQlwcml2YXRlIFN0cmluZwlfdmFsaWRhdG9yTmFtZTsKLQlwcml2YXRlIFN0cmluZwlfcmVzb3VyY2VOYW1lOwotCXByaXZhdGUgaW50CQlfbnVtYmVySW52b2NhdGlvbnM7Ci0JcHJpdmF0ZQlsb25nCV9lbGFwc2VkVGltZTsKLQlwcml2YXRlIGxvbmcJX2NwdVRpbWU7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkYXRvcklkCi0JICogQHBhcmFtIHZhbGlkYXRvck5hbWUKLQkgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIAotCSAqIEBwYXJhbSBudW1iZXJJbnZvY2F0aW9ucyBudW1iZXIgb2YgdGltZXMgdGhlIHZhbGlkYXRvciB3YXMgaW52b2tlZAotCSAqIEBwYXJhbSBlbGFwc2VkVGltZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCi0JICogQHBhcmFtIGNwdVRpbWUgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMKLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VDb3VudGVycyhTdHJpbmcgdmFsaWRhdG9ySWQsIFN0cmluZyB2YWxpZGF0b3JOYW1lLCBTdHJpbmcgcmVzb3VyY2VOYW1lLCAKLQkJaW50IG51bWJlckludm9jYXRpb25zLCBsb25nIGVsYXBzZWRUaW1lLCBsb25nIGNwdVRpbWUpewotCQlfdmFsaWRhdG9ySWQgPSB2YWxpZGF0b3JJZDsKLQkJX3ZhbGlkYXRvck5hbWUgPSB2YWxpZGF0b3JOYW1lOwotCQlfcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotCQlfbnVtYmVySW52b2NhdGlvbnMgPSBudW1iZXJJbnZvY2F0aW9uczsKLQkJX2VsYXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7Ci0JCV9jcHVUaW1lID0gY3B1VGltZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3JJZDsKLQl9Ci0JcHVibGljIGludCBnZXROdW1iZXJJbnZvY2F0aW9ucygpIHsKLQkJcmV0dXJuIF9udW1iZXJJbnZvY2F0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIF9lbGFwc2VkVGltZTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMuIElmIHRoaXMgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotCSAqIGFuc3dlciAtMTsKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRDcHVUaW1lKCkgewotCQlyZXR1cm4gX2NwdVRpbWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5Mb2dWYWxFbmRUaW1lLAkKLQkJCW5ldyBPYmplY3RbXXtfdmFsaWRhdG9yTmFtZSwgX3ZhbGlkYXRvcklkLCBfcmVzb3VyY2VOYW1lLCBNaXNjLmdldFRpbWVNUyhfZWxhcHNlZFRpbWUpfSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBhc1N1bW1hcnkpewotCQlpZiAoYXNTdW1tYXJ5KXsKLQkJCWlmIChfY3B1VGltZSAhPSAtMSlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuTG9nVmFsU3VtbWFyeTIsIAotCQkJCW5ldyBPYmplY3RbXXtfdmFsaWRhdG9yTmFtZSwgX3ZhbGlkYXRvcklkLCBfbnVtYmVySW52b2NhdGlvbnMsIAotCQkJCQlNaXNjLmdldFRpbWVNUyhfZWxhcHNlZFRpbWUpLCBNaXNjLmdldFRpbWVOYW5vKF9jcHVUaW1lKX0pOwotCQkJCi0JCQlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuTG9nVmFsU3VtbWFyeSwgCi0JCQkJCW5ldyBPYmplY3RbXXtfdmFsaWRhdG9yTmFtZSwgX3ZhbGlkYXRvcklkLCBfbnVtYmVySW52b2NhdGlvbnMsIE1pc2MuZ2V0VGltZU1TKF9lbGFwc2VkVGltZSl9KTsKLQkJfQotCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvck5hbWUoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTg0NWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NYXJrZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHRlbXBvcmFyeSBjbGFzcyB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogPHA+Ci0gKiBUaGlzIGlzIG5vdCBBUEkuIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydGVySGVscGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgCV9tb25pdG9yOwotCXByaXZhdGUgTGlzdDxJTWVzc2FnZT4JCV9saXN0ID0gbmV3IExpbmtlZExpc3Q8SU1lc3NhZ2U+KCk7Ci0JCi0JcHVibGljIFJlcG9ydGVySGVscGVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCV9tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3Igb3JpZ2luLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCV9saXN0LmFkZChtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlfbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UuZ2V0VGV4dCh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JfQotCi0JcHVibGljIExpc3Q8SU1lc3NhZ2U+IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gX2xpc3Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCXJldHVybiBfbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4pIHsKLQkJX2xpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCkgewotCQlfbGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpIHsKLQkJX2xpc3QuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZU1hcmtlcnMoKXsKLQkJTWFya2VyTWFuYWdlci5nZXREZWZhdWx0KCkubWFrZU1hcmtlcnMoX2xpc3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NjVhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRGVwZW5kZW5jeUluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLk1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5QZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2VudHJhbCBjbGFzcyBvZiB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBnZXREZWZhdWx0KCkgbWV0aG9kLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uRnJhbWV3b3JrIHsKLQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5kZXggCQkJX2RlcGVuZGVuY3lJbmRleDsKLQlwcml2YXRlIElQZXJmb3JtYW5jZU1vbml0b3IJCQlfcGVyZm9ybWFuY2VNb25pdG9yOwotCQotCXByaXZhdGUgU2V0PElQcm9qZWN0PiAJCQkJX3N1c3BlbmRlZFByb2plY3RzOwotCXByaXZhdGUgYm9vbGVhbiAJCQkJCV9zdXNwZW5kQWxsVmFsaWRhdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25GcmFtZXdvcmsgCV9tZTsKLQkKLQkvKiogCi0JICogQW5zd2VyIHRoZSBzaW5nbGV0b24sIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25GcmFtZXdvcmsgZ2V0RGVmYXVsdCgpewotCQlpZiAoX21lID09IG51bGwpX21lID0gbmV3IFZhbGlkYXRpb25GcmFtZXdvcmsoKTsKLQkJcmV0dXJuIF9tZTsKLQl9Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0aW9uRnJhbWV3b3JrKCl7fQotCQotCS8qKgotCSAqIENsZWFyIGFueSB2YWxpZGF0aW9uIG1hcmtlcnMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSB0aGlzIHZhbGlkYXRvci4KLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IG1heSBoYXZlIGl0J3MgbWFya2VycyBjbGVhcmVkCi0JICogQHBhcmFtIHZhbGlkYXRvcklkIHRoZSBpZCBvZiB2YWxpZGF0b3IgdGhhdCBjcmVhdGVkIHRoZSBtYXJrZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1lc3NhZ2VzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbGlkYXRvcklkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpLmNsZWFyTWFya2VyKHJlc291cmNlLCB2YWxpZGF0b3JJZCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgZGVwZW5kZW5jeSBpbmRleC4gVmFsaWRhdG9ycyBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc291cmNlcyBkZXBlbmQgb24gd2hpY2gKLQkgKiBvdGhlciByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIElEZXBlbmRlbmN5SW5kZXggZ2V0RGVwZW5kZW5jeUluZGV4KCl7Ci0JCWlmIChfZGVwZW5kZW5jeUluZGV4ICE9IG51bGwpcmV0dXJuIF9kZXBlbmRlbmN5SW5kZXg7Ci0JCXJldHVybiBnZXREZXBlbmRlbmN5SW5kZXgyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSURlcGVuZGVuY3lJbmRleCBnZXREZXBlbmRlbmN5SW5kZXgyKCkgewotCQlpZiAoX2RlcGVuZGVuY3lJbmRleCA9PSBudWxsKV9kZXBlbmRlbmN5SW5kZXggPSBuZXcgRGVwZW5kZW5jeUluZGV4KCk7Ci0JCXJldHVybiBfZGVwZW5kZW5jeUluZGV4OwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElQZXJmb3JtYW5jZU1vbml0b3IgZ2V0UGVyZm9ybWFuY2VNb25pdG9yKCl7Ci0JCWlmIChfcGVyZm9ybWFuY2VNb25pdG9yID09IG51bGwpewotCQkJYm9vbGVhbiB0cmFjZVRpbWVzID0gTWlzYy5kZWJ1Z09wdGlvbkFzQm9vbGVhbihEZWJ1Z0NvbnN0YW50cy5UcmFjZVRpbWVzKTsKLQkJCVN0cmluZyB0cmFjZUZpbGUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihEZWJ1Z0NvbnN0YW50cy5UcmFjZVRpbWVzRmlsZSk7Ci0KLQkJCV9wZXJmb3JtYW5jZU1vbml0b3IgPSBQZXJmb3JtYW5jZU1vbml0b3IuY3JlYXRlKHRyYWNlVGltZXMsIHRyYWNlRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIF9wZXJmb3JtYW5jZU1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGhvbGRzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlU3RvcmUoKXsKLQkJcmV0dXJuIG5ldyBJbnN0YW5jZVNjb3BlKCkuZ2V0Tm9kZShWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0JfQotCQotCXB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hSZXBvcnRlcihwcm9qZWN0LCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UsIGV2ZW4gaWYgdGhlCi0JICogdmFsaWRhdG9yIGhhcyBiZWVuIHR1cm5lZCBvZmYgYnkgdGhlIHVzZXIuCi0JICogPHA+Ci0JICogVGhlIGNhbGxlciBtYXkgc3RpbGwgbmVlZCB0byB0ZXN0IGlmIHRoZSB2YWxpZGF0b3IgaGFzIGJlZW4gdHVybmVkIG9mZiBieSB0aGUKLQkgKiB1c2VyLCBieSB1c2luZyB0aGUgaXNCdWlsZFZhbGlkYXRpb24oKSBhbmQgaXNNYW51YWxWYWxpZGF0aW9uKCkgbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGRldGVybWluZXMgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGljYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaXNNYW51YWwgaWYgdHJ1ZSB0aGVuIHRoZSB2YWxpZGF0b3IgbXVzdCBiZSB0dXJuZWQgb24gZm9yIG1hbnVhbCB2YWxpZGF0aW9uLiAKLQkgKiBJZiBmYWxzZSB0aGVuIHRoZSBpc01hbnVhbFZhbGlkYXRpb24gc2V0dGluZyBpc24ndCB1c2VkIHRvIGZpbHRlciBvdXQgdmFsaWRhdG9ycy4KLQkgKiAgIAotCSAqIEBwYXJhbSBpc0J1aWxkIGlmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9uLgotCSAqIElmIGZhbHNlIHRoZW4gdGhlIGlzQnVpbGRWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIgb3V0IHZhbGlkYXRvcnMuICAKLQkgKiAKLQkgKiBAc2VlIFZhbGlkYXRvciNpc0J1aWxkVmFsaWRhdGlvbigpCi0JICogQHNlZSBWYWxpZGF0b3IjaXNNYW51YWxWYWxpZGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yW10gZ2V0VmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQlmb3IgKFZhbGlkYXRvciB2YWwgOiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JzKHByb2plY3QpKXsKLQkJCWlmICh2YWwuc2hvdWxkVmFsaWRhdGUocmVzb3VyY2UsIGlzTWFudWFsLCBpc0J1aWxkKSlsaXN0LmFkZCh2YWwpOwotCQl9Ci0JCQotCQlWYWxpZGF0b3JbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBzaG91bGQgbm90IHZhbGlkYXRlIHRoZSByZXNvdXJjZSwgZWl0aGVyIGJlY2F1c2UKLQkgKiB0aGVpciBmaWx0ZXJzIGRvbid0IHN1cHBvcnQgdGhlIHJlc291cmNlLCBvciB0aGUgdmFsaWRhdG9yIGhhcyBiZWVuIGRpc2FibGVkIGZvcgotCSAqIGJvdGggYnVpbGQgdmFsaWRhdGlvbiBhbmQgbWFudWFsIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3I+IGdldERpc2FibGVkVmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlTZXQ8VmFsaWRhdG9yPiBzZXQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3I+KDEwKTsKLQkJZm9yIChWYWxpZGF0b3IgdmFsIDogVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KSl7Ci0JCQlib29sZWFuIHZhbGlkYXRlSXQgPSBmYWxzZTsKLQkJCWlmICh2YWwuc2hvdWxkVmFsaWRhdGUocmVzb3VyY2UsIGZhbHNlLCBmYWxzZSkpewotCQkJCXZhbGlkYXRlSXQgPSB2YWwuaXNCdWlsZFZhbGlkYXRpb24oKSB8fCB2YWwuaXNNYW51YWxWYWxpZGF0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoIXZhbGlkYXRlSXQpc2V0LmFkZCh2YWwpOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgZ2xvYmFsIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmFsaWRhdG9yKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCkgd2l0aCBhIG51bGwgcHJvamVjdCBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyBpZCl7Ci0JCXJldHVybiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JXaXRoSWQoaWQsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBpZCB0aGF0IGlzIGluIGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+Ci0JICogSW5kaXZpZHVhbCBwcm9qZWN0cyBtYXkgb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2Ugc2V0dGluZ3MuIElmIHRoaXMgaXMgYWxsb3dlZCBhbmQgaWYKLQkgKiB0aGUgcHJvamVjdCBoYXMgaXQncyBvd24gc2V0dGluZ3MsIHRoZW4gdGhvc2UgdmFsaWRhdG9ycyBhcmUgcmV0dXJuZWQgdmlhIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIGFwcHJvYWNoIGlzIHVzZWQuIEZvciB2ZXJzaW9uIDEgdmFsaWRhdG9ycywgdGhlIHZhbGlkYXRvciBpcyBvbmx5IHJldHVybmVkIGlmIGl0Ci0JICogaXMgZGVmaW5lZCB0byBvcGVyYXRlIG9uIHRoaXMgcHJvamVjdCB0eXBlLiBUaGlzIGlzIHRoZSB3YXkgdGhhdCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrCi0JICogZGlkIGl0LiBGb3IgdmVyc2lvbiAyIHZhbGlkYXRvcnMsIHRoZXkgYXJlIGFsbCByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHZhbGlkYXRvciBpZC4KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGlzIGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIGFyZSBjaGVja2VkLgotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCl7Ci0JCXJldHVybiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JXaXRoSWQoaWQsIHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWNhYmxlLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogZ2V0VmFsaWRhdG9yc0ZvcihyZXNvdXJjZSwgZmFsc2UsIGZhbHNlKSl7Ci0JCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpIHx8IHYuaXNNYW51YWxWYWxpZGF0aW9uKCkpbGlzdC5hZGQodik7Ci0JCX0KLQkJVmFsaWRhdG9yW10gdmFscyA9IG5ldyBWYWxpZGF0b3JbbGlzdC5zaXplKCldOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KHZhbHMpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIGFueSBlbmFibGVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIGEgZmlsZSwgZm9sZGVyIG9yIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsIGlmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBtYW51YWwgdmFsaWRhdGlvbi4gCi0JICogSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIgb3V0IHZhbGlkYXRvcnMuCi0JICogICAKLQkgKiBAcGFyYW0gaXNCdWlsZCBpZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi4KLQkgKiBJZiBmYWxzZSB0aGVuIHRoZSBpc0J1aWxkVmFsaWRhdGlvbiBzZXR0aW5nIGlzbid0IHVzZWQgdG8gZmlsdGVyIG91dCB2YWxpZGF0b3JzLiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsaWRhdG9ycyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCXJldHVybiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5oYXNWYWxpZGF0b3JzKHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCk7Ci0JfQotCQotCS8qKgotCSAqIFdhaXRzIHVudGlsIGFsbCB2YWxpZGF0aW9uIGpvYnMgYXJlIGZpbmlzaGVkLiAgVGhpcyBtZXRob2Qgd2lsbCBibG9jayB0aGUgCi0JICogY2FsbGluZyB0aHJlYWQgdW50aWwgYWxsIHN1Y2ggam9icyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZywgb3IgdW50aWwgdGhpcyB0aHJlYWQgaXMKLQkgKiBpbnRlcnJ1cHRlZC4gICBJZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBqb2JzIGluIAotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSB3YWl0aW5nLCBydW5uaW5nLCBvciBzbGVlcGluZywgdGhpcyBtZXRob2QgcmV0dXJucyAKLQkgKiBpbW1lZGlhdGVseS4gIEZlZWRiYWNrIG9uIGhvdyB0aGUgam9pbiBpcyBwcm9ncmVzc2luZyBpcyBwcm92aWRlZCB0byBhIHByb2dyZXNzIG1vbml0b3IuCi0JICogPHA+Ci0JICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHRoZSBqb2IgbWFuYWdlciBpcyBzdXNwZW5kZWQsIG9ubHkgam9icwotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIHdpbGwgYmUgam9pbmVkOyBPbmNlIHRoZXJlIGFyZSBubyBqb2JzCi0JICogaW4gdGhlIGZhbWlseSBpbiB0aGUge0BsaW5rIEpvYiNSVU5OSU5HfSBzdGF0ZSwgdGhpcyBtZXRob2QgcmV0dXJucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVhZGxvY2sgcmlzayB3aGVuIHVzaW5nIGpvaW4uICBJZiB0aGUgY2FsbGluZyB0aHJlYWQgb3ducwotCSAqIGEgbG9jayBvciBvYmplY3QgbW9uaXRvciB0aGF0IHRoZSBqb2luZWQgdGhyZWFkIGlzIHdhaXRpbmcgZm9yLCBkZWFkbG9jayAKLQkgKiB3aWxsIG9jY3VyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyByZXN1bHQgaW4gc3RhcnZhdGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQgaWYKLQkgKiBhbm90aGVyIHRocmVhZCBjb250aW51ZXMgdG8gYWRkIGpvYnMgb2YgdGhlIGdpdmVuIGZhbWlseSwgb3IgaWYgYQotCSAqIGpvYiBpbiB0aGUgZ2l2ZW4gZmFtaWx5IHJlc2NoZWR1bGVzIGl0c2VsZiBpbiBhbiBpbmZpbml0ZSBsb29wLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBQcm9ncmVzcyBtb25pdG9yIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3Mgb24gaG93IHRoZQotCSAqIHdhaXQgaXMgcHJvZ3Jlc3NpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgcmVxdWlyZWQuCi0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGlzIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBjYW5jZWxlZCB3aGlsZSB3YWl0aW5nCi0JICovCi0JcHVibGljIHZvaWQgam9pbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBtb25pdG9yKTsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFZhbGlkYXRpb25CdWlsZGVyLkZBTUlMWV9WQUxJREFUSU9OX0pPQiwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFN1c3BlbmRzLCBvciB1bmRvZXMgdGhlIHN1c3BlbnNpb24gb2YsIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC4gSWYgInN1c3BlbmQiIGlzCi0JICogdHJ1ZSB0aGVuIHZhbGlkYXRpb24gaXMgc3VzcGVuZGVkIGFuZCBpZiBpdCdzICJmYWxzZSIgdGhlbiB2YWxpZGF0aW9uIGlzIG5vdCBzdXNwZW5kZWQgb24gdGhlCi0JICogcHJvamVjdC4gVGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgbm90IHBlcnNpc3RlZC4KLQkgKiA8cD4KLQkgKiBCZSBWRVJZIENBUkVGVUwgd2hlbiB5b3UgdXNlIHRoaXMgbWV0aG9kISBUdXJuIHZhbGlkYXRpb24gYmFjayBvbiBpbiBhIGZpbmFsbHkgYmxvY2sgYmVjYXVzZQotCSAqIGlmIHRoZSBjb2RlIHdoaWNoIHN1c3BlbmRlZCB2YWxpZGF0aW9uIGNyYXNoZXMsIHRoZSB1c2VyIGhhcyBubyB3YXkgdG8gcmVzZXQgdGhlIHN1c3BlbnNpb24uCi0JICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIHNodXQgZG93biBhbmQgcmVzdGFydCB0aGUgd29ya2JlbmNoIHRvIGdldCB2YWxpZGF0aW9uIHRvIHdvcmsgYWdhaW4uCi0JICogPC9wPgotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgdG8gYmUgc3VzcGVuZGVkIG9yIHVuc3VzcGVuZGVkLgotCSAqIEBwYXJhbSBzdXNwZW5kIGlmIHRydWUgdmFsaWRhdGlvbiBvbiB0aGUgcHJvamVjdCB3aWxsIGJlIHN1c3BlbmQuIElmIGZhbHNlIGl0IHdpbGwgbm90IGJlIHN1c3BlbmRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIHN1c3BlbmQpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm47Ci0JCWlmIChzdXNwZW5kKWdldFN1c3BlbmRlZFByb2plY3RzKCkuYWRkKHByb2plY3QpOwotCQllbHNlIGdldFN1c3BlbmRlZFByb2plY3RzKCkucmVtb3ZlKHByb2plY3QpOwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8SVByb2plY3Q+IGdldFN1c3BlbmRlZFByb2plY3RzKCl7Ci0JCWlmIChfc3VzcGVuZGVkUHJvamVjdHMgPT0gbnVsbClfc3VzcGVuZGVkUHJvamVjdHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8SVByb2plY3Q+KDIwKSk7Ci0JCXJldHVybiBfc3VzcGVuZGVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZHMsIG9yIHVuZG9lcyB0aGUgc3VzcGVuc2lvbiBvZiwgdmFsaWRhdGlvbiBvbiBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtiZW5jaC4gSWYKLQkgKiAic3VzcGVuZCIgaXMgdHJ1ZSB0aGVuIHZhbGlkYXRpb24gaXMgc3VzcGVuZGVkIGFuZCBpZiBpdCdzICJmYWxzZSIgdGhlbiB2YWxpZGF0aW9uIGlzIG5vdCBzdXNwZW5kZWQuCi0JICogVGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgbm90IHBlcnNpc3RlZC4KLQkgKiA8cD4KLQkgKiBCZSBWRVJZIENBUkVGVUwgd2hlbiB5b3UgdXNlIHRoaXMgbWV0aG9kISBUdXJuIHZhbGlkYXRpb24gYmFjayBvbiBpbiBhIGZpbmFsbHkgYmxvY2sgYmVjYXVzZQotCSAqIGlmIHRoZSBjb2RlIHdoaWNoIHN1c3BlbmRlZCB2YWxpZGF0aW9uIGNyYXNoZXMsIHRoZSB1c2VyIGhhcyBubyB3YXkgdG8gcmVzZXQgdGhlIHN1c3BlbnNpb24uCi0JICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIHNodXQgZG93biBhbmQgcmVzdGFydCB0aGUgd29ya2JlbmNoIHRvIGdldCB2YWxpZGF0aW9uIHRvIHdvcmsgYWdhaW4uCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZEFsbFZhbGlkYXRpb24oYm9vbGVhbiBzdXNwZW5kKSB7Ci0JCV9zdXNwZW5kQWxsVmFsaWRhdGlvbiA9IHN1c3BlbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgInN1c3BlbmQgYWxsIiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBfc3VzcGVuZEFsbFZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gd2lsbCBub3QgcnVuIG9uIHRoZSBwcm9qZWN0IGJlY2F1c2UgaXQncyBiZWVuIHN1c3BlbmRlZC4gVGhpcwotCSAqIG1ldGhvZCBjaGVja3Mgb25seSB0aGUgc3VzcGVuc2lvbiBzdGF0dXM7IGlmIHZhbGlkYXRpb24gY2Fubm90IHJ1biBmb3Igc29tZSBvdGhlciByZWFzb24gKGZvcgotCSAqIGV4YW1wbGUsIHRoZXJlIGFyZSBubyBlbmFibGVkIHZhbGlkYXRvcnMpLCB5ZXQgdGhlIElQcm9qZWN0IGlzIG5vdCBzdXNwZW5kZWQsIHRoaXMgbWV0aG9kCi0JICogd2lsbCByZXR1cm4gdHJ1ZSBldmVuIHRob3VnaCB2YWxpZGF0aW9uIHdpbGwgbm90IHJ1bi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChfc3VzcGVuZEFsbFZhbGlkYXRpb24pcmV0dXJuIHRydWU7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0U3VzcGVuZGVkUHJvamVjdHMoKS5jb250YWlucyhwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBjb2RlIHRoYXQgaXMgcHJlcGFyaW5nIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBvbiBhCi0JICogcHJvamVjdC4gUmF0aGVyIHRoYW4gY2FsbGluZyBpc1N1c3BlbmRlZChJUHJvamVjdCksIHdoaWNoIHdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBhbGwgdmFsaWRhdGlvbgotCSAqIGhhcyBiZWVuIHN1c3BlbmRlZC4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyB0ZXN0ZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBzdXNwZW5kZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RTdXNwZW5kZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldFN1c3BlbmRlZFByb2plY3RzKCkuY29udGFpbnMocHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBwcm9qZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0cyB0byBiZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsCi0JICogICAgICAgICAgICBJcyB0aGlzIGJlaW5nIGRvbmUgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uPyBpLmUuIGRpZAotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc2VsZWN0IHRoZSBWYWxpZGF0ZSBtZW51IGl0ZW0/Ci0JICogCi0JICogQHBhcmFtIGlzQnVpbGQKLQkgKiAgICAgICAgICAgIElzIHRoaXMgYmVpbmcgZG9uZSBhcyBwYXJ0IG9mIGEgYnVpbGQ/Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIHJlc3VsdCB3aGljaCBpcyB0aGUgY29tYmluZWQgcmVzdWx0IGZvciBhbGwgdGhlCi0JICogICAgICAgICByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdHMgdmFsaWRhdGUoSVByb2plY3RbXSBwcm9qZWN0cywgZmluYWwgYm9vbGVhbiBpc01hbnVhbCwgZmluYWwgYm9vbGVhbiBpc0J1aWxkLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlWYWxPcGVyYXRpb24gdm8gPSBWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKGNyZWF0ZU1hcChwcm9qZWN0cyksIGlzTWFudWFsLCBpc0J1aWxkLCBtb25pdG9yKTsKLQkJcmV0dXJuIHZvLmdldFJlc3VsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSBwcm9qZWN0cyBhcyBhIG1hcC4KLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKi8KLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IGNyZWF0ZU1hcChJUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJZmluYWwgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IG1hcCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4oMTAwMCk7Ci0JCQkKLQkJZm9yIChJUHJvamVjdCBwIDogcHJvamVjdHMpewotCQkJU2V0PElSZXNvdXJjZT4gc2V0ID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigxMDAwKTsKLQkJCVJlc291cmNlQWRkZXIgcmEgPSBuZXcgUmVzb3VyY2VBZGRlcihzZXQpOwotCQkJcC5hY2NlcHQocmEpOwotCQkJbWFwLnB1dChwLCBzZXQpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBZGRlciBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IgewotCQkKLQkJcHJpdmF0ZSBTZXQ8SVJlc291cmNlPiBfc2V0OwotCQkKLQkJLyoqCi0JCSAqIEEgY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gYWRkIHJlc291cmNlcyB0byBhIHNldC4KLQkJICogQHBhcmFtIHNldCB0aGUgc2V0IHdoZXJlIHRoZSByZXNvdXJjZXMgYXJlIGFkZGVkLgotCQkgKi8KLQkJcHVibGljIFJlc291cmNlQWRkZXIoU2V0PElSZXNvdXJjZT4gc2V0KXsKLQkJCV9zZXQgPSBzZXQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCV9zZXQuYWRkKHJlc291cmNlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmZhYzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogVGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgdmFsaWRhdGUgb3BlcmF0aW9uLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SZXN1bHQgewotCQotCXByaXZhdGUgTGlzdDxWYWxpZGF0b3JNZXNzYWdlPiBfbWVzc2FnZXM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWVzc2FnZVtdIF9ub01lc3NhZ2VzID0gbmV3IFZhbGlkYXRvck1lc3NhZ2VbMF07Ci0JCi0JcHJpdmF0ZSBib29sZWFuCQlfY2FuY2VsZWQ7Ci0JCi0JLyoqIAotCSAqIFRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uIFRoaXMgY2FuIGJlIGxlZnQgbnVsbC4KLQkgKiBGb3IgZXhhbXBsZSwgYW4gWE1MIGZpbGUgbWF5IGRlcGVuZCBvbiBhIFhTRCBpbiBvcmRlciB0byBrbm93IGlmIGl0IGlzIHZhbGlkIG9yIG5vdC4KLQkgKiBJdCB3b3VsZCBwYXNzIGJhY2sgdGhlIFhTRCBmaWxlLiAKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZVtdCV9kZXBlbmRzT247Ci0JCi0JLyoqIAotCSAqIFRoZSBvYmplY3RzIHRoYXQgeW91IHZhbGlkYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHZhbGlkYXRpbmcgdGhpcyBvYmplY3QuIFRoZSBmcmFtZXdvcmsgd2lsbCBub3QKLQkgKiBjYWxsIHlvdSB3aXRoIGFueSBvZiB0aGVzZSBvYmplY3RzIChpbiB0aGlzIHZhbGlkYXRpb24gcnVuKS4gVGhpcyBjYW4gYmUgbGVmdCBudWxsLgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlW10gX3ZhbGlkYXRlZDsKLQkKLQlwcml2YXRlIGludAkJCV9zZXZlcml0eUVycm9yOwotCXByaXZhdGUgaW50CQkJX3NldmVyaXR5V2FybmluZzsKLQlwcml2YXRlIGludAkJCV9zZXZlcml0eUluZm87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdAlfc3VzcGVuZFZhbGlkYXRpb247Ci0JCi0JLyoqIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZC4gKi8KLQlwcml2YXRlIGludAkJCV9udW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcyA9IDE7Ci0JCi0JcHJpdmF0ZSBSZXBvcnRlckhlbHBlcglfcmVwb3J0ZXI7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uRXhjZXB0aW9uCV92YWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoaXMgaXMgYW4gb3B0aW9uYWwgbWV0aG9kLCB0aGF0IGEgdmFsaWRhdG9yIGNhbiB1c2UgdG8gcmV0dXJuIGVycm9yIG1lc3NhZ2VzLiBXaGVuIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yawotCSAqIGlzIGludm9raW5nIHRoZSB2YWxpZGF0b3IgdGhlc2Ugd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBJTWFya2Vycy4gSWYgdGhlIHZhbGlkYXRvciBpcyBiZWluZyBjYWxsZWQgZGlyZWN0bHkgdGhlbgotCSAqIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHVzaW5nIHRoZSBtZXNzYWdlcy4KLQkgKiA8cD4KLQkgKiBUaGUgc2NlbmFyaW8gdGhhdCBtb3RpdmF0ZWQgdGhpcyBtZXRob2QsIGlzIHdoZW4gYSB2YWxpZGF0b3IgaXMgdXNlZCBib3RoIGZvciBhcy15b3UtdHlwZSB2YWxpZGF0aW9uIGFuZCBiYXRjaAotCSAqIHZhbGlkYXRpb24uIEluIHRoaXMgc2NlbmFyaW8gdGhlIHZhbGlkYXRvciB3aGVuIGNhbGxlZCBpbiBhcy15b3UtdHlwZSBtb2RlIGRvZXNuJ3Qgd2FudCB0byBkaXJlY3RseSBjcmVhdGUgSU1hcmtlcnMsCi0JICogYmVjYXVzZSB0aGUgcmVzb3VyY2UgaGFzbid0IGV2ZW4gYmVlbiBzYXZlZC4gSXQgbmVlZHMgdG8gcmV0dXJuIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIElNYXJrZXIuIEJ1dCB3aGVuIGNhbGxlZAotCSAqIGluIGJhdGNoIG1vZGUsIGl0IGRvZXMgdWx0aW1hdGVseSB3YW50IElNYXJrZXJzLiBCeSByZXR1cm5pbmcgVmFsaWRhdG9yTWVzc2FnZXMsIGl0IG9ubHkgbmVlZHMgdG8gcmV0dXJuIG9uZSB0eXBlCi0JICogb2YgbWVzc2FnZSwgYW5kIHRob3NlIG1lc3NhZ2VzIGNhbiBiZSBlaXRoZXIgYmUgZGlyZWN0bHkgdXNlZCBieSB0aGUgY2FsbGVyLCBvciBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBpbnRvIElNYXJrZXJzIGJ5Ci0JICogdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqIDxwPgotCSAqIFRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29tcGxpY2F0ZWQgdGhlcmUgaXMgYSB0aGlyZCB3YXkgdG8gcmV0dXJuIG1lc3NhZ2VzLiBUbyBtYWtlIGl0IGVhc2llciBmb3IgCi0JICogb2xkIHZhbGlkYXRvcnMgdG8gcG9ydCB0byB0aGUgbmV3IGZyYW1ld29yaywgdGhleSBjYW4gY29udGludWUgdG8gdXNlIGFuIElSZXBvcnRlci4gSWYgYSB2YWxpZGF0b3IgY2FsbHMgdGhlCi0JICogZ2V0UmVwb3J0ZXIoKSBtZXRob2QgdGhlbiBpdCBpcyBhc3N1bWVkIGJ5IHRoZSBmcmFtZXdvcmsgdGhhdCB0aGF0IGlzIHRoZSBhcHByb2FjaCB0aGF0IHRoZXkgaGF2ZSBjaG9zZW4uICAKLQkgKiAKLQkgKiBAc2VlICNnZXRSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYWxpZGF0b3JNZXNzYWdlIG1lc3NhZ2UpewotCQlnZXRNZXNzYWdlTGlzdCgpLmFkZChtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFuIElSZXBvcnRlciBmb3IgaGFuZGluZyBlcnJvciBtZXNzYWdlcy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgdHJhbnNpdGlvbiBtZXRob2QsIHRvIGhlbHAgb2xkIHZhbGlkYXRvcnMgcG9ydCB0byB0aGUgbmV3IHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJZiB0aGlzIG1ldGhvZAotCSAqIGlzIGNhbGxlZCBpdCBpcyBhc3N1bWVkIGJ5IHRoZSBmcmFtZXdvcmssIHRoYXQgdGhpcyBJUmVwb3J0IHdpbGwgYmUgdXNlZCBhcyB0aGUgb25seSB3YXkgb2YgcGFzc2luZyBtZXNzYWdlcwotCSAqIGJhY2sgdG8gdGhlIGZyYW1ld29yay4KLQkgKiAKLQkgKiBAc2VlICNhZGQoVmFsaWRhdG9yTWVzc2FnZSkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJaWYgKF9yZXBvcnRlciA9PSBudWxsKV9yZXBvcnRlciA9IG5ldyBSZXBvcnRlckhlbHBlcihtb25pdG9yKTsKLQkJcmV0dXJuIF9yZXBvcnRlcjsKLQl9Ci0JCi0JUmVwb3J0ZXJIZWxwZXIgZ2V0UmVwb3J0ZXJIZWxwZXIoKXsKLQkJcmV0dXJuIF9yZXBvcnRlcjsKLQl9Ci0JCi0JLyoqCi0JICogTWVyZ2UgdGhlIG1lc3NhZ2UgY291bnRzIGFuZCBtZXNzYWdlcyBmcm9tIGFuIGluZGl2aWR1YWwgdmFsaWRhdG9yIGludG8gdGhpcyByZXN1bHQuCi0JICogQHBhcmFtIHJlc3VsdCBpdCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlUmVzdWx0cyhWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCl7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbClyZXR1cm47Ci0JCQotCQlWYWxpZGF0b3JNZXNzYWdlW10gbXNncyA9IHJlc3VsdC5nZXRNZXNzYWdlcygpOwotCQlmb3IgKFZhbGlkYXRvck1lc3NhZ2UgbSA6IG1zZ3MpewotCQkJYWRkKG0pOwotCQkJaW50IHNldmVyaXR5ID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgMCk7Ci0JCQlzd2l0Y2ggKHNldmVyaXR5KXsKLQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLQkJCQlpbmNyZW1lbnRFcnJvcigxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotCQkJCWluY3JlbWVudFdhcm5pbmcoMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLQkJCQlpbmNyZW1lbnRJbmZvKDEpOwotCQkJCWJyZWFrOwotCQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaW5jcmVtZW50RXJyb3IocmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSk7Ci0JCWluY3JlbWVudFdhcm5pbmcocmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpKTsKLQkJaW5jcmVtZW50SW5mbyhyZXN1bHQuZ2V0U2V2ZXJpdHlJbmZvKCkpOwotCQkKLQkJX251bWJlck9mVmFsaWRhdGVkUmVzb3VyY2VzICs9IHJlc3VsdC5nZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcygpOwotCQkKLQl9Ci0KLQotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBfZGVwZW5kc09uOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0b3IuIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1lc3NhZ2VbXSBnZXRNZXNzYWdlcygpewotCQlpZiAoX21lc3NhZ2VzID09IG51bGwpcmV0dXJuIF9ub01lc3NhZ2VzOwotCQlWYWxpZGF0b3JNZXNzYWdlW10gbXNncyA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlW19tZXNzYWdlcy5zaXplKCldOwotCQlfbWVzc2FnZXMudG9BcnJheShtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uIFRoaXMgY2FuIGJlIGxlZnQgbnVsbC4KLQkgKiBGb3IgZXhhbXBsZSwgYW4gWE1MIGZpbGUgbWF5IGRlcGVuZCBvbiBhIFhTRCBpbiBvcmRlciB0byBrbm93IGlmIGl0IGlzIHZhbGlkIG9yIG5vdC4KLQkgKiBJdCB3b3VsZCBwYXNzIGJhY2sgdGhlIFhTRCBmaWxlLiAKLQkgKiAKLQkgKiBAcGFyYW0gZGVwZW5kc09uIGlmIHRoaXMgaXMgbnVsbCB0aGVuIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIG5vdCB1cGRhdGVkLiBUbyByZW1vdmUgdGhlCi0JICogZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiwgYW4gZW1wdHkgYXJyYXkgbmVlZHMgdG8gYmUgc3VwcGxpZWQuIEEgbm9uIG51bGwgcGFyYW1ldGVyLCA8Yj5yZXBsYWNlczwvYj4gYWxsIHRoZQotCSAqIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRvci4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwZW5kc09uKElSZXNvdXJjZVtdIGRlcGVuZHNPbikgewotCQlfZGVwZW5kc09uID0gZGVwZW5kc09uOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8VmFsaWRhdG9yTWVzc2FnZT4gZ2V0TWVzc2FnZUxpc3QoKXsKLQkJaWYgKF9tZXNzYWdlcyA9PSBudWxsKV9tZXNzYWdlcyA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvck1lc3NhZ2U+KCk7Ci0JCXJldHVybiBfbWVzc2FnZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBbGwgdGhlIHJlc291cmNlcyB0aGF0IHdlcmUgdmFsaWRhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2YgdmFsaWRhdGluZyB0aGUgbWFpbiByZXNvdXJjZSwgb3IgbnVsbCBpZiBub25lIHdlcmUuCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFZhbGlkYXRlZCgpIHsKLQkJcmV0dXJuIF92YWxpZGF0ZWQ7Ci0JfQotCQotCS8qKgotCSAqIEluZGljYXRlIHRoYXQgYWRkaXRpb25hbCByZXNvdXJjZXMgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGUgb3BlcmF0aW9uLiAKLQkgKiBTb21ldGltZXMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIGEgdmFsaWRhdGlvbiBvbiBvbmUgb25lIHJlc291cmNlIGl0IGlzCi0JICogbmVjZXNzYXJ5IHRvIHZhbGlkYXRlIG90aGVyIHJlc291cmNlcyBhcyB3ZWxsLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGxldCB0aGUgZnJhbWV3b3JrIGtub3cgYWJvdXQgdGhlc2UgCi0JICogYWRkaXRpb25hbCB2YWxpZGF0ZWQgcmVzb3VyY2VzLCB0byBwb3NzaWJseSBzYXZlIHRoZW0gYmVpbmcgdmFsaWRhdGVkIHJlZHVuZGFudGx5LgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZWQoSVJlc291cmNlW10gdmFsaWRhdGVkKSB7Ci0JCV92YWxpZGF0ZWQgPSB2YWxpZGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eUVycm9yKCkgewotCQlyZXR1cm4gX3NldmVyaXR5RXJyb3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0JICogaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5RXJyb3IoaW50IHNldmVyaXR5RXJyb3IpIHsKLQkJX3NldmVyaXR5RXJyb3IgPSBzZXZlcml0eUVycm9yOwotCX0KLQkKLQotCS8qKgotCSAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiBlcnJvcnMuCi0JICovCi0JcHVibGljIGludCBpbmNyZW1lbnRFcnJvcihpbnQgZXJyb3JzKXsKLQkJX3NldmVyaXR5RXJyb3IgKz0gZXJyb3JzOwotCQlyZXR1cm4gX3NldmVyaXR5RXJyb3I7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5V2FybmluZygpIHsKLQkJcmV0dXJuIF9zZXZlcml0eVdhcm5pbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHlXYXJuaW5nKGludCBzZXZlcml0eVdhcm5pbmcpIHsKLQkJX3NldmVyaXR5V2FybmluZyA9IHNldmVyaXR5V2FybmluZzsKLQl9Ci0KLQkvKioKLQkgKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiB3YXJuaW5ncy4KLQkgKi8KLQlwdWJsaWMgaW50IGluY3JlbWVudFdhcm5pbmcoaW50IHdhcm5pbmdzKXsKLQkJX3NldmVyaXR5V2FybmluZyArPSB3YXJuaW5nczsKLQkJcmV0dXJuIF9zZXZlcml0eVdhcm5pbmc7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5SW5mbygpIHsKLQkJcmV0dXJuIF9zZXZlcml0eUluZm87Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHlJbmZvKGludCBzZXZlcml0eUluZm8pIHsKLQkJX3NldmVyaXR5SW5mbyA9IHNldmVyaXR5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIGludCBpbmNyZW1lbnRJbmZvKGludCBpbmZvKXsKLQkJX3NldmVyaXR5SW5mbyArPSBpbmZvOwotCQlyZXR1cm4gX3NldmVyaXR5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBXYXMgdGhlIG9wZXJhdGlvbiBjYW5jZWxlZCBiZWZvcmUgaXQgY29tcGxldGVkPyBGb3IgZXhhbXBsZSBpZiB0aGUgdmFsaWRhdGlvbiBpcyBiZWluZyBydW4gdGhyb3VnaCB0aGUKLQkgKiBVSSwgdGhlIGVuZCB1c2VyIGNhbiBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aHJvdWdoIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiBfY2FuY2VsZWQ7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQuCi0JICogQHBhcmFtIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiBjYW5jZWxlZCkgewotCQlfY2FuY2VsZWQgPSBjYW5jZWxlZDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChfdmFsaWRhdGVkID09IG51bGwpcmV0dXJuIF9udW1iZXJPZlZhbGlkYXRlZFJlc291cmNlczsKLQkJcmV0dXJuIF9udW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcyArIF92YWxpZGF0ZWQubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uRXhjZXB0aW9uIGdldFZhbGlkYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfdmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsaWRhdGlvbiBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24sIGl0IGNhbiBiZSByZWNvcmRlZCBoZXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGZvciBvbGQgdmFsaWRhdG9ycyB0byBlYXNlIHRoZWlyIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBmcmFtZXdvcmsuCi0JICogQHBhcmFtIHZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uRXhjZXB0aW9uKFZhbGlkYXRpb25FeGNlcHRpb24gdmFsaWRhdGlvbkV4Y2VwdGlvbikgewotCQlfdmFsaWRhdGlvbkV4Y2VwdGlvbiA9IHZhbGlkYXRpb25FeGNlcHRpb247Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJvamVjdCB0aGF0IHRoZSB2YWxpZGF0b3Igd291bGQgbGlrZSB0byBoYXZlIHN1c3BlbmRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IHRvIHN1c3BlbmQgb3IgbnVsbC4gVGhlIG5vcm1hbCByZXN1bHQgaXMgbnVsbCwgd2hpY2ggbWVhbnMgdGhhdAotCSAqIHRoZSB2YWxpZGF0b3Igd2lzaGVzIHRvIHJlY2VpdmUgbm9ybWFsIHZhbGlkYXRpb24gcmVxdWVzdHMuIAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRTdXNwZW5kVmFsaWRhdGlvbigpewotCQlyZXR1cm4gX3N1c3BlbmRWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBpbmZvcm0gdGhlIGZyYW1ld29yaywgdGhhdCB0aGlzIHZhbGlkYXRvciBkb2VzIG5vdCB3aXNoIHRvIGJlCi0JICogY2FsbGVkIGFnYWluIGZvciBhbnkgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCwgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIFNvbWUgdmFsaWRhdG9ycyBtYXkgaGF2ZSBhIHJpY2ggc2V0IG9mIHRyaWdnZXJzLCBidXQgb25jZSB0aGV5IGhhdmUgYmVlbiBpbnZva2VkIG9uY2UsCi0JICogZG8gbm90IG5lZWQgdG8gYmUgaW52b2tlZCBhZ2FpbiBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0aGF0IHRoaXMgdmFsaWRhdG9yIG5vIGxvbmdlciB3YW50cyB0byBiZSBub3RpZmllZCBvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCV9zdXNwZW5kVmFsaWRhdGlvbiA9IHByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTk3ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLS8qKgotICogVGhlIGNvbWJpbmVkIHJlc3VsdHMgb2YgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlc3VsdHMgewotCXByaXZhdGUgVmFsaWRhdGlvblJlc3VsdCBfcmVzdWx0OwotCQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0cyhWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCl7Ci0JCV9yZXN1bHQgPSByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1lc3NhZ2VbXSBnZXRNZXNzYWdlcygpewotCQlpZiAoX3Jlc3VsdCA9PSBudWxsKXJldHVybiBuZXcgVmFsaWRhdG9yTWVzc2FnZVswXTsKLQkJcmV0dXJuIF9yZXN1bHQuZ2V0TWVzc2FnZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5RXJyb3IoKSB7Ci0JCWlmIChfcmVzdWx0ID09IG51bGwpcmV0dXJuIDA7Ci0JCXJldHVybiBfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlJbmZvKCkgewotCQlpZiAoX3Jlc3VsdCA9PSBudWxsKXJldHVybiAwOwotCQlyZXR1cm4gX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5V2FybmluZygpIHsKLQkJaWYgKF9yZXN1bHQgPT0gbnVsbClyZXR1cm4gMDsKLQkJcmV0dXJuIF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQwY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogS2VlcCB0cmFjayBvZiBhcmJpdHJhcnkgdmFsaWRhdGlvbiBkYXRhLCBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHZhbGlkYXRpb24uCi0gKiA8cD4KLSAqIFRvIGVuYWJsZSBtb3JlIGVmZmljaWVudCBjYWNoaW5nLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIGFsbG93cyBpbmRpdmlkdWFsIHZhbGlkYXRvcnMgdG8gY2FjaGUKLSAqIGFyYml0cmFyeSBkYXRhIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLiBVc2Ugb2YgdGhpcyBvYmplY3QgaXMgY29tcGxldGVseSBvcHRpb25hbC4KLSAqIDxwPgotICogU2luY2Ugc29tZSB2YWxpZGF0b3JzIHdpc2ggdG8gc2hhcmUgZGF0YSB3aXRoIG90aGVyIHZhbGlkYXRvcnMsIGFueSB2YWxpZGF0b3IgY2FuIHNlZSB0aGUgc3RhdGUgZGF0YSBmb3IKLSAqIGFueSBvdGhlciB2YWxpZGF0b3IsIHNpbmNlIHRoZSBpZCBpcyBzaW1wbHkgdGhlIHZhbGlkYXRvcidzIGV4dGVuc2lvbiBpZC4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgZnJlZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0YXRlIHsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBfbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KDUwKTsKLQkKLQkvKioKLQkgKiBTYXZlIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIGlkIGJ5IGNvbnZlbnRpb24gdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbGlkYXRvciBleHRlbnNpb24gaWQuCi0JICogRm9yIGV4YW1wbGU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgYW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bC4gVGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrCi0JICogZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgb2JqZWN0IGV4Y2VwdCBwYXNzIGl0IGFsb25nIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGlkLCBPYmplY3QgdmFsdWUpewotCQlfbWFwLnB1dChpZCwgdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHN0YXRlIGRhdGEgZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIGlkIGJ5IGNvbnZlbnRpb24gdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQgaWQuCi0JICogRm9yIGV4YW1wbGUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuSFRNTFZhbGlkYXRvcgotCSAqIAotCSAqIEByZXR1cm4gYW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bCwgaW5jbHVkaW5nIG51bGwuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGlkKXsKLQkJcmV0dXJuIF9tYXAuZ2V0KGlkKTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlODgyMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLk1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuU3VtbWFyeVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJHbG9iYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckV4dGVuc2lvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRvckxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSB2YWxpZGF0b3IuIFRoaXMgZ2V0cyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBvbmUgb2YgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnRzLgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JLy8gUmVtZW1iZXIgaXMgeW91IGFkZCBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZSwgbWFrZSBzdXJlIHRoYXQgeW91IHVwZGF0ZSB0aGUgY29weSBhbmQgYmVjb21lIG1ldGhvZHMKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbglfYnVpbGRWYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQkvKiogSWYgdGhpcyBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCB0aGVuIHRoaXMgZmllbGQgaG9sZHMgdGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgZGVsZWdhdGVkIHRvLiAqLwotCXByaXZhdGUgU3RyaW5nIAkJX2RlbGVnYXRpbmdJZDsKLQkKLQkvKiogCi0JICogSWYgdGhpcyB2YWxpZGF0b3IgaXMgYWxzbyB1c2VkIHRvIGNvbnRyb2wgYW4gSVNvdXJjZSB2YWxpZGF0b3IsIHRoZSBpZCBvZiB0aGUgSVNvdXJjZSB2YWxpZGF0b3IgaXMKLQkgKiByZWdpc3RlcmVkIGhlcmUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcJCV9zb3VyY2VJZDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiAJX21hbnVhbFZhbGlkYXRpb24gPSB0cnVlOwotCQotCS8qKiAKLQkgKiBWZXJzaW9uIG9mIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbi4gQnkgaW5jcmVhc2luZyB0aGlzIG51bWJlciB0aGUgZnJhbWV3b3JrIGNhbiBrbm93IHRoYXQgYSBwbHVnLWluIGhhcyAKLQkgKiBjaGFuZ2VkIGl0J3MgZmlsdGVycy4KLQkgKi8KLQlwcml2YXRlIGludAkJCV92ZXJzaW9uID0gMTsKLQkKLQkvKiogTWFwIHNpbXBsZSBtZXNzYWdlIGlkJ3MgdG8gbWVzc2FnZSBzZXR0aW5ncy4gKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IF9tZXNzYWdlU2V0dGluZ3M7Ci0JCi0JLyoqIFRoZSBwcm9qZWN0IHRoYXQgeW91IGFyZSBkZWZpbmVkIGluLiBUaGlzIGNhbiBiZSBudWxsIHdoaWNoIG1lYW5zIHRoYXQgeW91IGFyZSBhIGdsb2JhbCB2YWxpZGF0b3IuICovCi0JcHJvdGVjdGVkIElQcm9qZWN0CV9wcm9qZWN0OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgYmFzZWQgb24gYSBhYnN0cmFjdCB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHdyYXBwZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0IHRoYXQgeW91IGFyZSBkZWZpbmVkIGluLiBUaGlzIGNhbiBiZSBudWxsIHdoaWNoCi0JICogICAgICAgICAgICBtZWFucyB0aGF0IHlvdSBhcmUgYSBnbG9iYWwgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yIGNyZWF0ZShBYnN0cmFjdFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJVjIgdjIgPSBuZXcgVjIodmFsaWRhdG9yLCBwcm9qZWN0KTsKLQkJdmFsaWRhdG9yLnNldFBhcmVudCh2Mik7Ci0JCXJldHVybiB2MjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3IgY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJVjEgdjEgPSBuZXcgVjEodm1kLCBjb25maWcpOwotCQl2MS5fcHJvamVjdCA9IHByb2plY3Q7Ci0JCXJldHVybiB2MTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgeW91IGFyZSBhIHZlcnNpb24gMSB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgVjEgYXNWMVZhbGlkYXRvcigpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSWYgeW91IGFyZSBhIHZlcnNpb24gMiB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgVjIgYXNWMlZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGJlaW5nIGNsZWFuZWQsIHRoaXMgbWV0aG9kIGdpdmVzIHRoZSB2YWxpZGF0b3IgYSBjaGFuY2UgdG8gZG8gYW55IHNwZWNpYWwgY2xlYW51cC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGJlaW5nIGJ1aWx0LgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW4oSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQl9CQotCQotCS8qKgotCSAqIENvbXBhcmUgeW91cnNlbGYgYmFzZWQgb24gVmFsaWRhdG9yIG5hbWUuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgVmFsaWRhdG9yKXsKLQkJCVZhbGlkYXRvciBvdGhlciA9IChWYWxpZGF0b3IpdmFsaWRhdG9yOwotCQkJcmV0dXJuIGdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0TmFtZSgpKTsJCQkKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKiBBbnN3ZXIgYSBkZWVwIGNvcHkgb2YgeW91cnNlbGYuICovCi0JcHVibGljIGFic3RyYWN0IFZhbGlkYXRvciBjb3B5KCk7Ci0JCi0JLyoqCi0JICogVXBkYXRlIHlvdXIgZGlyZWN0LCBub24gdHJhbnNpZW50IGZpZWxkcyBmcm9tIHRoZSBmaWVsZHMgaW4gdi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TG9jYWwoVmFsaWRhdG9yIHYpewotCQlfYnVpbGRWYWxpZGF0aW9uID0gdi5fYnVpbGRWYWxpZGF0aW9uOwotCQlfZGVsZWdhdGluZ0lkID0gdi5fZGVsZWdhdGluZ0lkOwotCQlfbWFudWFsVmFsaWRhdGlvbiA9IHYuX21hbnVhbFZhbGlkYXRpb247Ci0JCV9tZXNzYWdlU2V0dGluZ3MgPSB2Ll9tZXNzYWdlU2V0dGluZ3M7Ci0JCV9wcm9qZWN0ID0gdi5fcHJvamVjdDsKLQkJX3NvdXJjZUlkID0gdi5fc291cmNlSWQ7Ci0JCV92ZXJzaW9uID0gdi5fdmVyc2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlIHRoaXMgcmVzb3VyY2UuIFRoaXMgbWV0aG9kCi0JICogZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHByb2plY3QgdmFsaWRhdGlvbiBoYXMgYmVlbiBzdXNwZW5kZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBpc01hbnVhbCBpZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSBpc0J1aWxkIGlmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCWlmIChpc01hbnVhbCAmJiAhX21hbnVhbFZhbGlkYXRpb24pcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNCdWlsZCAmJiAhX2J1aWxkVmFsaWRhdGlvbilyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGUocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZAotCSAqIGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBnbG9iYWwgdmFsaWRhdGlvbiBvciBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIGlzTWFudWFsIGlmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgbWFudWFsIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIGlzQnVpbGQgaWYgdHJ1ZSB0aGVuIHRoaXMgdmFsaWRhdG9yIG11c3QgYWxzbyBiZSBlbmFibGVkIGZvciBidWlsZGVyIGJhc2VkIHZhbGlkYXRpb24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCWlmIChpc01hbnVhbCAmJiAhX21hbnVhbFZhbGlkYXRpb24pcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNCdWlsZCAmJiAhX2J1aWxkVmFsaWRhdGlvbilyZXR1cm4gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNPcGVuKCkpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KHByb2plY3QpOwotCX0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiByZXNvdXJjZSBjaGFuZ2UsIHNlZSBJUmVzb3VyY2VEZWx0YSBmb3IgdmFsdWVzLgotCSAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbiBiZSBudWxsLgotCSAqIEBwYXJhbSBtb25pdG9yIGEgd2F5IHRvIHJlcG9ydCBwcm9ncmVzcy4gVGhpcyBjYW4gYmUgbnVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZG9pbmcgdGhlIHZhbGlkYXRpb24sIGl0IGNhbiBiZSwgYnV0IHVzdWFsbHkgaXNuJ3QgbnVsbC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwkKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLQkgKiBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4gCi0JICogIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLiBGb3IgdGhlIHZlcnkgZmlyc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiBwaGFzZSwKLQkgKiB0aGlzIHdpbGwgYmUgbnVsbC4gVGhhdCBpcyB0aGUgc2lnbmFsIHRvIHRoZSB2YWxpZGF0b3IgdGhhdCBhIHRvcCBsZXZlbCB2YWxpZGF0aW9uIGlzIHN0YXJ0aW5nLgotCSAqIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3Qgd2lsbCBiZSBzZXQsIGFzIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgcHJvamVjdHMgYXJlIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUgYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0JICogdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCS8vIHN1YmNsYXNzZXMgbmVlZCB0byBvdmVycmlkZSB0aGlzLCBpZiB0aGV5IHdpc2ggdG8gbGV0IHRoZWlyIHZhbGlkYXRvcnMga25vdyBhYm91dCB0aGlzIGV2ZW50Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLQkgKiBjbGVhbnVwIHRoYXQgdGhleSBtaWdodCBuZWVkIHRvIGRvLiAgCi0JICogIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgd2FzIHZhbGlkYXRlZC4gVGhlIHZlcnkgbGFzdCBjYWxsIGluIHRoZSB2YWxpZGF0aW9uIHdpbGwgc2V0IHRoaXMgdG8gCi0JICogbnVsbCBzbyB0aGF0IHRoZSB2YWxpZGF0b3Iga25vd3MgdGhhdCBhbGwgdGhlIHByb2plY3RzIGhhdmUgbm93IGJlZW4gdmFsaWRhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZSBhIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8KLQkgKiB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7CQkKLQkJLy8gc3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMsIGlmIHRoZXkgd2lzaCB0byBsZXQgdGhlaXIgdmFsaWRhdG9ycyBrbm93IGFib3V0IHRoaXMgZXZlbnQKLQl9Ci0JCi0Jdm9pZCBhZGQoTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtZXNzYWdlKXsKLQkJLy8gSSBjYW4ndCB1c2UgZ2V0TWVzc2FnZVNldHRpbmdzKCkgaGVyZSwgYXMgdGhhdCB3aWxsIHB1dCB1cyBpbnRvIGFuIGluZmluaXRlIGxvb3AKLQkJaWYgKF9tZXNzYWdlU2V0dGluZ3MgPT0gbnVsbCl7Ci0JCQlfbWVzc2FnZVNldHRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPigxMCk7Ci0JCX0KLQkJX21lc3NhZ2VTZXR0aW5ncy5wdXQobWVzc2FnZS5nZXRJZCgpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0b3IgYXNJVmFsaWRhdG9yKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpOwotCQkJCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCQotCXB1YmxpYyBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIGdldE1lc3NhZ2UoU3RyaW5nIGlkKXsKLQkJcmV0dXJuIGdldE1lc3NhZ2VTZXR0aW5ncygpLmdldChpZCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIG1lc3NhZ2Ugc2V0dGluZ3MgdGhhdCB0aGlzIHZhbGlkYXRvciBoYXMgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVtcHR5IG1hcCBpZiB0aGUgdmFsaWRhdG9yIGRpZCBub3QgZGVmaW5lIGFueSBtZXNzYWdlIHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBnZXRNZXNzYWdlU2V0dGluZ3MoKXsKLQkJTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gc2V0dGluZ3MgPSBfbWVzc2FnZVNldHRpbmdzOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCl7Ci0JCQlzZXR0aW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4oMTApOwotCQkJaW5pdChzZXR0aW5ncyk7Ci0JCQlpZiAoVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaGFzRW5hYmxlZFByb2plY3RQcmVmZXJlbmNlcyhnZXRQcm9qZWN0KCkpKXsKLQkJCQlWYWxQcmVmTWFuYWdlclByb2plY3QgdnAgPSBuZXcgVmFsUHJlZk1hbmFnZXJQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCQkJdnAubG9hZE1lc3NhZ2VzKHRoaXMsIHNldHRpbmdzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVZhbFByZWZNYW5hZ2VyR2xvYmFsIGdwID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOwotCQkJCWdwLmxvYWRNZXNzYWdlcyh0aGlzLCBzZXR0aW5ncyk7Ci0JCQkJCi0JCQl9Ci0JCQlfbWVzc2FnZVNldHRpbmdzID0gc2V0dGluZ3M7Ci0JCX0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBzZXR0aW5ncykgewotCQlmb3IgKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgOiBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuZ2V0RGVmYXVsdCgpLmFkZE1lc3NhZ2VzKHRoaXMpKXsKLQkJCXNldHRpbmdzLnB1dChtcy5nZXRJZCgpLCBtcyk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJvamVjdCB0aGF0IHlvdSB3ZXJlIGVuYWJsZWQgb24uIAotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB5b3UgYXJlIGEgZ2xvYmFsIChpLmUuIHdvcmtzcGFjZSBsZXZlbCkgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCl7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB2YWxpZGF0b3IuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCk7Ci0JCi0JLyoqCi0JICogSXMgdGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IGVuYWJsZWQgZm9yIHZhbGlkYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCBtYW51YWxseT8gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW51YWxWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gX21hbnVhbFZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIG1hbnVhbFZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbikgewotCQlzZXRNYW51YWxWYWxpZGF0aW9uMihtYW51YWxWYWxpZGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TWFudWFsVmFsaWRhdGlvbjIoYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uKSB7Ci0JCV9tYW51YWxWYWxpZGF0aW9uID0gbWFudWFsVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHZhbGlkYXRvciBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdmFsaWRhdGlvbnMgdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkcz8gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBfYnVpbGRWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkVmFsaWRhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuIGJ1aWxkVmFsaWRhdGlvbikgewotCQlzZXRCdWlsZFZhbGlkYXRpb24yKGJ1aWxkVmFsaWRhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEJ1aWxkVmFsaWRhdGlvbjIoYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsKLQkJX2J1aWxkVmFsaWRhdGlvbiA9IGJ1aWxkVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotCSAqIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuIElmIHRoaXMgaXNuJ3QgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBhbnN3ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRpbmdJZCgpIHsKLQkJcmV0dXJuIF9kZWxlZ2F0aW5nSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwZW5kZW5jeUlkKCl7Ci0JCXJldHVybiBnZXRJZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotCSAqIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuCi0JICogCi0JICogQHBhcmFtIGRlbGVnYXRpbmcgdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdGhhdCBpcyBhY3R1YWxseSBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdJZChTdHJpbmcgZGVsZWdhdGluZykgewotCQlfZGVsZWdhdGluZ0lkID0gZGVsZWdhdGluZzsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gX3ZlcnNpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKLQkJX3ZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQkJCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDEgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLyAKLXB1YmxpYyBzdGF0aWMgY2xhc3MgVjEgZXh0ZW5kcyBWYWxpZGF0b3IgewotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmVyc2lvbiAxIHZhbGlkYXRvci4gCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBjb25maWcgdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZ2xvYmFsIGVuYWJsZW1lbnQgb3B0aW9ucy4gSW4gc29tZSBjYXNlIHRoaXMgY2FuIGJlIG51bGwuCi0JICovCi0JcHVibGljIFYxKFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnKXsKLQkJX3ZtZCA9IHZtZDsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKXsKLQkJCXNldEJ1aWxkVmFsaWRhdGlvbihjb25maWcuaXNCdWlsZEVuYWJsZWQodm1kKSk7Ci0JCQlzZXRNYW51YWxWYWxpZGF0aW9uKGNvbmZpZy5pc01hbnVhbEVuYWJsZWQodm1kKSk7Ci0JCX0KLQkJc2V0RGVsZWdhdGluZ0lkKFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdERlbGVnYXRlKGdldFZhbGlkYXRvckNsYXNzbmFtZSgpKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJVmFsaWRhdG9yIGFzSVZhbGlkYXRvcigpIHsKLQkJSVZhbGlkYXRvciB2ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXYgPSBfdm1kLmdldFZhbGlkYXRvcigpOwotCQl9Ci0JCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0JCi0JcHVibGljIFYxIGFzVjFWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiZWNvbWUoVmFsaWRhdG9yIHZhbCkgewotCQlzdXBlci5iZWNvbWUodmFsKTsKLQkJVjEgdjEgPSB2YWwuYXNWMVZhbGlkYXRvcigpOwotCQlpZiAodjEgPT0gbnVsbCl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciwgdGhlIGluY29taW5nIHZhbGlkYXRvciBtdXN0IGJlIGEgdjEgdmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJX3ZtZCA9IHYxLl92bWQ7Ci0JfQotCQkKLQlwdWJsaWMgVmFsaWRhdG9yIGNvcHkoKSB7Ci0JCVYxIHYgPSBuZXcgVjFDb3B5KF92bWQsIG51bGwpOwotCQl2LmNvcHlMb2NhbCh0aGlzKTsKLQkJCQkKLQkJcmV0dXJuIHY7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZtZCgpewotCQlyZXR1cm4gX3ZtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzc25hbWUoKXsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbmFtZSA9IF92bWQuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gX3ZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuIGJ1aWxkVmFsaWRhdGlvbikgewotCQlzdXBlci5zZXRCdWlsZFZhbGlkYXRpb24oYnVpbGRWYWxpZGF0aW9uKTsKLQkJX3ZtZC5zZXRCdWlsZFZhbGlkYXRpb24oYnVpbGRWYWxpZGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuIG1hbnVhbFZhbGlkYXRpb24pIHsKLQkJc3VwZXIuc2V0TWFudWFsVmFsaWRhdGlvbihtYW51YWxWYWxpZGF0aW9uKTsKLQkJX3ZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKG1hbnVhbFZhbGlkYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gX3ZtZC5pc0FwcGxpY2FibGVUbyhyZXNvdXJjZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gVE9ETyBkZXRlcm1pbmUgaWYgdGhpcyBjYW4gYmUgb3B0aW1pemVkCi0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCWlmIChtb25pdG9yID09IG51bGwpbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQotCQlWYWxpZGF0aW9uUmVzdWx0IHZyID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJSVZhbGlkYXRvciB2ID0gYXNJVmFsaWRhdG9yKCk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCVN1bW1hcnlSZXBvcnRlciByZXBvcnRlciA9IG5ldyBTdW1tYXJ5UmVwb3J0ZXIocHJvamVjdCwgbW9uaXRvcik7Ci0JCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBfdm1kLmdldEhlbHBlcihwcm9qZWN0KTsKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBXb3JrYmVuY2hDb250ZXh0KXsKLQkJCQlXb3JrYmVuY2hDb250ZXh0IHdjID0gKFdvcmtiZW5jaENvbnRleHQpaGVscGVyOwotCQkJCUxpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJCQkvLyBbMjEzNjMxXSBUaGUgSlNQIHZhbGlkYXRvciBleHBlY3RzIGZ1bGwgcGF0aHMgbm90IHJlbGF0aXZlIHBhdGhzLCBidXQgdGhlIFhNTCB2YWxpZGF0b3IKLQkJCQkvLyBleHBlY3RzIHJlbGF0aXZlIHBhdGhzLgotCQkJCWZpbGVzLmFkZCh3Yy5nZXRQb3J0YWJsZU5hbWUocmVzb3VyY2UpKTsKLQkJCQl3Yy5zZXRWYWxpZGF0aW9uRmlsZVVSSXMoZmlsZXMpOwotCQkJfQotCQkJVmFsaWRhdG9yTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKS5zdGFydChoZWxwZXIsIHYsIHJlcG9ydGVyKTsKLQkJCQotCQkJdnIuaW5jcmVtZW50RXJyb3IocmVwb3J0ZXIuZ2V0U2V2ZXJpdHlIaWdoKCkpOwotCQkJdnIuaW5jcmVtZW50V2FybmluZyhyZXBvcnRlci5nZXRTZXZlcml0eU5vcm1hbCgpKTsKLQkJCXZyLmluY3JlbWVudEluZm8ocmVwb3J0ZXIuZ2V0U2V2ZXJpdHlMb3coKSk7Ci0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHZyOwotCX0KLQkKLQkvKgotCSAqIEdSSyAtIEJlY2F1c2UgSSBkaWRuJ3Qgd2FudCB0byB0cnkgdG8gbWFrZSBhIHRydWUgY29weSBvZiB0aGUgVjEgdmFsaWRhdG9yLCAoYmVjYXVzZSBJIGRpZG4ndAotCSAqIHdhbnQgdG8gY29weSB0aGUgdm1kIG9iamVjdCksIEkgY2FtZSB1cCB3aXRoIHRoaXMgYXBwcm9hY2ggdG8gb25seSBjb3B5IHRoZSBmaWVsZHMgdGhhdAotCSAqIHRoZSBwcmVmZXJlbmNlIHBhZ2Ugd2FzIHdvcnJpZWQgYWJvdXQuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVjFDb3B5IGV4dGVuZHMgVjEgewotCQlwdWJsaWMgVjFDb3B5KFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmMpewotCQkJc3VwZXIodm1kLCB2Yyk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4gYm9vbCkgewotCQkJc2V0TWFudWFsVmFsaWRhdGlvbjIoYm9vbCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbiBib29sKSB7Ci0JCQlzZXRCdWlsZFZhbGlkYXRpb24yKGJvb2wpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYmVjb21lKFZhbGlkYXRvciB2YWwpIHsKLQkJCXN1cGVyLmJlY29tZSh2YWwpOwotCQkJc3VwZXIuc2V0QnVpbGRWYWxpZGF0aW9uKHZhbC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLQkJCXN1cGVyLnNldE1hbnVhbFZhbGlkYXRpb24odmFsLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJfQotCQkKLQl9Ci0JCQotfQotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDIgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBWMiBleHRlbmRzIFZhbGlkYXRvciBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCXByaXZhdGUgQWJzdHJhY3RWYWxpZGF0b3IJX3ZhbGlkYXRvcjsKLQkKLQlwcml2YXRlIExpc3Q8RmlsdGVyR3JvdXA+CV9ncm91cHMgPSBuZXcgTGlua2VkTGlzdDxGaWx0ZXJHcm91cD4oKTsKLQlwcml2YXRlIEZpbHRlckdyb3VwW10JCV9ncm91cHNBcnJheTsKLQkKLQkvKiogVGhlIGZ1bGwgaWQgb2YgdGhlIGV4dGVuc2lvbi4gKi8KLQlwcml2YXRlIFN0cmluZwkJCV9pZDsKLQkKLQkvKiogTmFtZSBvZiB0aGUgdmFsaWRhdG9yLiAqLwotCXByaXZhdGUgU3RyaW5nCQkJX25hbWU7Ci0JCQotCS8qKiAKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCB0aGVuIHRoaXMgaXMgdGhlICJyZWFsIiB2YWxpZGF0b3IgKGkuZS4gdGhlIG9uZSB0aGF0Ci0JICogZG9lcyB0aGUgd29yaykuCi0JICovCi0JcHJpdmF0ZSBBYnN0cmFjdFZhbGlkYXRvcglfZGVsZWdhdGVkOwotCQotCVYyKEFic3RyYWN0VmFsaWRhdG9yIGJhc2UsIElQcm9qZWN0IHByb2plY3QpewotCQlfdmFsaWRhdG9yID0gYmFzZTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQliYXNlLnNldFBhcmVudCh0aGlzKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0YXJnZXQgPSBnZXRWYWxpZGF0b3JDbGFzc25hbWUoKTsKLQkJCVN0cmluZyBpZCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKHByb2plY3QpLmdldERlbGVnYXRlRm9yVGFyZ2V0KHRhcmdldCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkgaWQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHREZWxlZ2F0ZSh0YXJnZXQpOwotCQkJc2V0RGVsZWdhdGluZ0lkKGlkKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChGaWx0ZXJHcm91cCBmZykgewotCQlfZ3JvdXBzQXJyYXkgPSBudWxsOwotCQlfZ3JvdXBzLmFkZChmZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJVmFsaWRhdG9yIGFzSVZhbGlkYXRvcigpIHsKLQkJQWJzdHJhY3RWYWxpZGF0b3IgYXYgPSBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKTsKLQkJaWYgKGF2IGluc3RhbmNlb2YgSVZhbGlkYXRvcilyZXR1cm4gKElWYWxpZGF0b3IpYXY7Ci0JCXJldHVybiBzdXBlci5hc0lWYWxpZGF0b3IoKTsKLQl9Ci0JCi0JcHVibGljIFYyIGFzVjJWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBMZXQgdGhlIHZhbGlkYXRvciBrbm93IHRoYXQgYSBjbGVhbiBpcyBhYm91dCB0byBoYXBwZW4uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyBjbGVhbmVkLiBUaGlzIGNhbiBiZSBudWxsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHdvcmtzcGFjZQotCSAqIGlzIGJlaW5nIGNsZWFuZWQgKGluIHdoaWNoIGNhc2UgYSBzZXBhcmF0ZSBjYWxsIHdpbGwgYmUgbWFkZSBmb3IgZWFjaCBvcGVuIHByb2plY3QpLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS5jbGVhbihwcm9qZWN0LCBWYWxPcGVyYXRpb25NYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRPcGVyYXRpb24oKS5nZXRTdGF0ZSgpLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvciBjb3B5KCkgewotCQlWMiB2ID0gbmV3IFYyKF92YWxpZGF0b3IsIF9wcm9qZWN0KTsKLQkJdi5jb3B5TG9jYWwodGhpcyk7Ci0JCQotCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IGdldEdyb3VwcygpOwotCQl2Ll9ncm91cHNBcnJheSA9IG5ldyBGaWx0ZXJHcm91cFtncm91cHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaT0wOyBpPGdyb3Vwcy5sZW5ndGg7IGkrKyl7Ci0JCQl2Ll9ncm91cHNBcnJheVtpXSA9IGdyb3Vwc1tpXS5jb3B5KCk7Ci0JCQl2Ll9ncm91cHMuYWRkKHYuX2dyb3Vwc0FycmF5W2ldKTsKLQkJfQotCi0JCXYuX2lkID0gX2lkOwotCQl2Ll9uYW1lID0gX25hbWU7Ci0JCQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlcGVuZGVuY3lJZCgpewotCQlTdHJpbmcgaWQgPSBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS5nZXREZXBlbmRlbmN5SWQoKTsKLQkJaWYgKGlkICE9IG51bGwpcmV0dXJuIGlkOwotCQlyZXR1cm4gZ2V0SWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBhY3R1YWwgdmFsaWRhdG9yIHRoYXQgaXMgZ29pbmcgdG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbi4gSWYgdGhpcyBpcyBhIG5vcm1hbCB2YWxpZGF0b3IgdGhpcwotCSAqIG1ldGhvZCB3aWxsIHNpbXBseSBhbnN3ZXIgaXRzZWxmLiBIb3dldmVyIGlmIHRoaXMgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciwgdGhlbiB0aGlzIHdpbGwgYW5zd2VyIHRoZQotCSAqICJyZWFsIiB2YWxpZGF0b3IuCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEFic3RyYWN0VmFsaWRhdG9yIGdldERlbGVnYXRlZFZhbGlkYXRvcigpewotCQlBYnN0cmFjdFZhbGlkYXRvciBkZWxlZ2F0ZWQgPSBfZGVsZWdhdGVkOwotCQlpZiAoZGVsZWdhdGVkICE9IG51bGwpcmV0dXJuIGRlbGVnYXRlZDsKLQkJZWxzZSBpZiAoZ2V0RGVsZWdhdGluZ0lkKCkgPT0gbnVsbClyZXR1cm4gX3ZhbGlkYXRvcjsKLQkJdHJ5IHsKLQkJCVZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciB2ZGQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldERlc2NyaXB0b3IoZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCksIGdldERlbGVnYXRpbmdJZCgpKTsKLQkJCWlmICh2ZGQgPT0gbnVsbClyZXR1cm4gX3ZhbGlkYXRvcjsKLQkJCWRlbGVnYXRlZCA9IHZkZC5nZXRWYWxpZGF0b3IyKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChkZWxlZ2F0ZWQgPT0gbnVsbClyZXR1cm4gX3ZhbGlkYXRvcjsKLQkJZGVsZWdhdGVkLnNldFBhcmVudCh0aGlzKTsKLQkJX2RlbGVnYXRlZCA9IGRlbGVnYXRlZDsKLQkJcmV0dXJuIGRlbGVnYXRlZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9pZDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3IncyBmaWx0ZXIgZ3JvdXBzLgotCSAqICAKLQkgKiBAcmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgaGF2ZSBhbnkgZmlsdGVyIGdyb3Vwcy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEZpbHRlckdyb3VwW10gZ2V0R3JvdXBzKCl7Ci0JCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gX2dyb3Vwc0FycmF5OwotCQlpZiAoZ3JvdXBzID09IG51bGwpewotCQkJZ3JvdXBzID0gbmV3IEZpbHRlckdyb3VwW19ncm91cHMuc2l6ZSgpXTsKLQkJCV9ncm91cHMudG9BcnJheShncm91cHMpOwotCQkJX2dyb3Vwc0FycmF5ID0gZ3JvdXBzOwotCQl9Ci0JCXJldHVybiBncm91cHM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF9uYW1lOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzc25hbWUoKXsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IGdldEdyb3VwcygpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlmb3IgKEZpbHRlckdyb3VwIGdyb3VwIDogZ3JvdXBzKXsKLQkJCWlmICghZ3JvdXAuc2hvdWxkVmFsaWRhdGUocHJvamVjdCwgcmVzb3VyY2UpKXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVsZWdhdGluZ0lkKFN0cmluZyBkZWxlZ2F0aW5nKSB7Ci0JCXN1cGVyLnNldERlbGVnYXRpbmdJZChkZWxlZ2F0aW5nKTsKLQkJX2RlbGVnYXRlZCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRHcm91cHMoRmlsdGVyR3JvdXBbXSBncm91cHMpewotCQlfZ3JvdXBzLmNsZWFyKCk7Ci0JCV9ncm91cHNBcnJheSA9IG51bGw7Ci0JCWZvciAoRmlsdGVyR3JvdXAgZ3JvdXAgOiBncm91cHMpX2dyb3Vwcy5hZGQoZ3JvdXApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQlfaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlfbmFtZSA9IG5hbWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uUmVzdWx0IHZyID0gbnVsbDsKLQkJaWYgKG9wZXJhdGlvbiA9PSBudWxsKW9wZXJhdGlvbiA9IG5ldyBWYWxPcGVyYXRpb24oKTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJdHJ5IHsKLQkJCXZyID0gZ2V0RGVsZWdhdGVkVmFsaWRhdG9yKCkudmFsaWRhdGUocmVzb3VyY2UsIGtpbmQsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCWlmICh2ciAhPSBudWxsKXsKLQkJCWlmICh2ci5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uKCkgIT0gbnVsbCl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24odnIuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbigpKTsKLQkJCX0KLQkJCXVwZGF0ZVJlc3VsdHModnIpOwotCQkJaWYgKHZyLmdldERlcGVuZHNPbigpICE9IG51bGwpewotCQkJCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldERlcGVuZGVuY3lJbmRleCgpLnNldChnZXREZXBlbmRlbmN5SWQoKSwgcmVzb3VyY2UsIHZyLmdldERlcGVuZHNPbigpKTsKLQkJCX0KLQkJCUlSZXNvdXJjZVtdIHZhbGlkYXRlZCA9IHZyLmdldFZhbGlkYXRlZCgpOwotCQkJaWYgKHZhbGlkYXRlZCAhPSBudWxsKXsKLQkJCQlmb3IgKGludCBpPTA7IGk8dmFsaWRhdGVkLmxlbmd0aDsgaSsrKXsKLQkJCQkJb3BlcmF0aW9uLmFkZFZhbGlkYXRlZChnZXRJZCgpLCB2YWxpZGF0ZWRbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVmFsaWRhdG9yTWVzc2FnZVtdIG1zZ3MgPSB2ci5nZXRNZXNzYWdlcygpOwotCQkJaWYgKHNhbml0eVRlc3QobXNncy5sZW5ndGgsIHJlc291cmNlKSl7Ci0JCQkJTWFya2VyTWFuYWdlciBtbSA9IE1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJCWZvciAoVmFsaWRhdG9yTWVzc2FnZSBtIDogbXNncyl7Ci0JCQkJCW1tLmNyZWF0ZU1hcmtlcihtLCBnZXRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRCdWlsZFZhbGlkYXRpb24oZmFsc2UpOwotCQkJCXNldE1hbnVhbFZhbGlkYXRpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2cjsJCQotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtIGEgc2ltcGxlIHNhbml0eSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3IgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuCi0JICogQHBhcmFtIG51bWJlcm9mTWVzc2FnZXMgbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgdGhlIHZhbGlkYXRvciBwcm9kdWNlZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgcGFzc2VkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNhbml0eVRlc3QoaW50IG51bWJlcm9mTWVzc2FnZXMsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvL0ZJWE1FIG1ha2UgdGhpcyBtb3JlIGdlbmVyYWwgYW5kIGNvbmZpZ3VyYWJsZQotCQlpZiAobnVtYmVyb2ZNZXNzYWdlcyA8IDIwMSlyZXR1cm4gdHJ1ZTsKLQkJCi0JCVN0cmluZyByZXNOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc291cmNlICE9IG51bGwpcmVzTmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChWYWxNZXNzYWdlcy5Db25maWdFcnJvciwgbmV3IE9iamVjdFtdewotCQkJCWdldE5hbWUoKSwgZ2V0SWQoKSwgU3RyaW5nLnZhbHVlT2YobnVtYmVyb2ZNZXNzYWdlcyksIHJlc05hbWV9KTsKLQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWxpZGF0b3IgaXMgdXNpbmcgYSByZXBvcnQgaGVscGVyIHRoZW4gdXBkYXRlIGl0IHdpdGggYW55IG9mIHRoZSBtZXNzYWdlcyB0aGF0IHdlcmUKLQkgKiBhZGRlZCBkaXJlY3RseSB0byB0aGUgdmFsaWRhdGlvbiByZXN1bHQuCi0JICogQHBhcmFtIHZyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlc3VsdHMoVmFsaWRhdGlvblJlc3VsdCB2cikgewotCQlSZXBvcnRlckhlbHBlciByaCA9IHZyLmdldFJlcG9ydGVySGVscGVyKCk7Ci0JCWlmIChyaCA9PSBudWxsKXJldHVybjsKLQkJZm9yIChJTWVzc2FnZSBtZXNzYWdlIDogcmguZ2V0TWVzc2FnZXMoKSl7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCl7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSl7Ci0JCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKXRhcmdldDsKLQkJCQkJVmFsaWRhdG9yTWVzc2FnZSB2bSA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKG1lc3NhZ2UuZ2V0VGV4dCgpLCByZXMpOwotCQkJCQl2ci5hZGQodm0pOwotCQkJCQlpbnQgbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQkJCWludCBzZXYgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCQkJCWlmICgoc2V2ICYgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgIT0gMCltYXJrZXJTZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQkJCWVsc2UgaWYgKChzZXYgJiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpICE9IDApbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQkJCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBtYXJrZXJTZXZlcml0eSk7Ci0JCQkJCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCBtZXNzYWdlLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCWludCBvZmZzZXQgPSBtZXNzYWdlLmdldE9mZnNldCgpOwotCQkJCQlpZiAob2Zmc2V0ICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCl7Ci0JCQkJCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBvZmZzZXQpOwotCQkJCQkJaW50IGxlbiA9IG1lc3NhZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCl7Ci0JCQkJCQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgb2Zmc2V0KTsKLQkJCQkJCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgb2Zmc2V0K2xlbik7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldERlbGVnYXRlZFZhbGlkYXRvcigpLnZhbGlkYXRpb25TdGFydGluZyhwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RGVsZWdhdGVkVmFsaWRhdG9yKCkudmFsaWRhdGlvbkZpbmlzaGluZyhwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKEZpbHRlckdyb3VwIGdyb3VwKSB7Ci0JCV9ncm91cHMucmVtb3ZlKGdyb3VwKTsKLQkJX2dyb3Vwc0FycmF5ID0gbnVsbDsJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJRmlsdGVyR3JvdXBbXSBncm91cHMgPSBnZXRHcm91cHMoKTsKLQkJZm9yIChGaWx0ZXJHcm91cCBncm91cCA6IGdyb3Vwcyl7Ci0JCQlpZiAoIWdyb3VwLnNob3VsZFZhbGlkYXRlKHByb2plY3QsIG51bGwpKXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYmVjb21lKFZhbGlkYXRvciB2YWwpIHsKLQkJc3VwZXIuYmVjb21lKHZhbCk7Ci0JCVYyIHYyID0gdmFsLmFzVjJWYWxpZGF0b3IoKTsKLQkJaWYgKHYyID09IG51bGwpdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IsIHRoZSBpbmNvbWluZyB2YWxpZGF0b3IgbXVzdCBiZSBhIHYyIHZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCV9kZWxlZ2F0ZWQgPSB2Mi5fZGVsZWdhdGVkOwotCQlfZ3JvdXBzID0gdjIuX2dyb3VwczsKLQkJX2dyb3Vwc0FycmF5ID0gdjIuX2dyb3Vwc0FycmF5OwotCQlfaWQgPSB2Mi5faWQ7Ci0JCV9uYW1lID0gdjIuX25hbWU7Ci0JCV92YWxpZGF0b3IgPSB2Mi5fdmFsaWRhdG9yOwotCX0KLX0KLQotcHVibGljIFN0cmluZyBnZXRTb3VyY2VJZCgpIHsKLQlyZXR1cm4gX3NvdXJjZUlkOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTb3VyY2VJZChTdHJpbmcgc291cmNlSWQpIHsKLQlfc291cmNlSWQgPSBzb3VyY2VJZDsKLX0KLQotLyoqCi0gKiBUYWtlIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgZnJvbSB0aGUgaW5jb21pbmcgdmFsaWRhdG9yIGFuZCBzZXQgdGhlbSB0byB5b3Vyc2VsZi4KLSAqIEBwYXJhbSB2YWxpZGF0b3IKLSAqLwotcHVibGljIHZvaWQgYmVjb21lKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQlfYnVpbGRWYWxpZGF0aW9uID0gdmFsaWRhdG9yLl9idWlsZFZhbGlkYXRpb247Ci0JX2RlbGVnYXRpbmdJZCA9IHZhbGlkYXRvci5fZGVsZWdhdGluZ0lkOwotCV9tYW51YWxWYWxpZGF0aW9uID0gdmFsaWRhdG9yLl9tYW51YWxWYWxpZGF0aW9uOwotCV9tZXNzYWdlU2V0dGluZ3MgPSB2YWxpZGF0b3IuX21lc3NhZ2VTZXR0aW5nczsKLQlfcHJvamVjdCA9IHZhbGlkYXRvci5fcHJvamVjdDsKLQlfc291cmNlSWQgPSB2YWxpZGF0b3IuX3NvdXJjZUlkOwotCV92ZXJzaW9uID0gdmFsaWRhdG9yLl92ZXJzaW9uOwotCQotfQotCi12b2lkIHNldE1lc3NhZ2VzKE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1hcCkgewotCV9tZXNzYWdlU2V0dGluZ3MgPSBtYXA7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhYTljNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd2F5IGZvciBhIHZhbGlkYXRvciB0byByZXR1cm4gbWVzc2FnZXMsIHRoYXQgYXJlIGVhc2lseSBjb252ZXJ0ZWQgaW50byBJTWFya2Vycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsIGZvciB2YWxpZGF0b3JzLiBBIHZhbGlkYXRvciBjYW4gY2hvb3NlIHRvIGRpcmVjdGx5IG1hbmFnZSBJTWFya2Vycy4KLSAqIEhvd2V2ZXIsIHNvbWUgdmFsaWRhdG9ycyB3YW50IHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgY29udGV4dHMsIGZvciBleGFtcGxlIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gYW5kIAotICogYmF0Y2ggdmFsaWRhdGlvbi4gRm9yIHRoZXNlIHR5cGVzIG9mIHZhbGlkYXRvcnMgaXQgaXMgbm90IHBvc3NpYmxlIGZvciB0aGVtIHRvIHVzZSBvbmx5IElNYXJrZXJzLCBiZWNhdXNlCi0gKiBvZnRlbiB0aGUgUmVzb3VyY2UgaGFzIG5vdCBiZWVuIHNhdmVkIHlldC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvck1lc3NhZ2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZhbGlkYXRpb25JZCA9ICJWYWxpZGF0aW9uSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIEFzc29jaWF0ZSBzb21lIGFyYml0cmFyeSBhdHRyaWJ1dGVzIHdpdGggYSBtZXNzYWdlLiAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PglfbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KDUpOwotCQotCXByaXZhdGUgSVJlc291cmNlCV9yZXNvdXJjZTsKLQkKLQkvKiogVGhlIHR5cGUgb2YgbWFya2VyLiAqLwotCXByaXZhdGUgU3RyaW5nCQlfdHlwZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmFsaWRhdGlvbiBtZXNzYWdlLiAKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbG9jYWxpemVkIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWVzc2FnZSBjcmVhdGUoU3RyaW5nIG1lc3NhZ2UsIElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCVZhbGlkYXRvck1lc3NhZ2UgbXNnID0gbmV3IFZhbGlkYXRvck1lc3NhZ2UoKTsKLQkJbXNnLl90eXBlID0gVmFsQ29uc3RhbnRzLlByb2JsZW1NYXJrZXI7Ci0JCW1zZy5fcmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJbXNnLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaXNEZWJ1Z2dpbmcoKSA/IAotCQkJVHJhY2luZy50aW1lc3RhbXBJdChtZXNzYWdlKTogbWVzc2FnZSk7Ci0JCXJldHVybiBtc2c7Ci0JfQotCQotCXByaXZhdGUgVmFsaWRhdG9yTWVzc2FnZSgpe30KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIFRoZSByZXN1bHQgaXMgYW4gaW5zdGFuY2Ugb2Ygb25lCi0JICogb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgCi0JICogb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZC4KLQkgKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpewotCQlyZXR1cm4gX21hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlci12YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuICAKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkLgotCSAqIG9yIHRoZSBtYXJrZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFuIGludGVnZXIgdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gdXNlIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0JICogQHJldHVybiB0aGUgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gdmFsdWUgd2FzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVmYXVsdFZhbHVlKXsKLQkJSW50ZWdlciB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChJbnRlZ2VyKV9tYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQlyZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmctdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZAotCSAqIG9yIHRoZSBtYXJrZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgc3RyaW5nIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIHdhcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSl7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpX21hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9Ci0JCWlmICh2YWx1ZSA9PSBudWxsKXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuICAKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkCi0JICogb3IgdGhlIG1hcmtlciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBib29sZWFuIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIHdhcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKXsKLQkJQm9vbGVhbiB2YWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IChCb29sZWFuKV9tYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQlyZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBtYXJrZXIuCi0JICogSWYgdGhlIG1hcmtlciBoYXMgbm8gYXR0cmlidXRlcyB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiBhIG1hcCBvZiBhdHRyaWJ1dGUga2V5cyBhbmQgdmFsdWVzIChrZXkgdHlwZSA6IDxjb2RlPlN0cmluZzwvY29kZT4gCi0JICoJCXZhbHVlIHR5cGUgOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgCi0JICoJCTxjb2RlPkJvb2xlYW48L2NvZGU+KSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBfbWFwOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIG1hcmtlciBpcyBhc3NvY2lhdGVkLiAKLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHdpdGggd2hpY2ggdGhpcyBtYXJrZXIgaXMgYXNzb2NpYXRlZAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKXsKLQkJcmV0dXJuIF9yZXNvdXJjZTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIuIFRoZSByZXR1cm5lZCBtYXJrZXIgdHlwZSB3aWxsIG5vdCBiZSAKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBfdHlwZTsKLQl9Ci0JCQotCS8qKgotCSAqIFNldHMgdGhlIGludGVnZXItdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2hhbmdlcyByZXNvdXJjZXM7IHRoZXNlIGNoYW5nZXMgd2lsbCBiZSByZXBvcnRlZAotCSAqIGluIGEgc3Vic2VxdWVudCByZXNvdXJjZSBjaGFuZ2UgZXZlbnQsIGluY2x1ZGluZyBhbiBpbmRpY2F0aW9uIAotCSAqIHRoYXQgdGhpcyBtYXJrZXIgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCB2YWx1ZSl7Ci0JCV9tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgVGhlIHZhbHVlIG11c3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgCi0JICogYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlczogCi0JICogPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgaXMgdG8gYmUgdW5kZWZpbmVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBPYmplY3QgdmFsdWUpewotCQlfbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuICAKLQkgKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKXsKLQkJX21hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGF0dHJpYnV0ZSBrZXktdmFsdWUgcGFpcnMgb24gdGhpcyBtYXJrZXIuCi0JICogVGhlIHZhbHVlcyBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGluc3RhbmNlIG9mIAotCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6IDxjb2RlPlN0cmluZzwvY29kZT4sIAotCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+LCBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiBJZiBhIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgbmV3IHZhbHVlIG9mIHRoZSAKLQkgKiBhdHRyaWJ1dGUgaXMgY29uc2lkZXJlZCB0byBiZSB1bmRlZmluZWQuCi0JICoKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZXMgYW4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzCi0JICogQHBhcmFtIHZhbHVlcyBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lcywgT2JqZWN0W10gdmFsdWVzKXsKLQkJQXNzZXJ0LmlzVHJ1ZShhdHRyaWJ1dGVOYW1lcy5sZW5ndGggPT0gdmFsdWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlzZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZXNbaV0sIHZhbHVlc1tpXSk7CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIG1hcmtlciB0byBiZSB0aGUgb25lcyBjb250YWluZWQgaW4gdGhlCi0JICogZ2l2ZW4gdGFibGUuIFRoZSB2YWx1ZXMgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAKLQkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogQXR0cmlidXRlcyBwcmV2aW91c2x5IHNldCBvbiB0aGUgbWFya2VyIGJ1dCBub3QgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIG1hcAotCSAqIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJlbW92YWxzLiBTZXR0aW5nIHRoZSBnaXZlbiBtYXAgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpcyBlcXVpdmFsZW50IHRvIHJlbW92aW5nIGFsbCBtYXJrZXIgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBhIG1hcCBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlIHZhbHVlcyAKLQkgKgkJKGtleSB0eXBlIDogPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSB0eXBlIDogPGNvZGU+U3RyaW5nPC9jb2RlPiwgCi0JICoJCTxjb2RlPkludGVnZXI8L2NvZGU+LCBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPikgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcykgewotCQlfbWFwLmNsZWFyKCk7Ci0JCV9tYXAucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0RlYnVnQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZWJ1Z0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI2ZDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0RlYnVnQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGVidWdDb25zdGFudHMgewotCQotCS8qKiBtYXRjaGVzIC0gdHJhY2UgZmlsdGVyIG1hdGNoZXMuICovCi0JU3RyaW5nIFRyYWNlTWF0Y2hlcyA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvbWF0Y2hlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdGltaW5ncyAtIHRyYWNlIHRoZSB0aW1lcyBvZiB0aGUgdmFsaWRhdG9ycy4gKi8KLQlTdHJpbmcgVHJhY2VUaW1lcyA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvdGltaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdjEgLSB0cmFjZSB0aGUgdjEgdmFsaWRhdG9ycy4gKi8KLQlTdHJpbmcgVHJhY2VWMSA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvdjEiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRpbWluZ3MvdHJhY2VmaWxlIC0gZmlsZSB0aGF0IHN0b3JlcyB0aGUgdHJhY2UgZXZlbnRzICovCi0JU3RyaW5nIFRyYWNlVGltZXNGaWxlID0gVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQrIi90aW1pbmdzL3RyYWNlZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVwZW5kZW5jeUluZGV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXBlbmRlbmN5SW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwYWIzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXBlbmRlbmN5SW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotcHVibGljIGNsYXNzIERlcGVuZGVuY3lJbmRleCBpbXBsZW1lbnRzIElEZXBlbmRlbmN5SW5kZXgsIElTYXZlUGFydGljaXBhbnQgewotCQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2Ygd2hpY2ggcmVzb3VyY2VzIGFyZSBkZXBlbmRlZCBvbiBieSBvdGhlciByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogVGhlIHJlYXNvbiB3ZSBkb24ndCBzdG9yZSBJUmVzb3VyY2VzIGluIHRoaXMgbWFwIGlzIGJlY2F1c2UgdGhlIElSZXNvdXJjZSBtYXkgbm90Ci0JICogYWN0dWFsbHkgZXhpc3QuIChJdCBtYXkgaGF2ZSBiZWVuIHJlbmFtZWQgb3IgZGVsZXRlZCBiZWZvcmUgdGhpcyBpbmRleCB3YXMgcmVzdG9yZWQpCi0JICovCi0JcHJpdmF0ZSBNYXA8SVBhdGgsIE1hcDxJUmVzb3VyY2UsRGVwZW5kcz4+CQlfZGVwZW5kc01hcDsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgTGlzdDxEZXBlbmRzPj4JCQlfcHJvamVjdE1hcDsKLQlwcml2YXRlIGJvb2xlYW4gX2RpcnR5OwotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZVtdIEVtcHR5UmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVswXTsKLQkKLQkvKiogVmVyc2lvbiBvZiB0aGUgcGVyc2lzdGVudCBpbmRleC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ3VycmVudFZlcnNpb24gPSAxOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJaW5pdCgpOwotCQlJUGF0aCBkZXBlbmRzT25QYXRoID0gZGVwZW5kc09uLmdldEZ1bGxQYXRoKCk7Ci0JCWFkZChpZCxkZXBlbmRlbnQsIGRlcGVuZHNPblBhdGgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBpZCwgSVJlc291cmNlIGRlcGVuZGVudCwgSVBhdGggZGVwZW5kc09uKXsKLQkJTWFwPElSZXNvdXJjZSwgRGVwZW5kcz4gZGVwZW5kcyA9IF9kZXBlbmRzTWFwLmdldChkZXBlbmRzT24pOwotCQlpZiAoZGVwZW5kcyA9PSBudWxsKXsKLQkJCWRlcGVuZHMgPSBuZXcgSGFzaE1hcDxJUmVzb3VyY2UsIERlcGVuZHM+KDUpOwotCQkJX2RlcGVuZHNNYXAucHV0KGRlcGVuZHNPbiwgZGVwZW5kcyk7Ci0JCX0KLQkJCi0JCURlcGVuZHMgZCA9IGRlcGVuZHMuZ2V0KGRlcGVuZGVudCk7Ci0JCWlmIChkID09IG51bGwpewotCQkJZCA9IG5ldyBEZXBlbmRzKGRlcGVuZGVudCk7Ci0JCQlkZXBlbmRzLnB1dChkZXBlbmRlbnQsIGQpOwotCQl9Ci0JCWlmIChkLmhhc1ZhbGlkYXRvcihpZCkpcmV0dXJuOwotCQllbHNlIHsKLQkJCWQuYWRkKGlkKTsKLQkJCV9kaXJ0eSA9IHRydWU7Ci0JCQlMaXN0PERlcGVuZHM+IGxpc3QgPSBfcHJvamVjdE1hcC5nZXQoZGVwZW5kZW50LmdldFByb2plY3QoKSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKXsKLQkJCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8RGVwZW5kcz4oKTsKLQkJCX0KLQkJCWxpc3QuYWRkKGQpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIGRlcGVuZGVuY3kgaW5kZXguCi0JICogPHA+Ci0JICogVGhlIGZvcm1hdCBvZiB0aGUgaW5kZXggaXM6Ci0JICogPHByZT4KLQkgKiBWZXJzaW9uIG51bWJlcgotCSAqIE51bWJlciBvZiBkZXBlbmRzIG9uIGVudHJpZXMKLQkgKiAgIGRlcGVuZHMgb24gZmlsZSBuYW1lCi0JICogICBudW1iZXIgb2YgZGVwZW5kZW50IGVudHJpZXMKLQkgKiAgICAgZGVwZW5kZW50IGZpbGUgbmFtZQotCSAqICAgICBudW1iZXIgb2YgdmFsaWRhdG9ycwotCSAqICAgICAgIHZhbGlkYXRvciBpZAotCSAqIDwvcHJlPgotCSAqLwkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKF9kZXBlbmRzTWFwICE9IG51bGwpcmV0dXJuOwotCQkKLQkJRmlsZSBmID0gZ2V0SW5kZXhMb2NhdGlvbigpOwotCQlpZiAoIWYuZXhpc3RzKCkpewotCQkJX2RlcGVuZHNNYXAgPSBuZXcgSGFzaE1hcDxJUGF0aCwgTWFwPElSZXNvdXJjZSwgRGVwZW5kcz4+KDEwMCk7Ci0JCQlfcHJvamVjdE1hcCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBMaXN0PERlcGVuZHM+Pig1MCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7Ci0JCQkJCi0JCQkJaW50IHZlcnNpb24gPSBpbi5yZWFkSW50KCk7Ci0JCQkJaWYgKHZlcnNpb24gIT0gQ3VycmVudFZlcnNpb24pewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyRGVwZW5kZW5jeVZlcnNpb24sIEN1cnJlbnRWZXJzaW9uKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtc2cpOwotCQkJCX0KLQkJCQlpbnQgbnVtRGVwZW5kc09uID0gaW4ucmVhZEludCgpOwotCQkJCV9kZXBlbmRzTWFwID0gbmV3IEhhc2hNYXA8SVBhdGgsIE1hcDxJUmVzb3VyY2UsIERlcGVuZHM+PihudW1EZXBlbmRzT24rMTAwKTsKLQkJCQlfcHJvamVjdE1hcCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBMaXN0PERlcGVuZHM+Pig1MCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPG51bURlcGVuZHNPbjsgaSsrKXsKLQkJCQkJU3RyaW5nIHYgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJCUlQYXRoIGRlcGVuZHNPbiA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKHYpOwotCQkJCQlpbnQgbnVtRGVwZW5kZW50cyA9IGluLnJlYWRJbnQoKTsKLQkJCQkJZm9yIChpbnQgaj0wOyBqPG51bURlcGVuZGVudHM7IGorKyl7Ci0JCQkJCQl2ID0gaW4ucmVhZFVURigpOwotCQkJCQkJSVJlc291cmNlIGRlcGVuZGVudCA9IHJvb3QuZmluZE1lbWJlcih2KTsKLQkJCQkJCWludCBudW1WYWwgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCQlmb3IgKGludCBrPTA7IGs8bnVtVmFsOyBrKyspewotCQkJCQkJCVN0cmluZyBpZCA9IGluLnJlYWRVVEYoKTsKLQkJCQkJCQlhZGQoaWQsIGRlcGVuZGVudCwgZGVwZW5kc09uKTsKLQkJCQkJCX0KLQkJCQkJfQkJCQkJCi0JCQkJfQkJCQkKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCU1pc2MuY2xvc2UoaW4pOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoSVByb2plY3QgcHJvamVjdCkgewotCQlpbml0KCk7Ci0JCUxpc3Q8RGVwZW5kcz4gbGlzdCA9IF9wcm9qZWN0TWFwLmdldChwcm9qZWN0KTsKLQkJaWYgKGxpc3QgPT0gbnVsbClyZXR1cm47Ci0JCQotCQlfZGlydHkgPSB0cnVlOwotCQlmb3IgKERlcGVuZHMgZCA6IGxpc3QpZC5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElSZXNvdXJjZVtdIGdldChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJaW5pdCgpOwotCQlNYXA8SVJlc291cmNlLCBEZXBlbmRzPiBtYXAgPSBfZGVwZW5kc01hcC5nZXQoZGVwZW5kc09uLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAobWFwID09IG51bGwpcmV0dXJuIEVtcHR5UmVzb3VyY2VzOwotCQkKLQkJTGlzdDxJUmVzb3VyY2U+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxJUmVzb3VyY2U+KCk7Ci0JCWZvciAoTWFwLkVudHJ5PElSZXNvdXJjZSwgRGVwZW5kcz4gbWUgOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQlpZiAobWUuZ2V0VmFsdWUoKS5oYXNWYWxpZGF0b3IoaWQpKWxpc3QuYWRkKG1lLmdldEtleSgpKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPT0gMClyZXR1cm4gRW1wdHlSZXNvdXJjZXM7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzb3VyY2VzKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8RGVwZW5kZW50UmVzb3VyY2U+IGdldChJUmVzb3VyY2UgZGVwZW5kc09uKSB7Ci0JCWluaXQoKTsKLQkJTGlzdDxEZXBlbmRlbnRSZXNvdXJjZT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PERlcGVuZGVudFJlc291cmNlPigpOwotCQlNYXA8SVJlc291cmNlLCBEZXBlbmRzPiBtYXAgPSBfZGVwZW5kc01hcC5nZXQoZGVwZW5kc09uLmdldEZ1bGxQYXRoKCkpOwotCQlWYWxNYW5hZ2VyIHZtID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCWlmIChtYXAgIT0gbnVsbCl7Ci0JCQlmb3IgKE1hcC5FbnRyeTxJUmVzb3VyY2UsIERlcGVuZHM+IG1lIDogbWFwLmVudHJ5U2V0KCkpewotCQkJCWZvciAoU3RyaW5nIGlkIDogbWUuZ2V0VmFsdWUoKS5nZXRWYWxpZGF0b3JzRW5hYmxlZCgpKXsKLQkJCQkJSVJlc291cmNlIHJlcyA9IG1lLmdldEtleSgpOwotCQkJCQlWYWxpZGF0b3IgdiA9IHZtLmdldFZhbGlkYXRvcihpZCwgcmVzLmdldFByb2plY3QoKSk7Ci0JCQkJCWlmICh2ICE9IG51bGwpbGlzdC5hZGQobmV3IERlcGVuZGVudFJlc291cmNlKHJlcywgdikpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoU3RyaW5nIGlkLCBJUmVzb3VyY2UgZGVwZW5kZW50LCBJUmVzb3VyY2VbXSBkZXBlbmRzT24pIHsKLQkJZm9yIChJUmVzb3VyY2UgZCA6IGRlcGVuZHNPbilhZGQoaWQsIGRlcGVuZGVudCwgZCk7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVkT24oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWluaXQoKTsKLQkJcmV0dXJuIF9kZXBlbmRzTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBkb25lU2F2aW5nKElTYXZlQ29udGV4dCBjb250ZXh0KSB7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmVwYXJlVG9TYXZlKElTYXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCByb2xsYmFjayhJU2F2ZUNvbnRleHQgY29udGV4dCkgewotCX0KLQkKLQkvKioKLQkgKiBQZXJzaXN0IHRoZSBkZXBlbmRlbmN5IGluZGV4LgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgdGhlIGluZGV4IGlzOgotCSAqIDxwcmU+Ci0JICogVmVyc2lvbiBudW1iZXIKLQkgKiBOdW1iZXIgb2YgZGVwZW5kcyBvbiBlbnRyaWVzCi0JICogICBkZXBlbmRzIG9uIGZpbGUgbmFtZQotCSAqICAgbnVtYmVyIG9mIGRlcGVuZGVudCBlbnRyaWVzCi0JICogICAgIGRlcGVuZGVudCBmaWxlIG5hbWUKLQkgKiAgICAgbnVtYmVyIG9mIHZhbGlkYXRvcnMKLQkgKiAgICAgICB2YWxpZGF0b3IgaWQKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFfZGlydHkpcmV0dXJuOwotCQlfZGlydHkgPSBmYWxzZTsKLQkJCi0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IGdldEluZGV4TG9jYXRpb24oKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpKTsKLQkJCW91dC53cml0ZUludChDdXJyZW50VmVyc2lvbik7Ci0JCQlvdXQud3JpdGVJbnQoX2RlcGVuZHNNYXAuc2l6ZSgpKTsKLQkJCWZvciAoTWFwLkVudHJ5PElQYXRoLCBNYXA8SVJlc291cmNlLCBEZXBlbmRzPj4gbWUgOiBfZGVwZW5kc01hcC5lbnRyeVNldCgpKXsKLQkJCQlJUGF0aCBrZXkgPSBtZS5nZXRLZXkoKTsKLQkJCQlvdXQud3JpdGVVVEYoa2V5LnRvU3RyaW5nKCkpOwotCQkJCU1hcDxJUmVzb3VyY2UsIERlcGVuZHM+IG1hcCA9IG1lLmdldFZhbHVlKCk7Ci0JCQkJb3V0LndyaXRlSW50KG1hcC5zaXplKCkpOwotCQkJCWZvciAoTWFwLkVudHJ5PElSZXNvdXJjZSwgRGVwZW5kcz4gbWUyOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQkJCWludCB2YyA9IG1lMi5nZXRWYWx1ZSgpLnZhbGlkYXRvckNvdW50KCk7Ci0JCQkJCWlmICh2YyA9PSAwKWNvbnRpbnVlOwotCi0JCQkJCUlSZXNvdXJjZSBrZXkyID0gbWUyLmdldEtleSgpOwotCQkJCQlvdXQud3JpdGVVVEYoa2V5Mi5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQlNYXA8U3RyaW5nLCBCb29sZWFuPiBtYXAzID0gbWUyLmdldFZhbHVlKCkuZ2V0VmFsaWRhdG9ycygpOwotCQkJCQlvdXQud3JpdGVJbnQodmMpOwotCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJvb2xlYW4+IG1lMyA6IG1hcDMuZW50cnlTZXQoKSl7Ci0JCQkJCQlpZiAobWUzLmdldFZhbHVlKCkpb3V0LndyaXRlVVRGKG1lMy5nZXRLZXkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlNaXNjLmNsb3NlKG91dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0SW5kZXhMb2NhdGlvbigpIHsKLQkJSVBhdGggcGF0aCA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgiZGVwLmluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhdGgudG9GaWxlKCk7Ci0JfQotCi1wcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRzIHsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEJvb2xlYW4+IAlfdmFsaWRhdG9yczsKLQkKLQlwdWJsaWMgRGVwZW5kcyhJUmVzb3VyY2UgZGVwZW5kZW50KXsKLQkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KDUpOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRWYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcnM7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIGlkJ3MgdGhhdCBhcmUgc3RpbGwgZW5hYmxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZGF0b3JzRW5hYmxlZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQm9vbGVhbj4gbWUgOiBfdmFsaWRhdG9ycy5lbnRyeVNldCgpKXsKLQkJCWlmIChtZS5nZXRWYWx1ZSgpKWxpc3QuYWRkKG1lLmdldEtleSgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCV92YWxpZGF0b3JzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBpZCkgewotCQlfdmFsaWRhdG9ycy5wdXQoaWQsIEJvb2xlYW4uVFJVRSk7Ci0JCQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcihTdHJpbmcgaWQpIHsKLQkJQm9vbGVhbiB2ID0gX3ZhbGlkYXRvcnMuZ2V0KGlkKTsKLQkJaWYgKHYgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2LmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkvKiogCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2YgYWN0aXZlIGRlcGVuZGVuY2llcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCB2YWxpZGF0b3JDb3VudCgpewotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEJvb2xlYW4gYiA6IF92YWxpZGF0b3JzLnZhbHVlcygpKXsKLQkJCWlmIChiKWNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQkKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9FeHRlbnNpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZmMDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludHMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvbkNvbnN0YW50cyB7Ci0JCi0JLyoqIHZhbGlkYXRvclYyIC0gZXh0ZW5zaW9uIHBvaW50IGZvciByZWdpc3RlcmluZyB2YWxpZGF0b3JzIHRoYXQgdXNlIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuICovCi0JU3RyaW5nIHZhbGlkYXRvciA9ICJ2YWxpZGF0b3JWMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogYnVpbGQgLSBpcyB0aGUgdmFsaWRhdG9yIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbnM/IHRydWUgb3IgZmFsc2UgKi8KLQlTdHJpbmcgYnVpbGQgPSAiYnVpbGQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGNsYXNzIC0gbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIHZhbGlkYXRvciBjbGFzcy4gKi8KLQlTdHJpbmcgQXR0cmliQ2xhc3MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIG1hbnVhbCAtIGlzIHRoZSB2YWxpZGF0b3IgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBtYW51YWwgYmFzZWQgdmFsaWRhdGlvbnM/IHRydWUgb3IgZmFsc2UgKi8KLQlTdHJpbmcgbWFudWFsID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogc291cmNlaWQgLSBJZiB0aGlzIHZhbGlkYXRvciBhbHNvIHNlcnZlcyBhcyBhbiBhcy15b3UtdHlwZSB2YWxpZGF0b3IgKGFsc28ga25vdyBhcyBhbiBJU291cmNlVmFsaWRhdG9yKSAKLQkgKiB0aGVuIGl0J3Mgc291cmNlIGlkIGlzIHNwZWNpZmllZCBoZXJlLCBzbyB0aGF0IHRoZSB0d28gdmFsaWRhdG9ycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSAKLQkgKiBhbm90aGVyLiBCeSBzb3VyY2UgaWQsIHdlIG1lYW4gdGhlIGlkIHRoYXQgaXMgdXNlZCBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2VWYWxpZGF0aW9uIAotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlTdHJpbmcgc291cmNlSWQgPSAic291cmNlaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIHZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGlzIGRlZmluaXRpb24uIFRoZSBhdHRyaWJ1dGUgaXMgYSBzaW1wbGUgaW50ZWdlciwgYW5kIGlmIG5vdCBzcGVjaWZpZWQgaXQKLQkgKiBpcyBhc3N1bWVkIHRvIGJlIDEuIFRoaXMgYWxsb3dzIHRoZSBmaWx0ZXIgc2V0dGluZ3MgdG8gYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCVN0cmluZyB2ZXJzaW9uID0gInZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiBpbmNsdWRlIC0gYSBncm91cCBvZiBpbmNsdXNpb24gcnVsZXMuIEF0IGxlYXN0IG9uZSBydWxlIGluIHRoaXMgZ3JvdXAgbmVlZHMgdG8gbWF0Y2ggaW4gb3JkZXIgZm9yIHRoZSByZXNvdXJjZQotCSAqIHRvIHRvIGNvbnNpZGVyZWQgdG8gYmUgdmFsaWRhdGVkLgotCSAqLwotCVN0cmluZyBpbmNsdWRlID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGV4Y2x1ZGUgLSBhIGdyb3VwIG9mIGV4Y2x1c2lvbiBydWxlcy4gSWYgYW55IG9mIHRoZXNlIHJ1bGVzIG1hdGNoIHRoZSByZXNvdXJjZSBpcyBub3QgdmFsaWRhdGVkLiAqLwotCVN0cmluZyBleGNsdWRlID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHJ1bGVzIC0gYSBncm91cCBvZiBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIHJ1bGVzLiAqLwotCVN0cmluZyBydWxlcyA9ICJydWxlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogRGlmZmVyZW50IHR5cGVzIG9mIHJ1bGVzIGZvciBmaWx0ZXJpbmcgdmFsaWRhdGlvbi4gKi8KLQlpbnRlcmZhY2UgUnVsZSB7Ci0JCQotCQkvKiogcHJvamVjdE5hdHVyZSAtIGZpbHRlciBieSBwcm9qZWN0IG5hdHVyZS4gKi8KLQkJU3RyaW5nIHByb2plY3ROYXR1cmUgPSAicHJvamVjdE5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBmaWxlZXh0IC0gZmlsdGVyIGJ5IGZpbGUgZXh0ZW5zaW9uLiAqLwotCQlTdHJpbmcgZmlsZWV4dCA9ICJmaWxlZXh0IjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGZpbGUgLSBhIGZpbGUgbmFtZSwgaXQgY2FuIGluY2x1ZGUgcGF0aCBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAqLwotCQlTdHJpbmcgZmlsZSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGZhY2V0IC0gZmlsdGVyIGJ5IGZhY2V0IGlkLiAqLwotCQlTdHJpbmcgZmFjZXQgPSAiZmFjZXQiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogY29udGVudFR5cGUgLSBmaWx0ZXIgYnkgY29udGVudCB0eXBlLiAqLwotCQlTdHJpbmcgY29udGVudFR5cGUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKiBSdWxlIGF0dHJpYnV0ZXMgKi8KLQlpbnRlcmZhY2UgUnVsZUF0dHJpYiB7Ci0JCQotCQkvKiogY2FzZVNlbnNpdGl2ZSAtIHRydWUgb3IgZmFsc2UuICovCi0JCVN0cmluZyBjYXNlU2Vuc2l0aXZlID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogCi0JCSAqIGV4YWN0TWF0Y2ggLSB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0IGlzIHRydWUuIEl0IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgY29udGVudCB0eXBlcyBuZWVkIHRvIG1hdGNoCi0JCSAqIGV4YWN0bHksIG9yIHdoZXRoZXIgc3ViIHR5cGVzIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQuCi0JCSAqLwotCQlTdHJpbmcgZXhhY3RNYXRjaCA9ICJleGFjdE1hdGNoIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGV4dCAtIGEgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlICJodG1sIi4gKi8KLQkJU3RyaW5nIGV4dCA9ICJleHQiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogaWQgLSBhbiBpZGVudGlmaWVyLiAqLwotCQlTdHJpbmcgaWQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogbmFtZSAtIGEgZmlsZSBuYW1lLiAqLwotCQlTdHJpbmcgbmFtZSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIAotCQkgKiB0eXBlIC0gdGhlIHR5cGUgb2YgZmlsZSB0byBiZSBtYXRjaGVkOgotCQkgKiA8dWw+Ci0JCSAqIDxsaT5mb2xkZXIgLSBwcm9qZWN0IHJlbGF0aXZlIGZvbGRlciBuYW1lCi0JCSAqIDxsaT5maWxlIC0gc2ltcGxlIGZpbGUgbmFtZQotCQkgKiA8bGk+ZnVsbCAtIGZ1bGx5IHF1YWxpZmllZCwgcHJvamVjdCByZWxhdGl2ZSBmaWxlIG5hbWUKLQkJICogPC91bD4KLQkJICovCi0JCVN0cmluZyBmaWxlVHlwZSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlpbnRlcmZhY2UgRmlsZVR5cGUgewotCQkvKiogZm9sZGVyIC0gcHJvamVjdCByZWxhdGl2ZSBmb2xkZXIgbmFtZSAqLwotCQlTdHJpbmcgZm9sZGVyID0gImZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBmaWxlIC0gc2ltcGxlIGZpbGUgbmFtZSAqLwotCQlTdHJpbmcgZmlsZSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGZ1bGwgLSBmdWxseSBxdWFsaWZpZWQsIHByb2plY3QgcmVsYXRpdmUgZmlsZSBuYW1lICovCi0JCVN0cmluZyBmdWxsID0gImZ1bGwiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCWludGVyZmFjZSBNZXNzYWdlQ2F0ZWdvcnkgewotCQkvKiogbWVzc2FnZUNhdGVnb3J5IC0gbmFtZSBvZiB0aGUgbWVzc2FnZSBjYXRlZ29yeSBlbGVtZW50LiAqLwotCQlTdHJpbmcgbmFtZSA9ICJtZXNzYWdlQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogaWQgLSBzaW1wbGUgaWQgb2YgdGhlIG1lc3NhZ2UuICovCi0JCVN0cmluZyBpZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBsYWJlbCA9IGh1bWFuIHJlYWRhYmxlIGxhYmVsIG9mIHRoZSBtZXNzYWdlIGNhdGVnb3J5LiAqLwotCQlTdHJpbmcgbGFiZWwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogc2V2ZXJpdHkgLSBtZXNzYWdlIHNldmVyaXR5LCBpdCBtdXN0IGJlIG9uZSBvZiBlcnJvciwgd2FybmluZyBvciBpZ25vcmUuICovCi0JCVN0cmluZyBzZXZlcml0eSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBzZXZFcnJvciA9ICJlcnJvciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNldldhcm5pbmcgPSAid2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNldklnbm9yZSA9ICJpZ25vcmUiOyAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiogdHJ1ZSAqLwotCVN0cmluZyBUcnVlID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGZhbHNlICovCi0JU3RyaW5nIEZhbHNlID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbENoYW5nZWRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbENoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGIyOTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogQSBjbGFzcyB0aGF0IHdhbnRzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHZhbGlkYXRvciBwcmVmZXJlbmNlcyBjaGFuZ2UuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxDaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIFRoZSB2YWxpZGF0b3JzIGZvciB0aGUgcHJvamVjdCBoYXZlIGNoYW5nZWQuCi0JICogIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGNhbiBiZSBudWxsLCB3aGljaCBtZWFucyB0aGF0IHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBoYXZlCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0b3JzRm9yUHJvamVjdENoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NYXJrZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDFlYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEEgY2VudHJhbCBwbGFjZSB0byBtYW5hZ2UgYWxsIG9mIHRoZSBWMiB2YWxpZGF0aW9uIG1hcmtlcnMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWFya2VyTWFuYWdlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFya2VyTWFuYWdlciBfbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBNYXJrZXJNYW5hZ2VyIGdldERlZmF1bHQoKXsKLQkJaWYgKF9tZSA9PSBudWxsKV9tZSA9IG5ldyBNYXJrZXJNYW5hZ2VyKCk7Ci0JCXJldHVybiBfbWU7Ci0JfQotCQotCS8qKgotCSAqIENsZWFyIGFueSB2YWxpZGF0aW9uIG1hcmtlcnMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSB0aGlzIHZhbGlkYXRvci4KLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IG1heSBoYXZlIGl0J3MgbWFya2VycyBjbGVhcmVkLiBJdCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZQotCSAqIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQkgKiBAcGFyYW0gdmFsaWRhdG9ySWQgdGhlIGlkIG9mIHZhbGlkYXRvciB0aGF0IGNyZWF0ZWQgdGhlIG1hcmtlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbGlkYXRvcklkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKXJldHVybjsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhWYWxDb25zdGFudHMuUHJvYmxlbU1hcmtlciwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpewotCQkJU3RyaW5nIGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZShWYWxpZGF0b3JNZXNzYWdlLlZhbGlkYXRpb25JZCwgbnVsbCk7Ci0JCQlpZiAodmFsaWRhdG9ySWQuZXF1YWxzKGlkKSltYXJrZXIuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgY3JlYXRlTWFya2VyKFZhbGlkYXRvck1lc3NhZ2UgbSwgU3RyaW5nIGlkKXsKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihtLmdldFR5cGUoKSk7Ci0JCQlNYXAgbWFwID0gbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAobWFwLmdldChWYWxpZGF0b3JNZXNzYWdlLlZhbGlkYXRpb25JZCkgPT0gbnVsbCkKLQkJCQltYXAucHV0KFZhbGlkYXRvck1lc3NhZ2UuVmFsaWRhdGlvbklkLCBpZCk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJaWYgKCFtLmdldFJlc291cmNlKCkuZXhpc3RzKCkpdGhyb3cgbmV3IFJlc291cmNlVW5hdmFpbGFibGVFcnJvcihtLmdldFJlc291cmNlKCkpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIERlbGV0ZSBhbGwgdGhlIG1hcmtlcnMgb24gdGhpcyByZXNvdXJjZSB0aGF0IHdlcmUgY3JlYXRlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiBzdGFydCB0aW1lLgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBvcGVyYXRpb25TdGFydFRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgbG9uZyBvcGVyYXRpb25TdGFydFRpbWUpewotCQl0cnkgewotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhWYWxDb25zdGFudHMuUHJvYmxlbU1hcmtlciwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKXsKLQkJCQlsb25nIGNyZWF0ZVRpbWUgPSBtYXJrZXIuZ2V0Q3JlYXRpb25UaW1lKCk7Ci0vLwkJCQlsb25nIGRpZmYgPSBjcmVhdGVUaW1lIC0gb3BlcmF0aW9uU3RhcnRUaW1lOwotCQkJCWlmIChjcmVhdGVUaW1lIDwgb3BlcmF0aW9uU3RhcnRUaW1lKW1hcmtlci5kZWxldGUoKTsKLQkJCX0KLQkJCQotCQkJcmVzb3VyY2UuZGVsZXRlTWFya2VycyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSB8fCAhcHJvamVjdC5pc09wZW4oKSl0aHJvdyBuZXcgUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IocHJvamVjdCk7Ci0JCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKXRocm93IG5ldyBSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IocmVzb3VyY2UpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQlwdWJsaWMgdm9pZCBtYWtlTWFya2VycyhMaXN0PElNZXNzYWdlPiBsaXN0KXsKLQkJZm9yIChJTWVzc2FnZSBtZXNzYWdlIDogbGlzdCl7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCl7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSl7Ci0JCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKXRhcmdldDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gcmVzLmNyZWF0ZU1hcmtlcihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSKTsKLQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlLmdldFRleHQoKSk7Ci0JCQkJCQlpbnQgbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQkJCQlpbnQgc2V2ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQkJCQkJaWYgKChzZXYgJiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSAhPSAwKW1hcmtlclNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKLQkJCQkJCWVsc2UgaWYgKChzZXYgJiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpICE9IDApbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIG1hcmtlclNldmVyaXR5KTsKLQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWlzYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWlzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRjZjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL01pc2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuVGhyZWFkTVhCZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU29tZSBtaXNjZWxsYW5lb3VzIGhlbHBlciBtZXRob2RzLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXNjIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gaW4pewotCQlpZiAoaW4gPT0gbnVsbClyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpbi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJaWYgKG91dCA9PSBudWxsKXJldHVybjsKLQkJdHJ5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnT3B0aW9uQXNCb29sZWFuKFN0cmluZyBvcHRpb24pewotCQlTdHJpbmcgb3B0ID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24ob3B0aW9uKTsKLQkJaWYgKG9wdCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJb3B0ID0gb3B0LnRvTG93ZXJDYXNlKCk7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzKG9wdCkpcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCJ5ZXMiLmVxdWFscyhvcHQpKXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQW5zd2VyIGEgdW5pdHMgYXBwcm9wcmlhdGUgc3RyaW5nIGZvciB0aGUgdGltZS4KLQkgKiBAcGFyYW0gdGltZSB0aW1lIGluIG5hbm8gc2Vjb25kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpbWVOYW5vKGxvbmcgdGltZSl7Ci0JCWlmICh0aW1lIDw9IDEwMDApcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLlRpbWVOYW5vLCB0aW1lKTsKLQkJaWYgKHRpbWUgPD0gMTAwMDAwMClyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuVGltZU1pY3JvLCB0aW1lLzEwMDApOwotCQlyZXR1cm4gZ2V0VGltZU1TKHRpbWUvMTAwMDAwMCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgQ1BVIHRpbWUgY29uc3VtZWQgYnkgdGhpcyB0aHJlYWQgaW4gbmFubyBzZWNvbmRzLgotCSAqIEByZXR1cm4gLTEgaWYgdGhlIHRpbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUFVUaW1lKCl7Ci0JCWxvbmcgY3B1VGltZSA9IC0xOwotCQlUaHJlYWRNWEJlYW4gdGIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRUaHJlYWRNWEJlYW4oKTsKLQkJaWYgKHRiLmlzQ3VycmVudFRocmVhZENwdVRpbWVTdXBwb3J0ZWQoKSl7Ci0JCQljcHVUaW1lID0gdGIuZ2V0Q3VycmVudFRocmVhZENwdVRpbWUoKTsKLQkJfQotCQlyZXR1cm4gY3B1VGltZTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgdW5pdHMgYXBwcm9wcmlhdGUgc3RyaW5nIGZvciB0aGUgdGltZS4KLQkgKiBAcGFyYW0gdGltZSB0aW1lIGluIG1pbGxpc2Vjb25kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpbWVNUyhsb25nIHRpbWUpIHsKLQkJaWYgKHRpbWUgPD0gMTAwMClyZXR1cm4gVmFsTWVzc2FnZXMuVGltZVVuZGVyOwotCQlpZiAodGltZSA8PSA2MDAwMClyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuVGltZVNlYywgdGltZS8xMDAwKTsKLQkJcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLlRpbWVNaW4sIHRpbWUvNjAwMDApOwotCX0KLQotCS8qKgotCSAqIFVzZWQgaW4gZGVidWdnaW5nIHNvIHdlIGNhbiBzZWUgd2hhdCB0eXBlcyBvZiBtYXJrZXJzIHRoZXJlIGFyZS4KLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0TWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwMCk7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoSU1hcmtlciBtIDogbWFya2Vycyl7Ci0JCQkJT2JqZWN0IG8gPSBtLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotCQkJCWlmIChvICE9IG51bGwpewotCQkJCQliLmFwcGVuZChvKTsKLQkJCQl9Ci0JCQkJbyA9IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpOwotCQkJCWlmIChvICE9IG51bGwpewotCQkJCQliLmFwcGVuZCgiLCBTZXZlcml0eT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQliLmFwcGVuZChvKTsKLQkJCQl9Ci0JCQkJYi5hcHBlbmQoIjsgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQotCQl9Ci0JCXJldHVybiBiLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBuaXkoU3RyaW5nIG1zZyl7Ci0JCWlmIChtc2cgPT0gbnVsbCltc2cgPSAiU29ycnksIHRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB0eXBlIGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlQ2hhbmdlRXZlbnRUeXBlKGludCB0eXBlKXsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwMCk7Ci0JCWlmICgodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpICE9IDApYi5hcHBlbmQoInBvc3RfYnVpbGQgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpICE9IDApYi5hcHBlbmQoInBvc3RfY2hhbmdlICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCkgIT0gMCliLmFwcGVuZCgicHJlX2J1aWxkICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSkgIT0gMCliLmFwcGVuZCgicHJlX2Nsb3NlICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpICE9IDApYi5hcHBlbmQoInByZV9kZWxldGUgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1BlcmZvcm1hbmNlTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTEwNTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1BlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUGVyZm9ybWFuY2VDb3VudGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvciBpbXBsZW1lbnRzIElQZXJmb3JtYW5jZU1vbml0b3IgewotCQotCXByaXZhdGUgQ29sbGVjdGlvbkxldmVsIF9sZXZlbCA9IENvbGxlY3Rpb25MZXZlbC5Ob25lOwotCXByaXZhdGUgYm9vbGVhbgkJCV9zdW1tYXJ5T25seTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwZXJmb3JtYW5jZSBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0cmFjZVRpbWVzCi0JICogICAgICAgICAgICBzaG91bGQgdGhlIG1vbml0b3IgYmUgdHVybmVkIG9uPwotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBzaG91bGQgdGhlIGV2ZW50cyBiZSBsb2dnZWQgdG8gYSBmaWxlLiBJZiB0aGlzIGlzIG51bGwgb3IgdGhlCi0JICogICAgICAgICAgICBlbXB0eSBzdHJpbmcgdGhlIGV2ZW50cyB3aWxsIGJlIHdyaXR0ZW4gdG8gc3RkZXJyLiBPdGhlcndpc2UKLQkgKiAgICAgICAgICAgIHRoZSBldmVudHMgYXJlIGFwcGVuZGVkIHRvIGEgZmlsZSB3aXRoIHRoaXMgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvciBjcmVhdGUoYm9vbGVhbiB0cmFjZVRpbWVzLCBTdHJpbmcgZmlsZSl7Ci0JCVBlcmZvcm1hbmNlTW9uaXRvciBwbSA9IG51bGw7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgZmlsZS5sZW5ndGgoKSA9PSAwKXBtID0gbmV3IFBlcmZvcm1hbmNlTW9uaXRvcigpOwotCQllbHNlIHBtID0gbmV3IFRvRmlsZShmaWxlKTsKLQkJCi0JCWlmICh0cmFjZVRpbWVzKXBtLnNldENvbGxlY3Rpb25MZXZlbChDb2xsZWN0aW9uTGV2ZWwuRGVmYXVsdCk7Ci0JCQotCQlyZXR1cm4gcG07Ci0JfQotCQotCXByaXZhdGUgUGVyZm9ybWFuY2VNb25pdG9yKCl7fTsKLQkKLQlwdWJsaWMgQ29sbGVjdGlvbkxldmVsIGdldENvbGxlY3Rpb25MZXZlbCgpIHsKLQkJcmV0dXJuIF9sZXZlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uTGV2ZWwoQ29sbGVjdGlvbkxldmVsIGxldmVsKSB7Ci0JCV9sZXZlbCA9IGxldmVsOwotCX0KLQotCXB1YmxpYyBMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+IGdldFBlcmZvcm1hbmNlQ291bnRlcnMoYm9vbGVhbiBhc1N1bW1hcnkpIHsKLQkJcmV0dXJuIG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW5nKCkgewotCQlyZXR1cm4gX2xldmVsICE9IENvbGxlY3Rpb25MZXZlbC5Ob25lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1bW1hcnlPbmx5KCkgewotCQlyZXR1cm4gX3N1bW1hcnlPbmx5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoUGVyZm9ybWFuY2VDb3VudGVycyBjb3VudGVycyl7Ci0JCVRyYWNpbmcud3JpdGUoY291bnRlcnMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRlcnN7Ci0JCVN0cmluZwluYW1lOwotCQlpbnQgCW51bWJlckludm9jYXRpb25zOwotCQkKLQkJLyoqIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuICovCi0JCWxvbmcJZWxhcHNlZFRpbWU7Ci0JCQotCQkvKiogQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMsIG9yIC0xIGlmIHVua25vd24uICovCi0JCWxvbmcJY3B1VGltZTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRvRmlsZSBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvciB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyAJCV9maWxlTmFtZTsKLQkJcHJpdmF0ZSBQcmludFdyaXRlciBfcHc7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDb21tYT0iLCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXByaXZhdGUgVG9GaWxlKFN0cmluZyBmaWxlTmFtZSl7Ci0JCQlfZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoUGVyZm9ybWFuY2VDb3VudGVycyBwYykgewotCQkJdHJ5IHsKLQkJCQlQcmludFdyaXRlciBwdyA9IGdldFdyaXRlcigpOwotCQkJCXB3LnByaW50bG4ocGMuZ2V0VmFsaWRhdG9ySWQoKSArIENvbW1hICsgcGMuZ2V0TnVtYmVySW52b2NhdGlvbnMoKSArCi0JCQkJCUNvbW1hK3BjLmdldEVsYXBzZWRUaW1lKCkrQ29tbWErcGMuZ2V0Q3B1VGltZSgpKTsKLQkJCQlwdy5mbHVzaCgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAoX3B3ID09IG51bGwpewotCQkJCV9wdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShfZmlsZU5hbWUsIHRydWUpKTsKLQkJCQlEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCk7Ci0JCQkJX3B3LnByaW50bG4oIiMgIiArIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1Nlc3Npb24sICAvLyROT04tTkxTLTEkCi0JCQkJCWRmLmZvcm1hdChuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gX3B3OwotCQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW5nIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yIHsKLQkJcHJpdmF0ZSBMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+CV9jb3VudGVycyA9IG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGQoUGVyZm9ybWFuY2VDb3VudGVycyBjb3VudGVycyl7Ci0JCQlfY291bnRlcnMuYWRkKGNvdW50ZXJzKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8UGVyZm9ybWFuY2VDb3VudGVycz4gZ2V0UGVyZm9ybWFuY2VDb3VudGVycyhib29sZWFuIGFzU3VtbWFyeSkgewotCQkJaWYgKGFzU3VtbWFyeSl7Ci0JCQkJTWFwPFN0cmluZywgQ291bnRlcnM+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ291bnRlcnM+KDQwKTsKLQkJCQlmb3IgKFBlcmZvcm1hbmNlQ291bnRlcnMgcGMgOiBfY291bnRlcnMpewotCQkJCQlDb3VudGVycyBjID0gbWFwLmdldChwYy5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKGMgPT0gbnVsbCl7Ci0JCQkJCQljID0gbmV3IENvdW50ZXJzKCk7Ci0JCQkJCQljLm5hbWUgPSBwYy5nZXRWYWxpZGF0b3JOYW1lKCk7Ci0JCQkJCQltYXAucHV0KHBjLmdldFZhbGlkYXRvcklkKCksIGMpOwotCQkJCQl9Ci0JCQkJCWMubnVtYmVySW52b2NhdGlvbnMgKz0gcGMuZ2V0TnVtYmVySW52b2NhdGlvbnMoKTsKLQkJCQkJYy5lbGFwc2VkVGltZSArPSBwYy5nZXRFbGFwc2VkVGltZSgpOwotCQkJCQlpZiAocGMuZ2V0Q3B1VGltZSgpICE9IC0xKWMuY3B1VGltZSArPSBwYy5nZXRDcHVUaW1lKCk7Ci0JCQkJCWVsc2UgYy5jcHVUaW1lID0gLTE7Ci0JCQkJfQotCQkJCUxpc3Q8UGVyZm9ybWFuY2VDb3VudGVycz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb3VudGVycz4gbWUgOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQkJCUNvdW50ZXJzIGMgPSBtZS5nZXRWYWx1ZSgpOwotCQkJCQlsaXN0LmFkZChuZXcgUGVyZm9ybWFuY2VDb3VudGVycyhtZS5nZXRLZXkoKSwgYy5uYW1lLCBudWxsLCBjLm51bWJlckludm9jYXRpb25zLCBjLmVsYXBzZWRUaW1lLCBjLmNwdVRpbWUpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpc3Q7Ci0JCQl9Ci0JCQlyZXR1cm4gX2NvdW50ZXJzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSB7Ci0JCQlfY291bnRlcnMuY2xlYXIoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QcmVmQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QcmVmQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTI4ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJlZkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgc28gc2F2ZSB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb25zLiAKLSAqIDxwPgotICogVGhlIGVudHJpZXMgaW4gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGFyZSBvcmdhbml6ZWQgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAqIDxwcmU+Ci0gKiAvaW5zdGFuY2UvZnJhbWUtd29yay1pZC9zYXZlQXV0bz10cnVlfGZhbHNlCi0gKiAvaW5zdGFuY2UvZnJhbWUtd29yay1pZC9zdXNwZW5kPXRydWV8ZmFsc2UKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL3ZmLnZlcnNpb249MgotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvYnVpbGQ9dHJ1ZXxmYWxzZQotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvbWFudWFsPXRydWV8ZmFsc2UKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL3ZlcnNpb249c29tZU51bWJlcgotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvZ3JvdXBzLzAvdHlwZT1pbmNsdWRlfGV4Y2x1ZGUKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzAvdHlwZT1maWxlfGZpbGVleHR8cHJvamVjdE5hdHVyZXwuLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzAvcGF0dGVybj0uLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzEvdHlwZT1maWxlfGZpbGVleHR8cHJvamVjdE5hdHVyZXwuLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzEvcGF0dGVybj0uLi4KLSAqIAotICogPC9wcmU+Ci0gKiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZkNvbnN0YW50cyB7Ci0JCi0JLyoqIGZpbHRlcnMgLSBub2RlIHdoZXJlIGFsbCB0aGUgZmlsdGVycyBhcmUgc2F2ZWQuICovCi0JU3RyaW5nIGZpbHRlcnMgPSAiZmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogYnVpbGQgLSBpcyB0aGUgdmFsaWRhdG9yIGVuYWJsZWQgZm9yIGJ1aWxkcz8gKi8KLQlTdHJpbmcgYnVpbGQgPSAiYnVpbGQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGRlbGVnYXRlIC0gdGhlIGRlbGVnYXRpbmcgaW1wbGVtZW50YXRpb24gdG8gdXNlICovCi0JU3RyaW5nIGRlbGVnYXRlID0gImRlbGVnYXRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBleGFjdE1hdGNoIC0gbXVzdCB0aGUgY29udGVudCB0eXBlIG1hdGNoIGV4YWN0bHk/ICovCi0JU3RyaW5nIGV4YWN0TWF0Y2ggPSAiZXhhY3RNYXRjaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogbWFudWFsIC0gaXMgdGhlIHZhbGlkYXRvciBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbj8gKi8KLQlTdHJpbmcgbWFudWFsID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogbXNncyAtIG5vZGUgd2hlcmUgYWxsIHRoZSBtZXNzYWdlIHNldmVyaXR5IG1hcHBpbmdzIGFyZSBzdG9yZWQuICovCi0JU3RyaW5nIG1zZ3MgPSAibXNncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogdmVyc2lvbiAtIHZlcnNpb24gb2YgdGhlIGZpbHRlciBkZWZpbml0aW9uLiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IGEgY2xpZW50IGNhbiB1c2UgdG8ga2VlcCB0cmFjawotCSAqIG9mIGNoYW5nZXMgdGhhdCB0aGV5IG1pZ2h0IG1ha2UgdG8gdGhlaXIgdmFsaWRhdGlvbiBleHRlbnNpb24uCi0JICovCi0JU3RyaW5nIHZlcnNpb24gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdmYudmVyc2lvbiAtIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiAqLwotCVN0cmluZyBmcmFtZXdvcmtWZXJzaW9uID0gInZmLnZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGdyb3VwcyAtIGZpbHRlciBncm91cC4gKi8KLQlTdHJpbmcgZ3JvdXBzID0gImdyb3VwcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHlwZSAtIHR5cGUgb2YgZ3JvdXAsIGVpdGhlciBpbmNsdWRlIG9yIGV4Y2x1ZGUuICovCi0JU3RyaW5nIHR5cGUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHlwZSAtIHRoZSB0eXBlIG9mIHJ1bGUuICovCi0JU3RyaW5nIHJ1bGVUeXBlID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHJ1bGVzIC0gYSBmaWx0ZXIgcnVsZS4gKi8KLQlTdHJpbmcgcnVsZXMgPSAicnVsZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHBhdHRlcm4gLSB0aGUgcGF0dGVybiBwYXJ0IG9mIHRoZSBydWxlLiAqLwotCVN0cmluZyBwYXR0ZXJuID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHNhdmVBdXRvIC0gY2FuIHdlIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMgYXV0b21hdGljYWxseT8gdHJ1ZS9mYWxzZSAqLwotCVN0cmluZyBzYXZlQXV0byA9ICJzYXZlQXV0byI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogc3RhdGVUUyAtIHBsdWctaW4gc3RhdGUgdGltZSBzdGFtcCAqLwotCVN0cmluZyBzdGF0ZVRTID0gInN0YXRlVFMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHN1c3BlbmQgLSBzdXNwZW5kIGFsbCB2YWxpZGF0aW9uPyB0cnVlL2ZhbHNlICovCi0JU3RyaW5nIHN1c3BlbmQgPSAic3VzcGVuZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogY2FzZSAtIGlzIHRoaXMgY2FzZSBzZW5zaXRpdmU/ICovCi0JU3RyaW5nIGNhc2VTZW5zaXRpdmUgPSAiY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZmlsZVR5cGUgLSB0aGUgdHlwZSBvZiBmaWxlLCBzZWUgRmlsdGVyUnVsZS5GaWxlICovCi0JU3RyaW5nIGZpbGVUeXBlID0gImZpbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBjb25maXJtRGlhbG9nIC0gc2hvdWxkIHdlIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIHdoZW4gZG9pbmcgYSBtYW51YWwgdmFsaWRhdGlvbj8gKi8KLQlTdHJpbmcgY29uZmlybURpYWxvZyA9ICJjb25maXJtRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBvdmVycmlkZSAtIHNob3VsZCB3ZSBzaG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXM/ICovCi0JU3RyaW5nIG92ZXJyaWRlID0gIm92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2plY3RVbmF2YWlsYWJsZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjNjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGludGVybmFsIGVycm9yIGlzIHVzZWQgdG8gc2lnbmFsIHRoYXQgYSBwcm9qZWN0IGlzIG5vdyB1bmF2YWlsYWJsZS4KLSAqIDxwPgotICogV2UgY291bGQgYmUgaW4gdGhlIG1pZGRsZSBvZiB2YWxpZGF0aW5nIGEgbGFyZ2UgcHJvamVjdCwgYW5kIHRoZSBwcm9qZWN0IGNvdWxkIGJlIGNsb3NlZC4gCi0gKiBUaGlzIGVycm9yIGlzIHVzZWQgdG8gImV4aXQiIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIDxwPgotICogVGhpcyBpcyBhbiBlcnJvciByYXRoZXIgdGhhbiBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHNvbWUgcGFydHMgb2YgRWNsaXBzZSBsaWtlIHRvCi0gKiB0cmFwIFJ1bnRpbWVFeGNlcHRpb25zIGFuZCBsb2cgdGhlbS4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciBleHRlbmRzIEVycm9yIHsKLQkKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjAwODAxMjgxMTE4TDsKLQkKLQlwdWJsaWMgUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IoSVByb2plY3QgcHJvamVjdCl7Ci0JCXN1cGVyKCk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhZTZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogVGhpcyBpbnRlcm5hbCBlcnJvciBpcyB1c2VkIHRvIHNpZ25hbCB0aGF0IGEgcmVzb3VyY2UgaXMgbm93IHVuYXZhaWxhYmxlLgotICogPHA+Ci0gKiBUaGlzIGVycm9yIGlzIHVzZWQgdG8gImV4aXQiIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gCi0gKiA8cD4KLSAqIFRoaXMgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSBzb21lIHBhcnRzIG9mIEVjbGlwc2UgbGlrZSB0bwotICogdHJhcCBSdW50aW1lRXhjZXB0aW9ucyBhbmQgbG9nIHRoZW0uCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjAwODAxMjkwODUzTDsKLQkKLQlwcml2YXRlIElSZXNvdXJjZSBfcmVzb3VyY2U7Ci0JCi0JcHVibGljIFJlc291cmNlVW5hdmFpbGFibGVFcnJvcihJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlzdXBlcigpOwotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvU3VtbWFyeVJlcG9ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9TdW1tYXJ5UmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNTNjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9TdW1tYXJ5UmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgd29ya2JlbmNoIHJlcG9ydGVyIGJ5IGNhcHR1cmluZyBzb21lIHN1bW1hcnkgaW5mb3JtYXRpb24gYWJvdXQgYW55IGFkZGVkCi0gKiBtZXNzYWdlcy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdW1tYXJ5UmVwb3J0ZXIgZXh0ZW5kcyBXb3JrYmVuY2hSZXBvcnRlciB7Ci0JCi0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5SGlnaDsKLQlwcml2YXRlIGludCBfc2V2ZXJpdHlOb3JtYWw7Ci0JcHJpdmF0ZSBpbnQJX3NldmVyaXR5TG93OwotCi0JcHVibGljIFN1bW1hcnlSZXBvcnRlcihJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIocHJvamVjdCwgbW9uaXRvcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJc3VwZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpOwotCQlzd2l0Y2ggKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSl7Ci0JCWNhc2UgSU1lc3NhZ2UuSElHSF9TRVZFUklUWTogCi0JCQlfc2V2ZXJpdHlIaWdoKys7Ci0JCQlicmVhazsKLQkJY2FzZSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk6IAotCQkJX3NldmVyaXR5Tm9ybWFsKys7Ci0JCQlicmVhazsKLQkJY2FzZSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk6Ci0JCQlfc2V2ZXJpdHlMb3crKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXZlcml0eUhpZ2goKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHlIaWdoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlOb3JtYWwoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHlOb3JtYWw7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXZlcml0eUxvdygpIHsKLQkJcmV0dXJuIF9zZXZlcml0eUxvdzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1RyYWNpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1RyYWNpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiOTkzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UcmFjaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBDb250cm9sIHRoZSB0cmFjaW5nIHRoYXQgdGhpcyBwbHVnLWluIHBlcmZvcm1zLiBUaGlzIGlzIHVzZWQgZm9yIHNlcnZpY2UuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2luZyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGF0ZUZvcm1hdCAJX2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tOnNzLlNTU1MiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4JCV9mb3JjZUxvZ2dpbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbgkJX3RyYWNlTWF0Y2hlczsKLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuCQlfdHJhY2VWMTsKLQkKLQkvKioKLQkgKiBBcmUgd2UgaW4gbG9nZ2luZy9kZWJ1Z2dpbmcgbW9kZT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2dnaW5nKCl7Ci0JCXJldHVybiBfZm9yY2VMb2dnaW5nIHx8IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2VNYXRjaGVzKCl7Ci0JCWlmIChfdHJhY2VNYXRjaGVzID09IG51bGwpewotCQkJX3RyYWNlTWF0Y2hlcyA9IE1pc2MuZGVidWdPcHRpb25Bc0Jvb2xlYW4oRGVidWdDb25zdGFudHMuVHJhY2VNYXRjaGVzKTsKLQkJfQotCQlyZXR1cm4gX3RyYWNlTWF0Y2hlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2VWMSgpewotCQlpZiAoX3RyYWNlVjEgPT0gbnVsbCl7Ci0JCQlfdHJhY2VWMSA9IE1pc2MuZGVidWdPcHRpb25Bc0Jvb2xlYW4oRGVidWdDb25zdGFudHMuVHJhY2VWMSk7Ci0JCX0KLQkJcmV0dXJuIF90cmFjZVYxOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgbGluZSB0byB0aGUgY29uc29sZSBmb3IgZGVidWdnaW5nLCBpZiBpbiBkZWJ1Z2dpbmcgbW9kZS4KLQkgKiBAcGFyYW0gbGluZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIGxpbmUpewotCQlpZiAoaXNMb2dnaW5nKCkpd3JpdGUobGluZSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBsaW5lIHRvIHRoZSBsb2cuIEluY2x1ZGUgYSB0aW1lIHN0YW1wIHdpdGggdGhlIGxpbmUuCi0JICogQHBhcmFtIGxpbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoU3RyaW5nIGxpbmUpewotCQlTeXN0ZW0uZXJyLnByaW50bG4odGltZXN0YW1wSXQobGluZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpbWVzdGFtcEl0KFN0cmluZyBsaW5lKXsKLQkJRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKLQkJbG9uZyB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7Ci0JCXJldHVybiBfZGYuZm9ybWF0KGRhdGUpICsgIiAiICsgdGhyZWFkICsgIiAiICsgbGluZTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCQkKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgaW4gbG9nZ2luZyBtb2RlLCBsb2cgdGhlIGl0ZW0sIGFuZCB0aGVuIHJlc2V0IHRoZSBzdHJpbmcgYnVmZmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nQnVmZmVyIGIpewotCQlsb2coYi50b1N0cmluZygpKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgdGhlIGxvZ2dpbmcgdG8gYmUgdHVybmVkIG9uLiBOb3JtYWxseSBsb2dnaW5nIGlzIHR1cm5lZCBvbiB2aWEgLWRlYnVnIG9wdGlvbnMuIEhvd2V2ZXIKLQkgKiB0aGUgbG9nZ2luZyBjYW4gYmUgZm9yY2VkIHRvIGJlIG9uIGJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLiAoU2V0dGluZyB0aGlzIHRvIGZhbHNlIGRvZXNuJ3QgZm9yY2UKLQkgKiB0aGUgbG9nZ2luZyB0byBiZSB0dXJuZWQgb2ZmKS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2VMb2dnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcmNlTG9nZ2luZyhib29sZWFuIGZvcmNlTG9nZ2luZykgewotCQlfZm9yY2VMb2dnaW5nID0gZm9yY2VMb2dnaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsQnVpbGRlckpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsQnVpbGRlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTc3YWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbEJ1aWxkZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFJ1biBhbGwgdGhlIHYyIHZhbGlkYXRvcnMgdGhyb3VnaCB0aGlzIGpvYi4KLSAqIDxwPgotICogVGhpcyBpcyB0aGUgbWFpbiBjbGFzcyBmb3Igc3VwcG9ydGluZyBidWlsZCBiYXNlZCB2YWxpZGF0aW9uLiBXaGVuIHRyaWdnZXJlZCBpdCBsb29rcyBhdCBhbGwgb2YgdGhlCi0gKiByZXNvdXJjZSBjaGFuZ2VzIGFuZCBkZXRlcm1pbmVzIHdoYXQgbmVlZHMgdG8gYmUgdmFsaWRhdGVkLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxCdWlsZGVySm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yLCBJUmVzb3VyY2VWaXNpdG9yIHsKLQkKLQkvKiogVGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyBidWlsdC4gKi8KLQlwcml2YXRlIElQcm9qZWN0IAkJCV9wcm9qZWN0OwotCQotCS8qKiBUaGUgcmVzb3VyY2UgZGVsdGEgdGhhdCB0cmlnZ2VyZWQgdGhlIGJ1aWxkLCBpdCB3aWxsIGJlIG51bGwgZm9yIGEgZnVsbCBidWlsZC4gKi8KLQlwcml2YXRlIElSZXNvdXJjZURlbHRhCQlfZGVsdGE7Ci0JCi0JcHJpdmF0ZSBWYWxPcGVyYXRpb24JCV9vcGVyYXRpb247Ci0JCi0JLyoqIAotCSAqIFRoZSBraW5kIG9mIGJ1aWxkLgotCSAqIAotCSAqICBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIKLQkgKi8KLQlwcml2YXRlIGludAkJCQkJX2J1aWxkS2luZDsKLQkKLQkvKiogVGhlIG1vbml0b3IgdG8gdXNlIHdoaWxlIHJ1bm5pbmcgdGhlIGJ1aWxkLiAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvcglfbW9uaXRvcjsKLQkKLQkvKiogVGhlIHR5cGVzIG9mIGNoYW5nZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4uICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CUludGVyZXN0ZWRGbGFncyA9IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgfCBJUmVzb3VyY2VEZWx0YS5FTkNPRElORyB8Ci0JCUlSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00gfCBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTzsKLQkKLQkvKioKLQkgKiBFYWNoIHZhbGlkYXRpb24gcnVuIGlzIGRvbmUgaW4gaXQncyBvd24gam9iLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkCi0JICogQHBhcmFtIGRlbHRhIHRoZSBkZWx0YSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gVGhpcyBtYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB3ZSBkbyBhIAotCSAqIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRLaW5kIHRoZSBraW5kIG9mIGJ1aWxkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNBVVRPX0JVSUxECi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI0NMRUFOX0JVSUxECi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI0ZVTExfQlVJTEQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjSU5DUkVNRU5UQUxfQlVJTEQKLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIHNvbWUgZ2xvYmFsIGNvbnRleHQgZm9yIHRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWxCdWlsZGVySm9iKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgYnVpbGRLaW5kLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uKXsKLQkJc3VwZXIoVmFsTWVzc2FnZXMuSm9iTmFtZSk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX2RlbHRhID0gZGVsdGE7Ci0JCV9idWlsZEtpbmQgPSBidWlsZEtpbmQ7Ci0JCV9vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCWlmIChmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpcmV0dXJuIHRydWU7Ci0JCWlmIChmYW1pbHkgPT0gVmFsaWRhdGlvbkJ1aWxkZXIuRkFNSUxZX1ZBTElEQVRJT05fSk9CKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQkKLQkJcmV0dXJuIHN1cGVyLmJlbG9uZ3NUbyhmYW1pbHkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjaW5nLmxvZygiVmFsQnVpbGRlckpvYiBTdGFydGluZyIpOyAvLyROT04tTkxTLTEkCi0JCV9tb25pdG9yID0gbW9uaXRvcjsKLQkJCi0JCXRyeSB7CQkKLQkJCWlmIChfZGVsdGEgPT0gbnVsbClmdWxsQnVpbGQoKTsKLQkJCWVsc2UgZGVsdGFCdWlsZCgpOwotCQkJCi0JCX0KLQkJY2F0Y2ggKFByb2plY3RVbmF2YWlsYWJsZUVycm9yIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVQcm9qZWN0VW5hdmFpbGFibGVFcnJvcihlKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IoZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJVHJhY2luZy5sb2coIlZhbEJ1aWxkZXJKb2IgRmluaXNoZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsdGFCdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJX2RlbHRhLmFjY2VwdCh0aGlzKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBmdWxsQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCV9wcm9qZWN0LmFjY2VwdCh0aGlzKTsKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIEludGVyZXN0ZWRGbGFncykgPT0gMClyZXR1cm4gdHJ1ZTsKLQkJCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCWlmICgoa2luZCAmIChJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSAhPSAwKXsKLQkJCVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLnZhbGlkYXRlKF9wcm9qZWN0LCByZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpLCBmYWxzZSwgdHJ1ZSwgX2J1aWxkS2luZCwgCi0JCQkJX29wZXJhdGlvbiwgX21vbml0b3IpOwotCQl9IGVsc2UgaWYgKChraW5kICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCl7Ci0JCQlJRGVwZW5kZW5jeUluZGV4IGluZGV4ID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0RGVwZW5kZW5jeUluZGV4KCk7Ci0JCQlpZiAoaW5kZXguaXNEZXBlbmRlZE9uKHJlc291cmNlKSl7Ci0JCQkJZm9yIChEZXBlbmRlbnRSZXNvdXJjZSBkciA6IGluZGV4LmdldChyZXNvdXJjZSkpewotCQkJCQlpZiAoZHIuZ2V0VmFsaWRhdG9yKCkuc2hvdWxkVmFsaWRhdGUoZHIuZ2V0UmVzb3VyY2UoKSwgZmFsc2UsIHRydWUpKXsKLQkJCQkJCVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLnZhbGlkYXRlKGRyLmdldFZhbGlkYXRvcigpLCBfb3BlcmF0aW9uLCBkci5nZXRSZXNvdXJjZSgpLCAKLQkJCQkJCQkJSVJlc291cmNlRGVsdGEuQ0hBTkdFRCwgX21vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJVmFsTWFuYWdlci5nZXREZWZhdWx0KCkudmFsaWRhdGUoX3Byb2plY3QsIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIGZhbHNlLCAKLQkJCQkJdHJ1ZSwgX2J1aWxkS2luZCwgX29wZXJhdGlvbiwgX21vbml0b3IpOwotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IgZSl7Ci0JCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSlUcmFjaW5nLmxvZyhlLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMTliZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi1wdWJsaWMgaW50ZXJmYWNlIFZhbENvbnN0YW50cyB7Ci0JLyoqIHByb2JsZW0gbWFya2VyIGZvciB2ZXJzaW9uIDIgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiAqLwotCVN0cmluZyBQcm9ibGVtTWFya2VyID0gIFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEICsiLnByb2JsZW1tYXJrZXIyIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTllNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuSVZhbGlkYXRvclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuUHJvamVjdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2VudHJhbCBwbGFjZSB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgdmFsaWRhdG9ycy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxNYW5hZ2VyIGltcGxlbWVudHMgSVZhbENoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsTWFuYWdlciBfbWU7Ci0KLQkvKiogQWxsIHRoZSBrbm93biwgZ2xvYmFsLCB2YWxpZGF0b3JzLiBJZiB0aGlzIGlzIG51bGwgaXQgbWVhbnMgdGhhdCB0aGUgdmFsaWRhdG9ycyBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JbXSBfdmFsaWRhdG9yczsKLQkJCi0JLyoqCi0JICogUHJvamVjdHMgbWF5IGJlIGFsbG93ZWQgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHNldHRpbmdzLiBJZiB0aGF0IGlzIHRoZSBjYXNlIHRoZW4gdGhvc2UKLQkgKiBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzIGFyZSBzYXZlZCBoZXJlLiBJZiB0aGUga2V5IGV4aXN0cywgYnV0IHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIHRoYXQKLQkgKiBtZWFucyB0aGF0IHRoZSBwcm9qZWN0IGhhcyBiZWVuIGNoZWNrZWQgYW5kIGl0IGRvZXMgbm90IGhhdmUgYW55IHNwZWNpZmljIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBQcm9qZWN0UHJlZmVyZW5jZXM+IF9wcm9qZWN0UHJlZmVyZW5jZXMgPSAKLQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPElQcm9qZWN0LCBQcm9qZWN0UHJlZmVyZW5jZXM+KDUwKSk7Ci0JCi0JcHJpdmF0ZSBHbG9iYWxQcmVmZXJlbmNlcyBfZ2xvYmFsUHJlZmVyZW5jZXM7Ci0JCQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFZhbE1hbmFnZXIgZ2V0RGVmYXVsdCgpewotCQlpZiAoX21lID09IG51bGwpX21lID0gbmV3IFZhbE1hbmFnZXIoKTsKLQkJcmV0dXJuIF9tZTsKLQl9Ci0JCi0JcHJpdmF0ZSBWYWxNYW5hZ2VyKCl7Ci0JCVZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0LmFkZExpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHJldHVybiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMoKXsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcnMyKG51bGwpOwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIEluZGl2aWR1YWwgcHJvamVjdHMgbWF5IG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlIHNldHRpbmdzLiBJZiB0aGlzIGlzIGFsbG93ZWQgYW5kIGlmCi0JICogdGhlIHByb2plY3QgaGFzIGl0J3Mgb3duIHNldHRpbmdzLCB0aGVuIHRob3NlIHZhbGlkYXRvcnMgYXJlIHJldHVybmVkIHZpYSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBhcHByb2FjaCBpcyB1c2VkLiBGb3IgdmVyc2lvbiAxIHZhbGlkYXRvcnMsIHRoZSB2YWxpZGF0b3IgaXMgb25seSByZXR1cm5lZCBpZiBpdAotCSAqIGlzIGRlZmluZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIHByb2plY3QgdHlwZS4gVGhpcyBpcyB0aGUgd2F5IHRoYXQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yawotCSAqIGRpZCBpdC4gRm9yIHZlcnNpb24gMiB2YWxpZGF0b3JzLCB0aGV5IGFyZSBhbGwgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwcm9qZWN0IHRoaXMgbWF5IGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhcmUgdXNlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZ2V0VmFsaWRhdG9yczIobnVsbCk7Ci0JCWlmICghZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKXJldHVybiBnZXRWYWxpZGF0b3JzMihudWxsKTsKLQkJCi0JCVByb2plY3RQcmVmZXJlbmNlcyBwcCA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJaWYgKHBwID09IG51bGwgfHwgIXBwLmdldE92ZXJyaWRlKCkpcmV0dXJuIGdldFZhbGlkYXRvcnMyKG51bGwpOwotCQlyZXR1cm4gcHAuZ2V0VmFsaWRhdG9ycygpOwkJCi0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkIHRoYXQgaXMgaW4gZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwZW5kZW5jeUlkIHZhbGlkYXRvciBkZXBlbmRlbmN5IGlkLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSB2YWxpZGF0b3IgaXMgbm90IGZvdW5kCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoU3RyaW5nIGRlcGVuZGVuY3lJZCwgSVByb2plY3QgcHJvamVjdCl7Ci0JCVZhbGlkYXRvcltdIHZhbHMgPSBnZXRWYWxpZGF0b3JzKHByb2plY3QpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQlpZiAodi5nZXREZXBlbmRlbmN5SWQoKS5lcXVhbHMoZGVwZW5kZW5jeUlkKSlyZXR1cm4gdjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBWYWxpZGF0aW9uRnJhbWV3b3JrI2dldFZhbGlkYXRvcihTdHJpbmcsIElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yV2l0aElkKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCl7Ci0JCVZhbGlkYXRvcltdIHZhbHMgPSBnZXRWYWxpZGF0b3JzKHByb2plY3QpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQlpZiAodi5nZXRJZCgpLmVxdWFscyhpZCkpcmV0dXJuIHY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgcHJvamVjdCBoYXMgZW5hYmxlZCBwcm9qZWN0IHByZWZlcmVuY2VzLiBUaGF0IGlzLCB0aGUgZ2xvYmFsIHNldHRpbmdzIGFsbG93Ci0JICogcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBzZXR0aW5ncywgYW5kIHRoZSBwcm9qZWN0IGhhcyBzZXR0aW5ncyB0aGF0IGFyZSBlbmFibGVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoaXMgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW5hYmxlZFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKXJldHVybiBmYWxzZTsKLQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlpZiAocHAgPT0gbnVsbCB8fCAhcHAuZ2V0T3ZlcnJpZGUoKSlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIGFueSBlbmFibGVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIGEgZmlsZSwgZm9sZGVyIG9yIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsIGlmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBtYW51YWwgdmFsaWRhdGlvbi4gCi0JICogSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIgb3V0IHZhbGlkYXRvcnMuCi0JICogICAKLQkgKiBAcGFyYW0gaXNCdWlsZCBpZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi4KLQkgKiBJZiBmYWxzZSB0aGVuIHRoZSBpc0J1aWxkVmFsaWRhdGlvbiBzZXR0aW5nIGlzbid0IHVzZWQgdG8gZmlsdGVyIG91dCB2YWxpZGF0b3JzLiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsaWRhdG9ycyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpcmVzb3VyY2U7Ci0JCQlyZXR1cm4gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KS5sZW5ndGggPiAwOwotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcil7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlc291cmNlOwotCQkJSGFzVmFsaWRhdG9yVmlzaXRvciB2ID0gbmV3IEhhc1ZhbGlkYXRvclZpc2l0b3IoaXNNYW51YWwsIGlzQnVpbGQpOwotCQkJcmV0dXJuIHYuaGFzVmFsaWRhdG9yKGZvbGRlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKFZhbGlkYXRvciB2YWwgOiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JzKHJlc291cmNlLmdldFByb2plY3QoKSkpewotCQkJCWlmICh2YWwuc2hvdWxkVmFsaWRhdGUocmVzb3VyY2UsIGlzTWFudWFsLCBpc0J1aWxkKSlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBwcm9qZWN0IGhhcyBkaXNhYmxlZCBhbGwgb2YgaXQncyB2YWxpZGF0b3JzLCBvciBvZiBwcm9qZWN0IG92ZXJyaWRlcyBhcmUgbm90Ci0JICogYWxsb3dlZCBpZiBnbG9iYWwgdmFsaWRhdGlvbiBoYXMgYmVlbiBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIGNvbnN1bHRlZCwgb3IgbnVsbCBpZiBvbmx5IHRoZSBnbG9iYWwgc2V0dGluZ3MgYXJlIHRvIGJlIAotCSAqIGNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSBnZXRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQlpZiAoIWdwLmdldE92ZXJyaWRlKCkgfHwgcHJvamVjdCA9PSBudWxsKXJldHVybiBncC5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCQkKLQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlpZiAocHAgPT0gbnVsbClyZXR1cm4gZ3AuZ2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oKTsKLQkJcmV0dXJuIHBwLmdldFN1c3BlbmQoKTsJCQotCX0KLQkJCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycyBhcyB0aGV5IHdlcmUgZGVmaW5lZCBieSB0aGUgZXh0ZW5zaW9uIHBvaW50cy4gVGhhdCBpcwotCSAqIGFuc3dlciB0aGUgdmFsaWRhdG9ycyBhcyBpZiB0aGUgdXNlciBoYXMgbmV2ZXIgYXBwbGllZCBhbnkgY3VzdG9taXphdGlvbnMuCi0JICogCi0JICogQHJldHVybiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JbXSBnZXREZWZhdWx0VmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yW10gdmFsID0gcmVzdG9yZURlZmF1bHRzMihudWxsKTsKLQkJCi0JCVRyZWVTZXQ8VmFsaWRhdG9yPiBzZXQgPSBuZXcgVHJlZVNldDxWYWxpZGF0b3I+KCk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiB2YWwpc2V0LmFkZCh2KTsKLQkJCi0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnYyA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKHJvb3QpOwotCQlnYy5yZXNldFRvRGVmYXVsdCgpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdjLmdldFZhbGlkYXRvcnMoKSl7Ci0JCQlsaXN0LmFkZChWYWxpZGF0b3IuY3JlYXRlKHZtZCwgZ2MsIG51bGwpKTsKLQkJfQkJCQkJCQkKLQkJCQkJCi0JCXNldC5hZGRBbGwobGlzdCk7Ci0JCXZhbCA9IG5ldyBWYWxpZGF0b3Jbc2V0LnNpemUoKV07Ci0JCXNldC50b0FycmF5KHZhbCk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JbXSBnZXREZWZhdWx0VmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRvcltdIHZhbCA9IHJlc3RvcmVEZWZhdWx0czIocHJvamVjdCk7Ci0JCQotCQlUcmVlU2V0PFZhbGlkYXRvcj4gc2V0ID0gbmV3IFRyZWVTZXQ8VmFsaWRhdG9yPigpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsKXNldC5hZGQodik7Ci0JCQotCQlMaXN0PFZhbGlkYXRvcj4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvcj4oKTsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGMgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCXBjLnJlc2V0VG9EZWZhdWx0KCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogcGMuZ2V0VmFsaWRhdG9ycygpKXsKLQkJCWxpc3QuYWRkKFZhbGlkYXRvci5jcmVhdGUodm1kLCBwYywgcHJvamVjdCkpOwotCQl9CQkJCQkJCQotCQkJCQkKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQkJdmFsID0gbmV3IFZhbGlkYXRvcltzZXQuc2l6ZSgpXTsKLQkJc2V0LnRvQXJyYXkodmFsKTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gdXNlIGZvciBnZXR0aW5nIHRoZSB2ZXJzaW9uIDEgdmFsaWRhdG9yIHNldHRpbmdzLiBUaGlzIGNhbgotCSAqIGJlIG51bGwgaW4gd2hpY2ggY2FzZSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFyZSB1c2VkLgotCSAqIAotCSAqIEByZXR1cm4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0b3JzLgotCSAqLwotCVZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMyKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0JCS8vIElmIEkgdXNlIGEgbG9jYWwgdmFyaWFibGUgSSBkb24ndCBuZWVkIHRvIHN5bmNocm9uaXplIHRoZSBtZXRob2QuCi0JCVZhbGlkYXRvcltdIHZhbGlkYXRvcnMgPSBfdmFsaWRhdG9yczsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCAmJiB2YWxpZGF0b3JzICE9IG51bGwpcmV0dXJuIHZhbGlkYXRvcnM7Ci0JCQkJCi0JCVZhbGlkYXRvcltdIHZhbCA9IGxvYWRFeHRlbnNpb25zKGZhbHNlLCBwcm9qZWN0KTsKLQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgdnBtID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOwotCQlpZiAoIXZwbS5sb2FkUHJlZmVyZW5jZXModmFsKSl7Ci0JCQl2YWwgPSByZXN0b3JlRGVmYXVsdHMyKHByb2plY3QpOwotCQkJc2F2ZVN0YXRlVGltZXN0YW1wKCk7CQkJCQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0U3RhdGVUaW1lU3RhbXAoKSAhPSBQbGF0Zm9ybS5nZXRTdGF0ZVN0YW1wKCkpCi0JCQkJdmFsID0gbWlncmF0ZVNldHRpbmdzKHZhbCwgcHJvamVjdCk7Ci0JCX0KLQkJCi0JCVRyZWVTZXQ8VmFsaWRhdG9yPiBzZXQgPSBuZXcgVHJlZVNldDxWYWxpZGF0b3I+KCk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiB2YWwpc2V0LmFkZCh2KTsKLQkJCi0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQl0cnkgewotCQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdmMuZ2V0VmFsaWRhdG9ycygpKXsKLQkJCQlsaXN0LmFkZChWYWxpZGF0b3IuY3JlYXRlKHZtZCwgdmMsIHByb2plY3QpKTsKLQkJCX0JCQkJCQkJCi0JCQkKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgKCFwcm9qZWN0LmV4aXN0cygpIHx8ICFwcm9qZWN0LmlzT3BlbigpKSkKLQkJCQl0aHJvdyBuZXcgUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IocHJvamVjdCk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQkJdmFsID0gbmV3IFZhbGlkYXRvcltzZXQuc2l6ZSgpXTsKLQkJc2V0LnRvQXJyYXkodmFsKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClfdmFsaWRhdG9ycyA9IHZhbDsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmVTdGF0ZVRpbWVzdGFtcCgpIHsKLQkJdHJ5IHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWxvbmcgdHMgPSBQbGF0Zm9ybS5nZXRTdGF0ZVN0YW1wKCk7Ci0JCQlnZXRHbG9iYWxQcmVmZXJlbmNlcygpLnNldFN0YXRlVGltZVN0YW1wKHRzKTsKLQkJCXByZWZzLnB1dExvbmcoUHJlZkNvbnN0YW50cy5zdGF0ZVRTLCB0cyk7Ci0JCQlwcmVmcy5mbHVzaCgpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGRlZmluaXRpb25zIG1heSBoYXZlIGNoYW5nZWQsIHNvIGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIHNldHRpbmdzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvcltdIG1pZ3JhdGVTZXR0aW5ncyhWYWxpZGF0b3JbXSB2YWxpZGF0b3JzLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVZhbGlkYXRvcltdIG5ld1ZhbHMgPSBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuZ2V0RGVmYXVsdCgpLm1pZ3JhdGUodmFsaWRhdG9ycywgcHJvamVjdCk7Ci0JCVZhbFByZWZNYW5hZ2VyR2xvYmFsIHZwbSA9IFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKTsKLQkJaWYgKG5ld1ZhbHMgIT0gbnVsbCl7Ci0JCQl2YWxpZGF0b3JzID0gbmV3VmFsczsKLQkJCXZwbS5zYXZlQXNQcmVmcyh2YWxpZGF0b3JzKTsKLQkJfQotCQlzYXZlU3RhdGVUaW1lc3RhbXAoKTsKLQkJcmV0dXJuIHZhbGlkYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgR2xvYmFsUHJlZmVyZW5jZXMgZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKXsKLQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSBfZ2xvYmFsUHJlZmVyZW5jZXM7Ci0JCWlmIChncCA9PSBudWxsKXsKLQkJCVZhbFByZWZNYW5hZ2VyR2xvYmFsIHZwbSA9IFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKTsKLQkJCWdwID0gbmV3IEdsb2JhbFByZWZlcmVuY2VzKCk7Ci0JCQl2cG0ubG9hZEdsb2JhbFByZWZlcmVuY2VzKGdwKTsKLQkJCV9nbG9iYWxQcmVmZXJlbmNlcyA9IGdwOwotCQl9Ci0JCXJldHVybiBncDsJCQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHByb2plY3Qgc3BlY2lmaWMgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhbnkgc3BlY2lmaWMgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFByb2plY3RQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCl7Ci0JCWlmIChfcHJvamVjdFByZWZlcmVuY2VzLmNvbnRhaW5zS2V5KHByb2plY3QpKXsKLQkJCXJldHVybiBfcHJvamVjdFByZWZlcmVuY2VzLmdldChwcm9qZWN0KTsKLQkJfQotCQkJCi0JCVZhbFByZWZNYW5hZ2VyUHJvamVjdCB2cG0gPSBuZXcgVmFsUHJlZk1hbmFnZXJQcm9qZWN0KHByb2plY3QpOwotCQlQcm9qZWN0UHJlZmVyZW5jZXMgcHAgPSBuZXcgUHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOyAKLQkJdnBtLmxvYWRQcm9qZWN0UHJlZmVyZW5jZXMocHApOwotCQlfcHJvamVjdFByZWZlcmVuY2VzLnB1dChwcm9qZWN0LCBwcCk7Ci0JCXJldHVybiBwcDsKLQl9Ci0JCi0JLyoqCi0JICogUmVzdG9yZSBhbGwgdGhlIHZhbGlkYXRpb24gZGVmYXVsdHMsIGFzIGRlZmluZWQgYnkgdGhlIGluZGl2aWR1YWwgdmFsaWRhdG9ycyB2aWEgdGhlCi0JICogdmFsaWRhdGlvbiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0vLwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdG9yZURlZmF1bHRzKCkgewotLy8JCWdldEdsb2JhbFByZWZlcmVuY2VzKCkucmVzZXRUb0RlZmF1bHQoKTsKLS8vCQlfdmFsaWRhdG9ycyA9IG51bGw7Ci0vLwkJZ2V0VmFsaWRhdG9ycyh0cnVlKTsKLS8vCX0KLQkKLQotCS8qKgotCSAqIFJlc3RvcmUgYWxsIHRoZSB2YWxpZGF0aW9uIGRlZmF1bHRzLCBhcyBkZWZpbmVkIGJ5IHRoZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFZhbGlkYXRvcltdIHJlc3RvcmVEZWZhdWx0czIoSVByb2plY3QgcHJvamVjdCkgewotCQlWYWxpZGF0b3JbXSB2YWwgPSBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuZ2V0RGVmYXVsdCgpLnByb2Nlc3ModHJ1ZSwgcHJvamVjdCk7Ci0vLwkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgdnBtID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOwotLy8JCXZwbS5zYXZlQXNQcmVmcyh2YWwpOwotCQlyZXR1cm4gdmFsOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSB2ZXJzaW9uIDIgdmFsaWRhdG9ycyBmcm9tIHRoZSBleHRlbnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSBkZWVwIGlmIHRydWUgbG9hZCBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIGVhY2ggdmFsaWRhdG9yLCBpZiBmYWxzZQotCSAqIGRvIGEgc2hhbGxvdyBsb2FkLCB3aGVyZSB0aGUgdmFsaWRhdG9yIGNsYXNzLCBpZCwgbmFtZSBhbmQgbWVzc2FnZSBjYXRlZ29yaWVzIGFyZSBsb2FkZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yW10gbG9hZEV4dGVuc2lvbnMoYm9vbGVhbiBkZWVwLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIGRvZXNuJ3QgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQKLQkJcmV0dXJuIFZhbGlkYXRvckV4dGVuc2lvblJlYWRlci5nZXREZWZhdWx0KCkucHJvY2VzcyhkZWVwLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyByZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIGlzIGEgbWFudWFsIHZhbGlkYXRpb24gYm90aCB0aGUgdmVyc2lvbiAxIGFuZCB2ZXJzaW9uIDIgdmFsaWRhdG9ycyBhcmUgcnVuLiBJZiBpdAotCSAqIGlzIGEgYnVpbGQgdmFsaWRhdGlvbiwgdGhlbiBvbmx5IHRoZSB2ZXJzaW9uIDIgdmFsaWRhdG9ycyBhcmUgcnVuLCBiZWNhdXNlIHRoZSBvbGQgZnJhbWV3b3JrIGhhbmRsZXMKLQkgKiB0aGUgcnVubmluZyBvZiB0aGUgb2xkIHZhbGlkYXRvcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcmVzb3VyY2UgZGVsdGEuIEl0IHdpbGwgYmUgb25lIG9mIHRoZSBJUmVzb3VyY2VEZWx0YSBjb25zdGFudHMsIGxpa2UKLQkgKiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIGZvciBleGFtcGxlLgotCSAqIAotCSAqIEBwYXJhbSBpc01hbnVhbCBpcyB0aGlzIGEgbWFudWFsIHZhbGlkYXRpb24gcmVxdWVzdD8KLQkgKiBAcGFyYW0gaXNCdWlsZCBpcyB0aGlzIGEgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbiByZXF1ZXN0PwotCSAqIEBwYXJhbSBidWlsZEtpbmQgdGhlIGtpbmQgb2YgYnVpbGQgdGhhdCB0cmlnZ2VyZWQgdGhpcyB2YWxpZGF0aW9uLiBTZWUgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciBmb3IgdmFsdWVzLgotCSAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdG8gdXNlIHRvIHJlcG9ydCBwcm9ncmVzcyAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBraW5kLCBib29sZWFuIGlzTWFudWFsLCAKLQkJYm9vbGVhbiBpc0J1aWxkLCBpbnQgYnVpbGRLaW5kLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCU1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpLmRlbGV0ZU1hcmtlcnMocmVzb3VyY2UsIG9wZXJhdGlvbi5nZXRTdGFydGVkKCkpOwotCQkKLQkJSVZhbGlkYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBJVmFsaWRhdG9yVmlzaXRvcigpewotCi0JCQlwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzTWFudWFsLAotCQkJCWJvb2xlYW4gaXNCdWlsZCwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJCQotCQkJCVZhbGlkYXRvci5WMSB2MSA9IHZhbGlkYXRvci5hc1YxVmFsaWRhdG9yKCk7Ci0JCQkJaWYgKGlzQnVpbGQgJiYgdjEgIT0gbnVsbClyZXR1cm47Ci0JCQkJCi0JCQkJdmFsaWRhdGUodmFsaWRhdG9yLCBvcGVyYXRpb24sIHJlc291cmNlLCBraW5kLCBtb25pdG9yKTsKLQkJCQlpZiAoKGtpbmQgJiAoSVJlc291cmNlRGVsdGEuQ09OVEVOVCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSAhPSAwKXsKLQkJCQkJSVJlc291cmNlW10gZGVwZW5kZW5jaWVzID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXREZXBlbmRlbmN5SW5kZXgoKS5nZXQodmFsaWRhdG9yLmdldERlcGVuZGVuY3lJZCgpLCByZXNvdXJjZSk7Ci0JCQkJCWlmIChkZXBlbmRlbmNpZXMgIT0gbnVsbCl7Ci0JCQkJCQlNYXJrZXJNYW5hZ2VyIG1tID0gTWFya2VyTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCQkJCQlTdHJpbmcgaWQgPSB2YWxpZGF0b3IuZ2V0SWQoKTsKLQkJCQkJCWZvciAoSVJlc291cmNlIHJlc291cmNlIDogZGVwZW5kZW5jaWVzKXsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltbS5jbGVhck1hcmtlcihyZXNvdXJjZSwgaWQpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkJLy9lYXQgdGhpcyBvbmUKLQkJCQkJCQl9Ci0JCQkJCQkJdmFsaWRhdGUodmFsaWRhdG9yLCBvcGVyYXRpb24sIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIG1vbml0b3IpOwotCQkJCQkJCW9wZXJhdGlvbi5hZGRWYWxpZGF0ZWQodmFsaWRhdG9yLmdldElkKCksIHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQotCQkJfQotCQkJCQkJCi0JCQkKLQkJfTsKLQkJYWNjZXB0KHZpc2l0b3IsIHByb2plY3QsIHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIGEgc2luZ2xlIHJlc291cmNlIHdpdGggYSBzaW5nbGUgdmFsaWRhdG9yLiBUaGlzIHdpbGwgY2FsbCB0aGUgdmFsaWRhdG9yIHdoZXRoZXIgdGhlIHZhbGlkYXRvcgotCSAqIGlzIGVuYWJsZWQgb3Igbm90LgotCSAqIDxwPgotCSAqIENhbGxlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBzaG91bGRWYWxpZGF0ZSB3YXMgdGVzdGVkIGJlZm9yZSBtYWtpbmcgdGhpcyBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0aGF0IHRoZSB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgaW4uCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZS4gU2VlIElSZXNvdXJjZURlbHRhLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlpZiAob3BlcmF0aW9uLmlzVmFsaWRhdGVkKHZhbGlkYXRvci5nZXRJZCgpLCByZXNvdXJjZSkpcmV0dXJuOwotCQlsb25nIHRpbWUgPSAwOwotCQlsb25nIGNwdVRpbWUgPSAtMTsKLQkJU3RyaW5nIG1zZzEgPSBOTFMuYmluZChWYWxNZXNzYWdlcy5Mb2dWYWxTdGFydCwgdmFsaWRhdG9yLmdldE5hbWUoKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJbW9uaXRvci5zdWJUYXNrKG1zZzEpOwotCQlJUGVyZm9ybWFuY2VNb25pdG9yIHBtID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0UGVyZm9ybWFuY2VNb25pdG9yKCk7Ci0JCWlmIChwbS5pc0NvbGxlY3RpbmcoKSl7Ci0JCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQljcHVUaW1lID0gTWlzYy5nZXRDUFVUaW1lKCk7Ci0JCX0KLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IHZhbGlkYXRvci52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJaWYgKHBtLmlzQ29sbGVjdGluZygpKXsKLQkJCWlmIChjcHVUaW1lICE9IC0xKXsKLQkJCQljcHVUaW1lID0gTWlzYy5nZXRDUFVUaW1lKCkgLSBjcHVUaW1lOwotCQkJfQotCQkJaW50IG51bSA9IDA7Ci0JCQlpZiAodnIgIT0gbnVsbCludW0gPSB2ci5nZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcygpOwotCQkJUGVyZm9ybWFuY2VDb3VudGVycyBwYyA9IG5ldyBQZXJmb3JtYW5jZUNvdW50ZXJzKHZhbGlkYXRvci5nZXRJZCgpLCAKLQkJCQl2YWxpZGF0b3IuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXROYW1lKCksCi0JCQkJbnVtLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS10aW1lLCBjcHVUaW1lKTsKLQkJCXBtLmFkZChwYyk7Ci0JCX0KLQkJaWYgKFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaXNEZWJ1Z2dpbmcoKSAmJiAhcG0uaXNDb2xsZWN0aW5nKCkpewotCQkJU3RyaW5nIG1zZyA9IHRpbWUgIT0gMCA/IAotCQkJCU5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1ZhbEVuZFRpbWUsCW5ldyBPYmplY3RbXXt2YWxpZGF0b3IuZ2V0TmFtZSgpLCAKLQkJCQkJdmFsaWRhdG9yLmdldElkKCksIHJlc291cmNlLCBNaXNjLmdldFRpbWVNUyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS10aW1lKX0pIDoKLQkJCQlOTFMuYmluZChWYWxNZXNzYWdlcy5Mb2dWYWxFbmQsIHZhbGlkYXRvci5nZXROYW1lKCksIHJlc291cmNlKTsKLQkJCVRyYWNpbmcubG9nKG1zZyk7Ci0JCX0KLQkJaWYgKHZyICE9IG51bGwpewotCQkJb3BlcmF0aW9uLmdldFJlc3VsdCgpLm1lcmdlUmVzdWx0cyh2cik7Ci0JCQlpZiAodnIuZ2V0U3VzcGVuZFZhbGlkYXRpb24oKSAhPSBudWxsKW9wZXJhdGlvbi5zdXNwZW5kVmFsaWRhdGlvbih2ci5nZXRTdXNwZW5kVmFsaWRhdGlvbigpLCB2YWxpZGF0b3IpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFjY2VwdCBhIHZpc2l0b3IgZm9yIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGlzTWFudWFsIGlzIHRoaXMgYSBtYW51YWwgdmFsaWRhdGlvbj8KLQkgKiBAcGFyYW0gaXNCdWlsZCBpcyB0aGlzIGEgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uPwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChJVmFsaWRhdG9yVmlzaXRvciB2aXNpdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQsIAotCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQkKLQkJaWYgKGlzRGlzYWJsZWQocHJvamVjdCkpcmV0dXJuOwotCQkKLQkJYm9vbGVhbiBoYXNQcm9jZXNzZWRQcm9qZWN0ID0gb3BlcmF0aW9uLmhhc1Byb2Nlc3NlZFByb2plY3QocHJvamVjdCk7Ci0JCWZvciAoVmFsaWRhdG9yIHZhbCA6IGdldFZhbGlkYXRvcnMocHJvamVjdCkpewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKXJldHVybjsKLQkJCWlmICghb3BlcmF0aW9uLnNob3VsZEV4Y2x1ZGUodmFsLCBwcm9qZWN0LCBoYXNQcm9jZXNzZWRQcm9qZWN0LCBpc01hbnVhbCwgaXNCdWlsZCkpewotCQkJCXRyeSB7Ci0JCQkJCXZpc2l0b3IudmlzaXQodmFsLCBwcm9qZWN0LCBpc01hbnVhbCwgaXNCdWlsZCwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXB0IGEgdmlzaXRvciBmb3IgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCByZXNvdXJjZSwgYW5kIHZhbGlkYXRpb24gbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHQoSVZhbGlkYXRvclZpc2l0b3IgdmlzaXRvciwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGlzTWFudWFsLCAKLQkJCWJvb2xlYW4gaXNCdWlsZCwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJCi0JCWlmIChpc0Rpc2FibGVkKHByb2plY3QpKXJldHVybjsKLQkJCi0JCWJvb2xlYW4gaGFzUHJvY2Vzc2VkUHJvamVjdCA9IG9wZXJhdGlvbi5oYXNQcm9jZXNzZWRQcm9qZWN0KHByb2plY3QpOwotCQlmb3IgKFZhbGlkYXRvciB2YWwgOiBnZXRWYWxpZGF0b3JzKHByb2plY3QpKXsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSlyZXR1cm47Ci0JCQlpZiAob3BlcmF0aW9uLnNob3VsZEV4Y2x1ZGUodmFsLCBwcm9qZWN0LCBoYXNQcm9jZXNzZWRQcm9qZWN0LCBpc01hbnVhbCwgaXNCdWlsZCkpY29udGludWU7Ci0JCQlpZiAodmFsLnNob3VsZFZhbGlkYXRlKHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCkpewotCQkJCXRyeSB7Ci0JCQkJCXZpc2l0b3IudmlzaXQodmFsLCBwcm9qZWN0LCBpc01hbnVhbCwgaXNCdWlsZCwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogTGV0IGVhY2ggb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBrbm93IHRoYXQgYSBjbGVhbiBoYXMgYmVlbiByZXF1ZXN0ZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyBjbGVhbmVkLCBvciBudWxsIGlmIHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIGJlaW5nIGNsZWFuZWQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQl2b2lkIGNsZWFuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJVmFsaWRhdG9yVmlzaXRvciB2aXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNNYW51YWwsCi0JCQkJYm9vbGVhbiBpc0J1aWxkLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl2YWxpZGF0b3IuY2xlYW4ocHJvamVjdCwgbW9uaXRvcik7CQkJCQkKLQkJCX0KLQkJCQotCQl9OwotCQlhY2NlcHQodmlzaXRvciwgcHJvamVjdCwgZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24sIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBMZXQgZWFjaCBvZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGtub3cgdGhhdCBhIGNsZWFuIGhhcyBiZWVuIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIGNsZWFuZWQsIG9yIG51bGwgaWYgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgYmVpbmcgY2xlYW5lZC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCUlWYWxpZGF0b3JWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVZhbGlkYXRvclZpc2l0b3IoKXsKLQotCQkJcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc01hbnVhbCwKLQkJCQlib29sZWFuIGlzQnVpbGQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXZhbGlkYXRvci5jbGVhbihwcm9qZWN0LCBtb25pdG9yKTsJCQkJCQotCQkJfQotCQkJCi0JCX07Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldERlcGVuZGVuY3lJbmRleCgpLmNsZWFyKHByb2plY3QpOwotCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFZhbE9wZXJhdGlvbigpOwotCQlhY2NlcHQodmlzaXRvciwgcHJvamVjdCwgZmFsc2UsIHRydWUsIG9wZXJhdGlvbiwgbW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSGFzVmFsaWRhdG9yVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IgewotCQkKLQkJcHJpdmF0ZSBib29sZWFuIAlfaGFzVmFsaWRhdG9yOwotCQlwcml2YXRlIGJvb2xlYW4JCV9pc01hbnVhbDsKLQkJcHJpdmF0ZSBib29sZWFuCQlfaXNCdWlsZDsKLQkJCi0JCXB1YmxpYyBIYXNWYWxpZGF0b3JWaXNpdG9yKGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCl7Ci0JCQlfaXNNYW51YWwgPSBpc01hbnVhbDsKLQkJCV9pc0J1aWxkID0gaXNCdWlsZDsJCQkKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzVmFsaWRhdG9yKElGb2xkZXIgZm9sZGVyKXsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLmFjY2VwdCh0aGlzKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIF9oYXNWYWxpZGF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpcmV0dXJuIHRydWU7Ci0JCQlpZiAoaGFzVmFsaWRhdG9ycyhyZXNvdXJjZSwgX2lzTWFudWFsLCBfaXNCdWlsZCkpewotCQkJCV9oYXNWYWxpZGF0b3IgPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdG9yc0ZvclByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClfdmFsaWRhdG9ycyA9IG51bGw7CQotCQllbHNlIF9wcm9qZWN0UHJlZmVyZW5jZXMucmVtb3ZlKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZWJjYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVmFsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJDb25maWc7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckZpbHRlclJ1bGU7CSAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyR3JvdXBOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckRlcGVuZGVuY3lWZXJzaW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckdyb3VwTm9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckdyb3VwSW52YWxpZFR5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyUGF0dGVybkF0dHJpYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJUeXBlUmVxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyclR5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmJmRXhjU3ludGF4Tm9WYWxDbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYmZFeGNTeW50YXhOb1ZhbFJ1bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYmZFeGNTeW50YXhOb1ZhbE51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR3JvdXBJbmNsdWRlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdyb3VwRXhjbHVkZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvYk5hbWVNb25pdG9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvYkluZGV4U2F2ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dWYWxTdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dWYWxFbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nVmFsRW5kVGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dWYWxTdW1tYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ1ZhbFN1bW1hcnkyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ1Nlc3Npb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlncmF0aW9uSm9iTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlUHJvamVjdE5hdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlRmlsZUV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVDb250ZW50VHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlRmFjZXQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVFeGFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZU5vdEV4YWN0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVFeHRXaXRoQ2FzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRXh0V2l0aG91dENhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXZFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXZXYXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNldklnbm9yZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVVbmRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lTmFubzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lTWljcm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZVNlYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lTWluOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVJbmNsdWRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVFeGNsdWRlOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbE1lc3NhZ2VzLmNsYXNzKTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1MDdkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiBvcGVyYXRpb24sIGkuZS4gdGhlIHJ1bm5pbmcgb2YgYSBzZXQgb2YgdmFsaWRhdG9ycyBpbiByZXNwb25zZSB0byBzb21lIGNoYW5nZS4gCi0gKiBJdCBtYXkgYmUgYSBsYXJnZSBvcGVyYXRpb24sIGFzIHdvdWxkIGhhcHBlbiBvbiBhIGNsZWFuIGJ1aWxkLCBvciBpdCBtYXkgYmUgdGhlIHZhbGlkYXRpb24gb2YganVzdCBhIHNpbmdsZQotICogcmVzb3VyY2UuCi0gKiA8cD4KLSAqIFRoZSBvcGVyYXRpb24gY2FuLCBidXQgZG9lc24ndCBuZWVkIHRvLCBzcGFuIG11bHRpcGxlIHByb2plY3RzLgotICogPC9wPgotICogPHA+Ci0gKiBPbmNlIHRoZSBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLCB0aGlzIG9iamVjdCBnb2VzIGF3YXkuCi0gKiA8L3A+ICAgICAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxPcGVyYXRpb24gewotCQotCXByaXZhdGUgVmFsaWRhdGlvblN0YXRlIAlfc3RhdGUgPSBuZXcgVmFsaWRhdGlvblN0YXRlKCk7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uUmVzdWx0CV9yZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBTZXQ8VmFsaWRhdG9yPj4gX2V4Y2x1ZGVDYWNoZSA9IAotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8SVByb2plY3QsIFNldDxWYWxpZGF0b3I+Pig0MCkpOwotCQotCS8qKiBUaGUgdGltZSB0aGF0IHRoZSBvcGVyYXRpb24gc3RhcnRlZC4gKi8KLQlwcml2YXRlIGxvbmcJX3N0YXJ0ZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkKLQkvKiogCi0JICogQXJlIHdlIGluIGEgbXVsdGkgcHJvamVjdCB2YWxpZGF0aW9uPyBUaGlzIGNhbiBiZSB0cmlnZ2VyZWQgYnkgZWl0aGVyIGNsZWFuIGFsbCBvciAKLQkgKiBpZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvZmYsIGEgYnVpbGQgYWxsLiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4JX211bHRpUHJvamVjdDsKLQkKLQkvKiogCi0JICogSG9sZHMgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2YgcnVubmluZyBvdGhlciB2YWxpZGF0aW9ucy4KLQkgKiBUaGUga2V5IGlzIHRoZSB2YWxpZGF0b3IgaWQgYW5kIHRoZSB2YWx1ZSBpcyBhIFNldCBvZiBJUmVzb3VyY2VzLgotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElSZXNvdXJjZT4+IAlfdmFsaWRhdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVJlc291cmNlPj4oMjApOwotCQotCXB1YmxpYyBWYWxPcGVyYXRpb24oKXsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25TdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIF9zdGF0ZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U3RhdGUoVmFsaWRhdGlvblN0YXRlIHN0YXRlKSB7Ci0JCV9zdGF0ZSA9IHN0YXRlOwotCX0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBfcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJX3Jlc3VsdCA9IHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHRzIGdldFJlc3VsdHMoKXsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0cyhfcmVzdWx0KTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtZW1iZXIgdGhhdCB0aGlzIHJlc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFzIGEgc2lkZS1lZmZlY3QuCi0JICogIAotCSAqIEBwYXJhbSBpZCBpZCBvZiB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRlZChTdHJpbmcgaWQsIElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCVNldDxJUmVzb3VyY2U+IHNldCA9IF92YWxpZGF0ZWQuZ2V0KGlkKTsKLQkJaWYgKHNldCA9PSBudWxsKXsKLQkJCXNldCA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oMjApOwotCQkJX3ZhbGlkYXRlZC5wdXQoaWQsIHNldCk7Ci0JCX0KLQkJc2V0LmFkZChyZXNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBpZiB0aGlzIHJlc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygc29tZSBvdGhlciB2YWxpZGF0aW9uIGJ5IHRoZQotCSAqIGdpdmVuIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlZChTdHJpbmcgaWQsIElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCVNldCBzZXQgPSAoU2V0KV92YWxpZGF0ZWQuZ2V0KGlkKTsKLQkJaWYgKHNldCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBzZXQuY29udGFpbnMocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEhhdmUgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgdGhpcyB2YWxpZGF0b3IgZG9lc24ndCBuZWVkIHRvIHJ1biBvbiB0aGlzIHByb2plY3Q/IFRvIGltcHJvdmUgCi0JICogcGVyZm9ybWFuY2Ugd2UgcmVtZW1iZXIgKGZvciB0aGUgbGlmZSBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uKSB3aGV0aGVyIG9yIG5vdCBhIHByb2plY3QgaGFzCi0JICogYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgYSBwYXJ0aWN1bGFyIHZhbGlkYXRvciBkb2Vzbid0IGFwcGx5IHRvIHRoZSBwcm9qZWN0LiAKLQkgKiAgIAotCSAqIEBwYXJhbSB2YWwKLQkgKiBAcGFyYW0gcHJvamVjdCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB3ZSByZXR1cm4gZmFsc2UKLQkgKiBAcGFyYW0gaXNNYW51YWwKLQkgKiBAcGFyYW0gaXNCdWlsZAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIHZhbGlkYXRvciBzaG91bGQgbm90IHJ1biBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRXhjbHVkZShWYWxpZGF0b3IgdmFsLCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGhhdmVQcm9jZXNzZWRQcm9qZWN0LCBib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCVNldDxWYWxpZGF0b3I+IHNldCA9IGdldEV4Y2x1ZGVTZXQocHJvamVjdCk7Ci0JCQotCQlpZiAoIWhhdmVQcm9jZXNzZWRQcm9qZWN0KXsKLQkJCWlmICh2YWwuc2hvdWxkVmFsaWRhdGVQcm9qZWN0KHByb2plY3QsIGlzTWFudWFsLCBpc0J1aWxkKSlyZXR1cm4gZmFsc2U7Ci0JCQlzZXQuYWRkKHZhbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIHNldC5jb250YWlucyh2YWwpOwotCX0KLQkKLQlwcml2YXRlIFNldDxWYWxpZGF0b3I+IGdldEV4Y2x1ZGVTZXQoSVByb2plY3QgcHJvamVjdCl7Ci0JCVNldDxWYWxpZGF0b3I+IHNldCA9IF9leGNsdWRlQ2FjaGUuZ2V0KHByb2plY3QpOwotCQlpZiAoc2V0ID09IG51bGwpewotCQkJc2V0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yPig1KTsKLQkJCV9leGNsdWRlQ2FjaGUucHV0KHByb2plY3QsIHNldCk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKioKLQkgKiBIYXZlIHdlIHByaW1lZCB0aGUgZXhjbHVkZSBwcm9qZWN0IGNhY2hlIGZvciB0aGlzIHByb2plY3QgeWV0PwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvY2Vzc2VkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIHRydWU7Ci0JCVNldDxWYWxpZGF0b3I+IHNldCA9IF9leGNsdWRlQ2FjaGUuZ2V0KHByb2plY3QpOwotCQlpZiAoc2V0ID09IG51bGwpewotCQkJc2V0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yPig1KTsKLQkJCV9leGNsdWRlQ2FjaGUucHV0KHByb2plY3QsIHNldCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0Jdm9pZCBzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuOwotCQlnZXRFeGNsdWRlU2V0KHByb2plY3QpLmFkZCh2YWxpZGF0b3IpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBfc3RhcnRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpUHJvamVjdCgpIHsKLQkJcmV0dXJuIF9tdWx0aVByb2plY3Q7Ci0JfQotCi0JLyoqIAotCSAqIEFyZSB3ZSBpbiBhIG11bHRpIHByb2plY3QgdmFsaWRhdGlvbj8gVGhhdCBpcywgY291bGQgd2UgYmUgdmFsaWRhdGluZyBzZXZlcmFsCi0JICogcHJvamVjdHMgYXQgdGhlIHNhbWUgdGltZT8gVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGVpdGhlciBjbGVhbiBhbGwgb3IgCi0JICogaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb2ZmLCBhIGJ1aWxkIGFsbC4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlQcm9qZWN0KGJvb2xlYW4gbXVsdGlQcm9qZWN0KSB7Ci0JCV9tdWx0aVByb2plY3QgPSBtdWx0aVByb2plY3Q7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE9wZXJhdGlvbkpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsT3BlcmF0aW9uSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NzNiZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsT3BlcmF0aW9uSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuSVZhbGlkYXRvclZpc2l0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIHRvIHNpZ25hbCB3aGVuIHRoZSBlbnRpcmUgdmFsaWRhdGlvbiBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBhIGpvYgotICogYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGlzbid0IGRvbmUsIHVudGlsIGFsbCB0aGUgdmFsaWRhdGlvbiBqb2JzIGhhdmUgZmluaXNoZWQuICAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxPcGVyYXRpb25Kb2IgZXh0ZW5kcyBKb2IgewotCQotCXByaXZhdGUgVmFsT3BlcmF0aW9uIF9vcGVyYXRpb247Ci0JCi0JcHVibGljIFZhbE9wZXJhdGlvbkpvYihWYWxPcGVyYXRpb24gb3BlcmF0aW9uKXsKLQkJc3VwZXIoVmFsTWVzc2FnZXMuSm9iTmFtZU1vbml0b3IpOwotCQlfb3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5qb2luKG1vbml0b3IpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKLQkJCW9rID0gZmFsc2U7Ci0JCX0KLQkJZmluaXNoZWQobW9uaXRvcik7Ci0JCXJldHVybiBvayA/IFN0YXR1cy5PS19TVEFUVVMgOiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmlzaGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCUlWYWxpZGF0b3JWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVZhbGlkYXRvclZpc2l0b3IoKXsKLQotCQkJcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc01hbnVhbCwgCi0JCQkJCWJvb2xlYW4gaXNCdWlsZCwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCi0JCQkJdmFsaWRhdG9yLnZhbGlkYXRpb25GaW5pc2hpbmcocHJvamVjdCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwkJCQkJCi0JCQl9Ci0JCQkKLQkJfTsKLQkJVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuYWNjZXB0KHZpc2l0b3IsIG51bGwsIGZhbHNlLCB0cnVlLCBfb3BlcmF0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE9wZXJhdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE9wZXJhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMDJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxPcGVyYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5JVmFsaWRhdG9yVmlzaXRvcjsKLQotLyoqCi0gKiBLZWVwIHRyYWNrIG9mIGEgdmFsaWRhdGlvbiBvcGVyYXRpb24gd2hlbiBpdCBpcyB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIGJ1aWxkLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbE9wZXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCi0JLyoKLQkgKiBJIHRyaWVkIHZhcmlvdXMgdGVzdHMgdG8gc2VlIHdoYXQgc29ydCBvZiBjaGFuZ2UgZXZlbnRzIEkgd291bGQgZ2V0LiBUaGlzIGlzIHdoYXQgSSAKLQkgKiBvYnNlcnZlZCB1c2luZyBFY2xpcHNlIDMuNDoKLQkgKiAKLQkgKiBBdXRvIEJ1aWxkIE9uCi0JICogCi0JICogICBDbGVhbiBBbGwKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGNsZWFuLCBwcmUKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGNsZWFuIHBvc3QKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGF1dG8sIHBvc3QKLQkgKiAgICAgCi0JICogICBDbGVhbiBTb21lCi0JICogICAgIC0gcHJvamVjdDEsIGNsZWFuLCBwcmUKLQkgKiAgICAgLSBwcm9qZWN0MSwgY2xlYW4sIHBvc3QKLQkgKiAgICAgLSBwcm9qZWN0MiwgY2xlYW4sIHByZQotCSAqICAgICAtIHByb2plY3QyLCBjbGVhbiwgcG9zdAotCSAqICAgICAtIHdvcmtzcGFjZSwgQXV0bywgcG9zdAotCSAqICAgICAKLQkgKiAgIEJ1aWxkIFdvcmtpbmcgU2V0IC0gTkEKLQkgKiAgIEJ1aWxkIFByb2plY3QgLSBOQQotCSAqICAgQnVpbGQgQWxsIC0gTkEKLQkgKiAgIAotCSAqICAgQ3RybC1TCi0JICogICAgIC0gd29ya3NwYWNlLCBhdXRvLCBwcmUKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGF1dG8sIHBvc3QKLQkgKiAgICAgCi0JICogQXV0byBidWlsZCBPZmYKLQkgKiAKLQkgKiAgIENsZWFuIEFsbAotCSAqICAgICAtIHNhbWUgYXMgKGF1dG8gYnVpbGQgb24pLCBidXQgbm8gd29ya3NwYWNlLGF1dG8scG9zdCBldmVudAotCSAqICAgICAKLQkgKiAgIENsZWFuIFNvbWUgCi0JICogICAgIC0gc2FtZSBhcyAoYXV0byBidWlsZCBvbiksIGJ1dCBubyB3b3Jrc3BhY2UsYXV0byxwb3N0IGV2ZW50Ci0JICogICAgIAotCSAqICAgQnVpbGQgV29ya2luZyBTZXQKLQkgKiAgICAgLSBwcm9qZWN0MSwgaW5jcmVtZW50YWwsIHByZQotCSAqICAgICAtIHByb2plY3QxLCBpbmNyZW1lbnRhbCwgcG9zdAotCSAqICAgICAtIHByb2plY3QyLCBpbmNyZW1lbnRhbCwgcHJlCi0JICogICAgIC0gcHJvamVjdDIsIGluY3JlbWVudGFsLCBwb3N0Ci0JICogICAgIAotCSAqICAgQnVpbGQgUHJvamVjdAotCSAqICAgICAtIHNhbWUgYXMgYWJvdmUKLQkgKiAgICAgCi0JICogICBCdWlsZCBBbGwKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGluY3JlbWVudGFsLCBwcmUKLQkgKiAgICAgLSB3b3Jrc3BhY2UsIGluY3JlbWVudGFsLCBwb3N0Ci0JICogICAgIAotCSAqICAgQ3RybC1TIC0gTkEKLQkgKiAgIAotCSAqIEZvciB0aGUgY2FzZSB3aGVyZSBhIHN1YnNldCBvZiB0aGUgcHJvamVjdHMgYXJlIGJ1aWx0IHRoZXJlIGlzIG5vIHdheSB0byBndWVzcyB3aGV0aGVyIHRoZXkgYXJlIHBhcnQgb2YgdGhlCi0JICogc2FtZSBvcGVyYXRpb24gb3Igbm90LiBFY2xpcHNlIHRocmVhdHMgdGhlbSBhcyBpbmRlcGVuZGVudCBldmVudHMsIGFuZCBzbyB3aWxsIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKiAKLQkgKiBTbyBmb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdHdvIHByb2plY3RzIChwMSBhbmQgcDIpIGFuZCBidWlsdCB0aGVtLCB0aGUgZnJhbWV3b3JrIHdvdWxkIGNhbGwgdGhlCi0JICogdmFsaWRhdG9ycyBsaWtlIHRoaXM6Ci0JICogCi0JICogdmFsaWRhdGlvbiBzdGFydGluZyBvbiBudWxsCi0JICogdmFsaWRhdGlvbiBzdGFydGluZyBvbiBQMQotCSAqICAtIGluZGl2aWR1YWwgZXZlbnRzIHBlciByZXNvdXJjZQotCSAqIHZhbGlkYXRpb24gZmluaXNoZWQgb24gUDEKLQkgKiB2YWxpZGF0aW9uIGZpbmlzaGVkIG9uIG51bGwgCi0JICogCi0JICogdmFsaWRhdGlvbiBzdGFydGluZyBvbiBudWxsCi0JICogdmFsaWRhdGlvbiBzdGFydGluZyBvbiBQMgotCSAqICAtIGluZGl2aWR1YWwgZXZlbnRzIHBlciByZXNvdXJjZQotCSAqIHZhbGlkYXRpb24gZmluaXNoZWQgb24gUDIKLQkgKiB2YWxpZGF0aW9uIGZpbmlzaGVkIG9uIG51bGwgCi0JICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsT3BlcmF0aW9uTWFuYWdlciBfbWU7Ci0KLQkvKioKLQkgKiBUaGlzIG9wZXJhdGlvbiBpcyBpbiBhZmZlY3QgZm9yIGEgYnVpbGQgY3ljbGUuIEF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGl0IGlzIHJlaW5pdGlhbGl6ZWQuCi0JICovCi0JcHJpdmF0ZSBWYWxPcGVyYXRpb24gCV9vcGVyYXRpb247Ci0JCi0JCi0JLyoqCi0JICogSW4gdGhlIHZlcnkgY29tbW9uIGNhc2Ugb2YgZG9pbmcgYSBjbGVhbiBhbGwgKHdpdGggYXV0byBidWlsZCB0dXJuZWQgb24pLCBFY2xpcHNlIHNpZ25hbHMgdHdvIAotCSAqIHdvcmtzcGFjZSwgYXV0byBidWlsZCwgcG9zdCBldmVudHMuIE9uZSBhdCB0aGUgZW5kIG9mIHRoZSBjbGVhbiBhbmQgb25lIGF0IHRoZSBlbmQgb2YgdGhlCi0JICogcmVhbCBidWlsZC4KLQkgKiAKLQkgKiBJZiB3ZSBhcmUgZG9pbmcgYSBjbGVhbiBhbGwsIHdpdGggYXV0byBidWlsZCB0dXJuZWQgb24sIHdlIGluY3JlbWVudCB0aGlzIGJ5IG9uZSwgCi0JICogc28gdGhhdCB3ZSBrbm93IHRvIHRocm93IGF3YXkgdGhlIGZpcnN0IHdvcmtzcGFjZSwgYXV0byBidWlsZCwgcG9zdCBldmVudC4KLQkgKi8KLQlwcml2YXRlIGludCBfZGlzY2FyZEF1dG9Qb3N0OwotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgVmFsT3BlcmF0aW9uTWFuYWdlciBnZXREZWZhdWx0KCl7Ci0JCWlmIChfbWUgPT0gbnVsbClfbWUgPSBuZXcgVmFsT3BlcmF0aW9uTWFuYWdlcigpOwotCQlyZXR1cm4gX21lOwotCX0KLQkKLQlwcml2YXRlIFZhbE9wZXJhdGlvbk1hbmFnZXIoKXt9Ci0JCQkJCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCB0eXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotCQlpbnQga2luZCA9IGV2ZW50LmdldEJ1aWxkS2luZCgpOwotCQkKLQkJaWYgKGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCAmJiAoKHR5cGUgJiBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpICE9IDApKXsKLQkJCXByb2Nlc3NDbGVhbihldmVudCk7Ci0JCX0KLQkJCi0JCWlmIChpc0J1aWxkU3RhcnRpbmcoZXZlbnQpKXsKLQkJCV9vcGVyYXRpb24gPSBuZXcgVmFsT3BlcmF0aW9uKCk7Ci0JCQlfb3BlcmF0aW9uLnNldE11bHRpUHJvamVjdCh0cnVlKTsKLQkJCUlWYWxpZGF0b3JWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVZhbGlkYXRvclZpc2l0b3IoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNNYW51YWwsIAotCQkJCQkJYm9vbGVhbiBpc0J1aWxkLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCi0JCQkJCXZhbGlkYXRvci52YWxpZGF0aW9uU3RhcnRpbmcocHJvamVjdCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwkJCQkJCi0JCQkJfQkJCQkKLQkJCX07Ci0JCQlWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5hY2NlcHQodmlzaXRvciwgbnVsbCwgZmFsc2UsIHRydWUsIF9vcGVyYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCi0JCX0KLQkJCi0JCWlmIChpc0J1aWxkRmluaXNoZWQoZXZlbnQpKXsKLQkJCVZhbE9wZXJhdGlvbkpvYiBmaW5pc2hlZCA9IG5ldyBWYWxPcGVyYXRpb25Kb2IoZ2V0T3BlcmF0aW9uKCkpOwotCQkJZmluaXNoZWQuc2NoZWR1bGUoKTsKLQkJCV9vcGVyYXRpb24gPSBudWxsOwotCQl9Ci0JCQotCQkKLQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpewotCQkJU3RyaW5nIGtpbmROYW1lID0gbnVsbDsKLQkJCWlmIChraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRClraW5kTmFtZSA9ICJBdXRvIjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoa2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEKWtpbmROYW1lID0gIkNsZWFuIjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoa2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQpa2luZE5hbWUgPSAiRnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRClraW5kTmFtZSA9ICJJbmNyZW1lbnRhbCI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2Uga2luZE5hbWUgPSBTdHJpbmcudmFsdWVPZihraW5kKTsKLQkJCQotCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCQkKLQkJCVN0cmluZyBzb3VyY2VOYW1lID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJc291cmNlTmFtZSA9IHJlcy5nZXROYW1lKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCQlzb3VyY2VOYW1lID0gIldvcmtzcGFjZSI7CQkJIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWIuYXBwZW5kKCJWYWxPcGVyYXRpb25NYW5hZ2VyOiBBIHJlc291cmNlIGhhcyBjaGFuZ2VkLCBzb3VyY2U9Iitzb3VyY2VOYW1lKyIsIGtpbmQ9IitraW5kTmFtZSsiLCBldmVudCB0eXBlPSgiK3R5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCkgIT0gMCliLmFwcGVuZCgiLCBwb3N0IGJ1aWxkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCkgIT0gMCl7Ci0JCQkJYi5hcHBlbmQoIiwgcHJlIGJ1aWxkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWIuYXBwZW5kKCcpJyk7Ci0JCQlJUmVzb3VyY2VEZWx0YSByZCA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAocmQgPT0gbnVsbCliLmFwcGVuZCgiLCB0aGVyZSB3YXMgbm8gcmVzb3VyY2UgZGVsdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlUcmFjaW5nLmxvZyhiKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHdlIGFyZSBzdGFydGluZyBhIG5ldyBidWlsZCBjeWNsZS4KLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnVpbGRTdGFydGluZyhJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKLQkJaW50IGtpbmQgPSBldmVudC5nZXRCdWlsZEtpbmQoKTsKLQkJYm9vbGVhbiBpc1dvcmtzcGFjZSA9IGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZTsKLQkJYm9vbGVhbiBwcmVCdWlsZCA9ICh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEKSAhPSAwOwotCQkKLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpKXsKLQkJCWlmIChpc1dvcmtzcGFjZSAmJiBwcmVCdWlsZCAmJiBraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpewotCQkJCV9kaXNjYXJkQXV0b1Bvc3QgPSAxOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlpZiAoaXNXb3Jrc3BhY2UgJiYgcHJlQnVpbGQgJiYga2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQpcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaXNXb3Jrc3BhY2UgJiYgcHJlQnVpbGQgJiYga2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBidWlsZCBjeWNsZS4gVGhpcyB3aWxsIGdpdmUgY2FsbGVycyB0aGUgYWJpbGl0eSB0bwotCSAqIGNsZWFyIGNhY2hlcyBldGMuCi0JICogIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4gcmV0dXJuIHRydWUgaWYgd2UgYXJlIGp1c3QgZmluaXNoaW5nIGEgYnVpbGQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnVpbGRGaW5pc2hlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkKLQkJaWYgKF9vcGVyYXRpb24gPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKLQkJaW50IGtpbmQgPSBldmVudC5nZXRCdWlsZEtpbmQoKTsKLQkJYm9vbGVhbiBpc1dvcmtzcGFjZSA9IGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZTsKLQkJYm9vbGVhbiBwb3N0QnVpbGQgPSAodHlwZSAmIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpICE9IDA7Ci0KLQkJCi0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSl7Ci0JCQlpZiAoaXNXb3Jrc3BhY2UgJiYgcG9zdEJ1aWxkICYmIGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxEKXsKLQkJCQlpZiAoX2Rpc2NhcmRBdXRvUG9zdCA9PSAxKV9kaXNjYXJkQXV0b1Bvc3QgPSAwOwotCQkJCWVsc2UgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaXNXb3Jrc3BhY2UgJiYgcG9zdEJ1aWxkICYmIGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRClyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NsZWFuKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KXsKLQkJLy8gT3JpZ2luYWxseSBJIHdhcyB1c2luZyB0aGlzIHRvIG1vbml0b3IgSVByb2plY3QgYnVpbGQgcmVxdWVzdHMgYXMgd2VsbCwgYnV0IHRoYXQgaXMgbm90IG5vdCBuZWVkZWQKLQkJLy8gc2luY2UgdGhlc2Ugd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLmNsZWFuKCkgbWV0aG9kLgotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlPYmplY3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0JCQlWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5jbGVhbihudWxsLCBnZXRPcGVyYXRpb24oKSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gb3BlcmF0aW9uLiBJZiB3ZSBhcmUgbm90IGluIGEgbXVsdGlwbGUgcHJvamVjdCB2YWxpZGF0aW9uCi0JICogd2Ugd2lsbCByZXR1cm4gYSBuZXcgb25lLiAKLQkgKi8KLQlwdWJsaWMgVmFsT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJLyoKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnQgb3BlcmF0aW9uLCB3ZSBjcmVhdGUgYSBuZXcgb25lLiBUaGUgb25seSB0aW1lIHdlIHNhdmUKLQkJICogdGhlIG9wZXJhdGlvbiBpcyB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgd2UgYXJlIGluIGEgbXVsdGkgcHJvamVjdCB2YWxpZGF0aW9uLgotCQkgKi8KLQkJaWYgKF9vcGVyYXRpb24gPT0gbnVsbClyZXR1cm4gbmV3IFZhbE9wZXJhdGlvbigpOwotCQlyZXR1cm4gX29wZXJhdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyR2xvYmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxQcmVmTWFuYWdlckdsb2JhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzUzYjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyR2xvYmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gbWFuYWdlIHRoZSBnbG9iYWwgcGVyc2lzdGVkIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxQcmVmTWFuYWdlckdsb2JhbCB7Ci0JCi0JLyoqIFZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBwcm9wZXJ0aWVzLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGZyYW1ld29ya1ZlcnNpb24gPSAyOwotCQotCXByaXZhdGUgTGlzdDxJVmFsQ2hhbmdlZExpc3RlbmVyPiBfbGlzdGVuZXJzID0gbmV3IExpbmtlZExpc3Q8SVZhbENoYW5nZWRMaXN0ZW5lcj4oKTsKLQlwcml2YXRlIHN0YXRpYyBWYWxQcmVmTWFuYWdlckdsb2JhbCBfbWU7Ci0JCi0JcHJpdmF0ZSBWYWxQcmVmTWFuYWdlckdsb2JhbCgpe30KLQkKLQlwdWJsaWMgc3RhdGljIFZhbFByZWZNYW5hZ2VyR2xvYmFsIGdldERlZmF1bHQoKXsKLQkJaWYgKF9tZSA9PSBudWxsKV9tZSA9IG5ldyBWYWxQcmVmTWFuYWdlckdsb2JhbCgpOwotCQlyZXR1cm4gX21lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJVmFsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKXsKLQkJaWYgKF9saXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKXJldHVybjsKLQkJX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJVmFsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKXsKLQkJX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlzdGVuZXJzKCl7Ci0JCWZvciAoSVZhbENoYW5nZWRMaXN0ZW5lciBjbCA6IF9saXN0ZW5lcnMpY2wudmFsaWRhdG9yc0ZvclByb2plY3RDaGFuZ2VkKG51bGwpOyAKLQl9Ci0JCQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIHZhbGlkYXRvciBmaWx0ZXJzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogIAotCSAqIEBwYXJhbSB2YWwKLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZXJlIGFyZSBubyBwcmVmZXJlbmNlcywgdGhhdCBtZWFucyB0aGF0IHRoZSB1c2VyIGhhcyBuZXZlciBjaGFuZ2VkIGFueQotCSAqIG9mIHRoZSBkZWZhdWx0IHNldHRpbmdzLiBBbHNvIGFuc3dlciBmYWxzZSBpZiB0aGVyZSB3YXMgc29tZSBzb3J0IG9mIGVycm9yLCB3aGljaCBlc3NlbnRpYWxseQotCSAqIG1lYW5zIHRoYXQgdGhlIHByZWZlcmVuY2VzIGFyZW4ndCB2YWxpZCBmb3Igd2hhdGV2ZXIgcmVhc29uLiAgIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRQcmVmZXJlbmNlcyhWYWxpZGF0b3JbXSB2YWwpIHsKLQkKLQkJdHJ5IHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJaWYgKCFwcmVmLm5vZGVFeGlzdHMoUHJlZkNvbnN0YW50cy5maWx0ZXJzKSlyZXR1cm4gZmFsc2U7Ci0JCQotCQkJUHJlZmVyZW5jZXMgZmlsdGVycyA9IHByZWYubm9kZShQcmVmQ29uc3RhbnRzLmZpbHRlcnMpOwotCQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbCl7Ci0JCQkJU3RyaW5nIGlkID0gdi5nZXRJZCgpOwotCQkJCWlmIChmaWx0ZXJzLm5vZGVFeGlzdHMoaWQpKXsKLQkJCQkJUHJlZmVyZW5jZXMgdnAgPSBmaWx0ZXJzLm5vZGUoaWQpOwotCQkJCQlsb2FkUHJlZmVyZW5jZXModiwgdnApOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgb25seSB2YWxpZCB3YXkgdG8gZ2V0IHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgaXMgdGhyb3VnaCB0aGUgVmFsTWFuYWdlci4KLQkgKiAKLQkgKiBAc2VlIFZhbE1hbmFnZXIjZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRHbG9iYWxQcmVmZXJlbmNlcyhHbG9iYWxQcmVmZXJlbmNlcyBncCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWYgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZ3Auc2V0U2F2ZUF1dG9tYXRpY2FsbHkocHJlZi5nZXRCb29sZWFuKFByZWZDb25zdGFudHMuc2F2ZUF1dG8sIEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRBdXRvU2F2ZSkpOwotCQlncC5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5zdXNwZW5kLCBHbG9iYWxQcmVmZXJlbmNlcy5EZWZhdWx0U3VzcGVuZCkpOwotCQlncC5zZXRDb25maXJtRGlhbG9nKHByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmNvbmZpcm1EaWFsb2csIEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRDb25maXJtKSk7Ci0JCWdwLnNldE92ZXJyaWRlKHByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLm92ZXJyaWRlLCBHbG9iYWxQcmVmZXJlbmNlcy5EZWZhdWx0T3ZlcnJpZGUpKTsKLQkJZ3Auc2V0U3RhdGVUaW1lU3RhbXAocHJlZi5nZXRMb25nKFByZWZDb25zdGFudHMuc3RhdGVUUywgMCkpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBwcmVmZXJlbmNlcyBmb3IgYSB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIHYgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIGJ1aWx0IHVwCi0JICogQHBhcmFtIHAgdGhlIG5vZGUgaW4gdGhlIHByZWZlcmVuY2UgdHJlZSBmb3IgdGhlIHZhbGlkYXRvciwgCi0JICogCWUuZy4gL2luc3RhbmNlL3ZhbGlkYXRvci1mcmFtZXdvcmstaWQvZmlsdGVycy92YWxpZGF0b3ItaWQKLQkgKiAKLQkgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyB2b2lkIGxvYWRQcmVmZXJlbmNlcyhWYWxpZGF0b3IgdiwgUHJlZmVyZW5jZXMgcCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXYuc2V0QnVpbGRWYWxpZGF0aW9uKHAuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmJ1aWxkLCB0cnVlKSk7Ci0JCXYuc2V0TWFudWFsVmFsaWRhdGlvbihwLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5tYW51YWwsIHRydWUpKTsKLQkJdi5zZXRWZXJzaW9uKHAuZ2V0SW50KFByZWZDb25zdGFudHMudmVyc2lvbiwgMSkpOwotCQl2LnNldERlbGVnYXRpbmdJZChwLmdldChQcmVmQ29uc3RhbnRzLmRlbGVnYXRlLCBudWxsKSk7Ci0JCQotCQlWYWxpZGF0b3IuVjIgdjIgPSB2LmFzVjJWYWxpZGF0b3IoKTsKLQkJaWYgKHYyID09IG51bGwpcmV0dXJuOwotCQlpZiAoIXAubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLmdyb3VwcykpcmV0dXJuOwotCQkKLQkJUHJlZmVyZW5jZXMgZ3JvdXBOb2RlID0gcC5ub2RlKFByZWZDb25zdGFudHMuZ3JvdXBzKTsKLQkJZm9yIChTdHJpbmcgZ3JvdXBOYW1lIDogZ3JvdXBOb2RlLmNoaWxkcmVuTmFtZXMoKSl7Ci0JCQlQcmVmZXJlbmNlcyBncm91cCA9IGdyb3VwTm9kZS5ub2RlKGdyb3VwTmFtZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IGdyb3VwLmdldChQcmVmQ29uc3RhbnRzLnR5cGUsIG51bGwpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFZhbE1lc3NhZ2VzLkVyckdyb3VwTm9UeXBlKTsKLQkJCUZpbHRlckdyb3VwIGZnID0gRmlsdGVyR3JvdXAuY3JlYXRlKHR5cGUpOwotCQkJaWYgKGZnID09IG51bGwpdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihOTFMuYmluZChWYWxNZXNzYWdlcy5FcnJHcm91cEludmFsaWRUeXBlLCB0eXBlKSk7Ci0JCQl2Mi5hZGQoZmcpOwotCQkJCi0JCQlpZiAoZ3JvdXAubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLnJ1bGVzKSl7Ci0JCQkJUHJlZmVyZW5jZXMgcnVsZU5vZGUgPSBncm91cC5ub2RlKFByZWZDb25zdGFudHMucnVsZXMpOwotCQkJCWZvciAoU3RyaW5nIHJ1bGVOYW1lIDogcnVsZU5vZGUuY2hpbGRyZW5OYW1lcygpKXsKLQkJCQkJUHJlZmVyZW5jZXMgcnVsZSA9IHJ1bGVOb2RlLm5vZGUocnVsZU5hbWUpOwotCQkJCQlGaWx0ZXJSdWxlIGZyID0gRmlsdGVyUnVsZS5jcmVhdGUocnVsZS5nZXQoUHJlZkNvbnN0YW50cy5ydWxlVHlwZSwgbnVsbCkpOwotCQkJCQlpZiAoZnIgIT0gbnVsbCl7Ci0JCQkJCQlmci5sb2FkKHJ1bGUpOwotCQkJCQkJZmcuYWRkKGZyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKiAKLQkgKiBTYXZlIHRoZSB2YWxpZGF0b3IgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgaW5jbHVkaW5nIGl0J3MgZmlsdGVyIHNldHRpbmdzLgotCSAqIEBwYXJhbSB2Ci0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKFZhbGlkYXRvciB2KXsKLQkJdHJ5IHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCVByZWZlcmVuY2VzIGZpbHRlcnMgPSBwcmVmcy5ub2RlKFByZWZDb25zdGFudHMuZmlsdGVycyk7Ci0JCQlQcmVmZXJlbmNlcyB2cCA9IGZpbHRlcnMubm9kZSh2LmdldElkKCkpOwotCQkJdnAucmVtb3ZlTm9kZSgpOwotCQkJc2F2ZSh2LCBwcmVmcyk7Ci0JCQlwcmVmcy5mbHVzaCgpOwotCi0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTYXZlIHRoZSB2YWxpZGF0b3IgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4gCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvciB0aGUgdmFsaWRhdG9yIGJlaW5nIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSByb290IHRoZSB0b3Agb2YgdGhlIHByZWZlcmVuY2UgdHJlZSBmb3IgdmFsaWRhdG9ycywgaS5lLiAKLQkgKiAvaW5zdGFuY2UvdmFsaWRhdG9yLWZyYW1ld29yay1pZC8gZm9yIHdvcmtzcGFjZSB2YWxpZGF0b3JzIGFuZCAvIGZvciBwcm9qZWN0IHZhbGlkYXRvcnMuCi0JICovCi0Jc3RhdGljIHZvaWQgc2F2ZShWYWxpZGF0b3IgdmFsaWRhdG9yLCBQcmVmZXJlbmNlcyByb290KSB7Ci0JCVByZWZlcmVuY2VzIGZpbHRlcnMgPSByb290Lm5vZGUoUHJlZkNvbnN0YW50cy5maWx0ZXJzKTsKLQkJUHJlZmVyZW5jZXMgdnAgPSBmaWx0ZXJzLm5vZGUodmFsaWRhdG9yLmdldElkKCkpOwotCQl2cC5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuYnVpbGQsIHZhbGlkYXRvci5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLQkJdnAucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLm1hbnVhbCwgdmFsaWRhdG9yLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJdnAucHV0SW50KFByZWZDb25zdGFudHMudmVyc2lvbiwgdmFsaWRhdG9yLmdldFZlcnNpb24oKSk7Ci0JCWlmICh2YWxpZGF0b3IuZ2V0RGVsZWdhdGluZ0lkKCkgIT0gbnVsbCl2cC5wdXQoUHJlZkNvbnN0YW50cy5kZWxlZ2F0ZSwgdmFsaWRhdG9yLmdldERlbGVnYXRpbmdJZCgpKTsKLQkJCi0JCUNvbGxlY3Rpb248TWVzc2FnZVNldmVyaXR5U2V0dGluZz4gbXNncyA9IHZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKS52YWx1ZXMoKTsKLQkJaWYgKG1zZ3Muc2l6ZSgpID4gMCl7Ci0JCQlQcmVmZXJlbmNlcyBtc2dzTm9kZSA9IGZpbHRlcnMucGFyZW50KCkubm9kZShQcmVmQ29uc3RhbnRzLm1zZ3MpOwotCQkJUHJlZmVyZW5jZXMgdmFsTm9kZSA9IG1zZ3NOb2RlLm5vZGUodmFsaWRhdG9yLmdldElkKCkpOwotCQkJZm9yIChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zIDogbXNncyl7Ci0JCQkJdmFsTm9kZS5wdXRJbnQobXMuZ2V0SWQoKSwgbXMuZ2V0Q3VycmVudCgpLm9yZGluYWwoKSk7Ci0JCQl9CQkJCi0JCX0KLQotCQlWYWxpZGF0b3IuVjIgdjIgPSB2YWxpZGF0b3IuYXNWMlZhbGlkYXRvcigpOwotCQlpZiAodjIgPT0gbnVsbClyZXR1cm47Ci0JCQotCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IHYyLmdldEdyb3VwcygpOwotCQlQcmVmZXJlbmNlcyBncm91cCA9IHZwLm5vZGUoUHJlZkNvbnN0YW50cy5ncm91cHMpOwotCQlmb3IgKGludCBpPTA7IGk8Z3JvdXBzLmxlbmd0aDsgaSsrKXsKLQkJCVByZWZlcmVuY2VzIGdpZD0gZ3JvdXAubm9kZShTdHJpbmcudmFsdWVPZihpKSk7Ci0JCQlnaWQucHV0KFByZWZDb25zdGFudHMudHlwZSwgZ3JvdXBzW2ldLmdldFR5cGUoKSk7Ci0JCQlGaWx0ZXJSdWxlW10gcnVsZXMgPSBncm91cHNbaV0uZ2V0UnVsZXMoKTsKLQkJCVByZWZlcmVuY2VzIHIgPSBnaWQubm9kZShQcmVmQ29uc3RhbnRzLnJ1bGVzKTsKLQkJCWZvciAoaW50IGo9MDsgajxydWxlcy5sZW5ndGg7IGorKyl7Ci0JCQkJUHJlZmVyZW5jZXMgcmlkPSByLm5vZGUoU3RyaW5nLnZhbHVlT2YoaikpOwotCQkJCXJ1bGVzW2pdLnNhdmUocmlkKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlQXNQcmVmcyhWYWxpZGF0b3JbXSB2YWwpIHsKLQkJdHJ5IHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJUHJlZmVyZW5jZXMgZmlsdGVycyA9IHByZWYubm9kZShQcmVmQ29uc3RhbnRzLmZpbHRlcnMpOwotCQkJZmlsdGVycy5yZW1vdmVOb2RlKCk7Ci0JCQkKLQkJCWZpbHRlcnMgPSBwcmVmLm5vZGUoUHJlZkNvbnN0YW50cy5maWx0ZXJzKTsKLQkJCWZvciAoVmFsaWRhdG9yIHYgOiB2YWwpc2F2ZSh2LCBwcmVmKTsKLQkJCXByZWYuZmx1c2goKTsKLQkJCXVwZGF0ZUxpc3RlbmVycygpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFNhdmUgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhbmQgdGhlIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmVQcmVmZXJlbmNlcyhHbG9iYWxQcmVmZXJlbmNlcyBncCwgVmFsaWRhdG9yW10gdmFsaWRhdG9ycyl7Ci0JCXRyeSB7Ci0JCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlwcmVmcy5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuc2F2ZUF1dG8sIGdwLmdldFNhdmVBdXRvbWF0aWNhbGx5KCkpOwotCQkJcHJlZnMucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLnN1c3BlbmQsIGdwLmdldERpc2FibGVBbGxWYWxpZGF0aW9uKCkpOwotCQkJcHJlZnMucHV0TG9uZyhQcmVmQ29uc3RhbnRzLnN0YXRlVFMsIGdwLmdldFN0YXRlVGltZVN0YW1wKCkpOwotCQkJcHJlZnMucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmNvbmZpcm1EaWFsb2csIGdwLmdldENvbmZpcm1EaWFsb2coKSk7Ci0JCQlwcmVmcy5wdXRCb29sZWFuKFByZWZDb25zdGFudHMub3ZlcnJpZGUsIGdwLmdldE92ZXJyaWRlKCkpOwotCQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbGlkYXRvcnMpc2F2ZSh2KTsKLQkJCXByZWZzLmZsdXNoKCk7Ci0JCQl1cGRhdGVMaXN0ZW5lcnMoKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW55IG1lc3NhZ2UgcHJlZmVyZW5jZXMgaW4gdGhlIG1hcC4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZE1lc3NhZ2VzKFZhbGlkYXRvciB2YWxpZGF0b3IsIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IHNldHRpbmdzKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQl0cnkgewotCQkJbG9hZE1lc3NhZ2VTZXR0aW5ncyh2YWxpZGF0b3IsIHNldHRpbmdzLCBwcmVmKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCQotCXN0YXRpYyB2b2lkIGxvYWRNZXNzYWdlU2V0dGluZ3MoVmFsaWRhdG9yIHZhbCwgTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gc2V0dGluZ3MsIFByZWZlcmVuY2VzIHByZWZzKSAKLQkJdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcHJlZnMubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLm1zZ3MpKXJldHVybjsKLQkJCi0JCVByZWZlcmVuY2VzIG1zZ3MgPSBwcmVmcy5ub2RlKFByZWZDb25zdGFudHMubXNncyk7IAotCQlpZiAoIW1zZ3Mubm9kZUV4aXN0cyh2YWwuZ2V0SWQoKSkpcmV0dXJuOwotCQkKLQkJUHJlZmVyZW5jZXMgdmFsUHJlZnMgPSBtc2dzLm5vZGUodmFsLmdldElkKCkpOwotCQlmb3IgKFN0cmluZyBrZXkgOiB2YWxQcmVmcy5rZXlzKCkpewotCQkJaW50IHNldiA9IHZhbFByZWZzLmdldEludChrZXksIC0xKTsKLQkJCWlmIChzZXYgIT0gLTEpewotCQkJCU1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgPSBzZXR0aW5ncy5nZXQoa2V5KTsKLQkJCQlpZiAobXMgIT0gbnVsbCltcy5zZXRDdXJyZW50KE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkudmFsdWVzKClbc2V2XSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIFNhdmUgd2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgb3Igbm90LiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIHByZWZzIHVwIHRvIHRoZSBmaWx0ZXIgcGFydCBvZiB0aGUgcHJlZmVyZW5jZSB0cmVlCi0JICovCi0vLwlwcml2YXRlIHZvaWQgc2F2ZVNoYWxsb3dQcmVmZXJlbmNlKFZhbGlkYXRvciB2YWxpZGF0b3IsIFByZWZlcmVuY2VzIHByZWZzKSB7Ci0vLwkJaWYgKHZhbGlkYXRvci5hc1YyVmFsaWRhdG9yKCkgPT0gbnVsbClyZXR1cm47Ci0vLwkJUHJlZmVyZW5jZXMgdmFsID0gcHJlZnMubm9kZSh2YWxpZGF0b3IuZ2V0SWQoKSk7Ci0vLwkJdmFsLnB1dEJvb2xlYW4oUHJlZkNvbnN0YW50cy5idWlsZCwgdmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotLy8JCXZhbC5wdXRCb29sZWFuKFByZWZDb25zdGFudHMubWFudWFsLCB2YWxpZGF0b3IuaXNNYW51YWxWYWxpZGF0aW9uKCkpOwotLy8JCXZhbC5wdXRJbnQoUHJlZkNvbnN0YW50cy52ZXJzaW9uLCB2YWxpZGF0b3IuZ2V0VmVyc2lvbigpKTsKLS8vCX0KLQkKLS8vCS8qKgotLy8JICogTG9hZCB0aGUgY3VzdG9taXplZCBtZXNzYWdlIHNldHRpbmdzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0vLwkgKiBAcGFyYW0gbWVzc2FnZVNldHRpbmdzCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIGxvYWRNZXNzYWdlU2V0dGluZ3MoVmFsaWRhdG9yIHZhbCwgTWVzc2FnZUNhdGVnb3J5W10gbWVzc2FnZVNldHRpbmdzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJbG9hZE1lc3NhZ2VTZXR0aW5ncyh2YWwsIG1lc3NhZ2VTZXR0aW5ncywgVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotLy8JCX0KLS8vCQljYXRjaCAoRXhjZXB0aW9uIGUpewotLy8JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyUHJvamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJlZk1hbmFnZXJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNGQ3ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJlZk1hbmFnZXJQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5Qcm9qZWN0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBBIGNsYXNzIHRoYXQga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcHJvamVjdCBsZXZlbCBwZXJzaXN0ZWQgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxQcmVmTWFuYWdlclByb2plY3QgewotCQotCXByaXZhdGUgSVByb2plY3QJX3Byb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJVmFsQ2hhbmdlZExpc3RlbmVyPiBfbGlzdGVuZXJzID0gbmV3IExpbmtlZExpc3Q8SVZhbENoYW5nZWRMaXN0ZW5lcj4oKTsKLQotCQotCXB1YmxpYyBWYWxQcmVmTWFuYWdlclByb2plY3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCWFzc2VydCBwcm9qZWN0ICE9IG51bGw7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZExpc3RlbmVyKElWYWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpewotCQlpZiAoX2xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpcmV0dXJuOwotCQlfbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJVmFsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKXsKLQkJX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RlbmVycyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJZm9yIChJVmFsQ2hhbmdlZExpc3RlbmVyIGNsIDogX2xpc3RlbmVycyljbC52YWxpZGF0b3JzRm9yUHJvamVjdENoYW5nZWQocHJvamVjdCk7IAotCX0KLQotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIG9yIG5vdCB0aGlzIHByb2plY3QgaGFzIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0JICogICAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXQgaGFzIHNldHRpbmdzLiBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgc2V0dGluZ3MgYXJlIGVuYWJsZWQsIG9ubHkgdGhhdCBpdAotCSAqIGhhcyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAc2VlIFZhbE1hbmFnZXIjaGFzRW5hYmxlZFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncygpewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWYgPSBnZXRQcmVmZXJlbmNlcygpOwotCQkKLQkJaWYgKHByZWYgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCWludCB2ZXJzaW9uID0gcHJlZi5nZXRJbnQoUHJlZkNvbnN0YW50cy5mcmFtZXdvcmtWZXJzaW9uLCAwKTsKLQkJaWYgKHZlcnNpb24gPT0gMClyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3QgcHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYW55IHNwZWNpZmljIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRQcm9qZWN0UHJlZmVyZW5jZXMoUHJvamVjdFByZWZlcmVuY2VzIHBwKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlpZiAocHJlZiA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJaW50IHZlcnNpb24gPSBwcmVmLmdldEludChQcmVmQ29uc3RhbnRzLmZyYW1ld29ya1ZlcnNpb24sIDApOwotCQlpZiAodmVyc2lvbiA9PSAwKXJldHVybiBmYWxzZTsKLQotCQlwcC5zZXRPdmVycmlkZShwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5vdmVycmlkZSwgUHJvamVjdFByZWZlcmVuY2VzLkRlZmF1bHRPdmVycmlkZSkpOwotCQlwcC5zZXRTdXNwZW5kKHByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLnN1c3BlbmQsIFByb2plY3RQcmVmZXJlbmNlcy5EZWZhdWx0U3VzcGVuZCkpOwotCQkKLQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMyKF9wcm9qZWN0KTsKLQkJbG9hZFByZWZlcmVuY2VzKHZhbHMsIHByZWYpOwotCQlwcC5zZXRWYWxpZGF0b3JzKHZhbHMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSB2YWxpZGF0b3IgZmlsdGVycyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqICAKLQkgKiBAcGFyYW0gdmFsCi0JICogCi0JICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSBhcmUgbm8gcHJlZmVyZW5jZXMsIHRoYXQgbWVhbnMgdGhhdCB0aGUgdXNlciBoYXMgbmV2ZXIgY2hhbmdlZCBhbnkKLQkgKiBvZiB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gQWxzbyBhbnN3ZXIgZmFsc2UgaWYgdGhlcmUgd2FzIHNvbWUgc29ydCBvZiBlcnJvciwgd2hpY2ggZXNzZW50aWFsbHkKLQkgKiBtZWFucyB0aGF0IHRoZSBwcmVmZXJlbmNlcyBhcmVuJ3QgdmFsaWQgZm9yIHdoYXRldmVyIHJlYXNvbi4gICAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbG9hZFByZWZlcmVuY2VzKFZhbGlkYXRvcltdIHZhbCwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmKSB7Ci0JCi0JCXRyeSB7Ci0JCQlpZiAoIXByZWYubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLmZpbHRlcnMpKXJldHVybiBmYWxzZTsKLQkJCi0JCQlQcmVmZXJlbmNlcyBmaWx0ZXJzID0gcHJlZi5ub2RlKFByZWZDb25zdGFudHMuZmlsdGVycyk7Ci0JCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsKXsKLQkJCQlTdHJpbmcgaWQgPSB2LmdldElkKCk7Ci0JCQkJaWYgKGZpbHRlcnMubm9kZUV4aXN0cyhpZCkpewotCQkJCQlQcmVmZXJlbmNlcyB2cCA9IGZpbHRlcnMubm9kZShpZCk7Ci0JCQkJCVZhbFByZWZNYW5hZ2VyR2xvYmFsLmxvYWRQcmVmZXJlbmNlcyh2LCB2cCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcml2YXRlIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCUlTY29wZUNvbnRleHQgcHJvamVjdENvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKF9wcm9qZWN0KTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmID0gcHJvamVjdENvbnRleHQuZ2V0Tm9kZShWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCXJldHVybiBwcmVmOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcyhQcm9qZWN0UHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzLCBWYWxpZGF0b3JbXSB2YWxpZGF0b3JzKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCXByZWYucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLnN1c3BlbmQsIHByb2plY3RQcmVmZXJlbmNlcy5nZXRTdXNwZW5kKCkpOwotCQlwcmVmLnB1dEJvb2xlYW4oUHJlZkNvbnN0YW50cy5vdmVycmlkZSwgcHJvamVjdFByZWZlcmVuY2VzLmdldE92ZXJyaWRlKCkpOwotCQlwcmVmLnB1dEludChQcmVmQ29uc3RhbnRzLmZyYW1ld29ya1ZlcnNpb24sIFZhbFByZWZNYW5hZ2VyR2xvYmFsLmZyYW1ld29ya1ZlcnNpb24pOwotCQlQcmVmZXJlbmNlcyBmaWx0ZXJzID0gcHJlZi5ub2RlKFByZWZDb25zdGFudHMuZmlsdGVycyk7Ci0JCXRyeSB7Ci0JCQlmaWx0ZXJzLnJlbW92ZU5vZGUoKTsKLQkJCWZpbHRlcnMgPSBwcmVmLm5vZGUoUHJlZkNvbnN0YW50cy5maWx0ZXJzKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbGlkYXRvcnMpVmFsUHJlZk1hbmFnZXJHbG9iYWwuc2F2ZSh2LCBwcmVmKTsKLQkJdHJ5IHsKLQkJCXByZWYuZmx1c2goKTsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHBjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpCi0JCQkJLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3RQcmVmZXJlbmNlcy5nZXRQcm9qZWN0KCkpOwotCQkJcGMuc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpKTsKLQkJCXBjLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKHZhbGlkYXRvcnMpKTsKLQkJCXBjLnBhc3NpdmF0ZSgpOwotCQkJcGMuc3RvcmUoKTsKLQkJCXVwZGF0ZUxpc3RlbmVycyhfcHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBidWlsZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoVmFsaWRhdG9yW10gdmFsaWRhdG9ycykgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHNldCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPig1MCk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiB2YWxpZGF0b3JzKXsKLQkJCWlmICh2LmlzQnVpbGRWYWxpZGF0aW9uKCkpewotCQkJCVZhbGlkYXRvci5WMSB2MSA9IHYuYXNWMVZhbGlkYXRvcigpOwotCQkJCWlmICh2MSAhPSBudWxsKXNldC5hZGQodjEuZ2V0Vm1kKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIFYxIHZhbGlkYXRvcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgbWFudWFsIHZhbGlkYXRpb24uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhWYWxpZGF0b3JbXSB2YWxpZGF0b3JzKSB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gc2V0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KDUwKTsKLQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbGlkYXRvcnMpewotCQkJaWYgKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkpewotCQkJCVZhbGlkYXRvci5WMSB2MSA9IHYuYXNWMVZhbGlkYXRvcigpOwotCQkJCWlmICh2MSAhPSBudWxsKXNldC5hZGQodjEuZ2V0Vm1kKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWRNZXNzYWdlcyhWYWxpZGF0b3IgdmFsaWRhdG9yLCBNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBzZXR0aW5ncykgewotCQl0cnkgewotCQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwubG9hZE1lc3NhZ2VTZXR0aW5ncyh2YWxpZGF0b3IsIHNldHRpbmdzLCBnZXRQcmVmZXJlbmNlcygpKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJ1bm5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M1M2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuSVZhbGlkYXRvclZpc2l0b3I7Ci0KLS8qKgotICogUnVuIHRoZSB2YWxpZGF0b3JzIG9uIGEgc2VsZWN0ZWQgc2V0IG9mIHJlc291cmNlcy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUnVubmVyIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQkKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+CQlfcHJvamVjdHM7Ci0JcHJpdmF0ZQlib29sZWFuCQkJX2lzTWFudWFsOyAKLQlwcml2YXRlIGJvb2xlYW4JCQlfaXNCdWlsZDsKLQlwcml2YXRlIFZhbE9wZXJhdGlvbglfdmFsT3BlcmF0aW9uOwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzZWxlY3RlZCBwcm9qZWN0cyBhbmQvb3IgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0cwotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkIHByb2plY3RzLiBUaGUga2V5IGlzIGFuIElQcm9qZWN0IGFuZCB0aGUgdmFsdWUgaXMKLQkgKiAgICAgICAgICAgIHRoZSBTZXQgb2YgSVJlc291cmNlcyB0aGF0IHdlcmUgc2VsZWN0ZWQuIE9mdGVuIHRoaXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgZXZlcnkgcmVzb3VyY2UgaW4gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsCi0JICogICAgICAgICAgICBJcyB0aGlzIGEgbWFudWFsIHZhbGlkYXRpb24/Ci0JICogCi0JICogQHBhcmFtIGlzQnVpbGQKLQkgKiAgICAgICAgICAgIElzIHRoaXMgYSBidWlsZCBiYXNlZCB2YWxpZGF0aW9uPwotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxPcGVyYXRpb24gdmFsaWRhdGUoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gcHJvamVjdHMsIGJvb2xlYW4gaXNNYW51YWwsIAotCQlib29sZWFuIGlzQnVpbGQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCVZhbGlkYXRpb25SdW5uZXIgbWUgPSBuZXcgVmFsaWRhdGlvblJ1bm5lcihwcm9qZWN0cywgaXNNYW51YWwsIGlzQnVpbGQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG1lLCBtb25pdG9yKTsKLQkJcmV0dXJuIG1lLl92YWxPcGVyYXRpb247Ci0JfQotCQotCXByaXZhdGUgVmFsaWRhdGlvblJ1bm5lcihNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cywgYm9vbGVhbiBpc01hbnVhbCwgYm9vbGVhbiBpc0J1aWxkKXsKLQkJX3Byb2plY3RzID0gcHJvamVjdHM7Ci0JCV9pc01hbnVhbCA9IGlzTWFudWFsOwotCQlfaXNCdWlsZCA9IGlzQnVpbGQ7Ci0JCQotCX0KLQkKLQlwcml2YXRlIFZhbE9wZXJhdGlvbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCV92YWxPcGVyYXRpb24gPSBuZXcgVmFsT3BlcmF0aW9uKCk7Ci0JCVZhbE1hbmFnZXIgbWFuYWdlciA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkKLQkJSVZhbGlkYXRvclZpc2l0b3Igc3RhcnRpbmdWaXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzTWFudWFsLAotCQkJCQlib29sZWFuIGlzQnVpbGQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXZhbGlkYXRvci52YWxpZGF0aW9uU3RhcnRpbmcocHJvamVjdCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwotCQkJfQkJCQotCQl9OwotCQkKLQkJSVZhbGlkYXRvclZpc2l0b3IgZmluaXNoZWRWaXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNNYW51YWwsCi0JCQkJCWJvb2xlYW4gaXNCdWlsZCwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCQl2YWxpZGF0b3IudmFsaWRhdGlvbkZpbmlzaGluZyhwcm9qZWN0LCBvcGVyYXRpb24uZ2V0U3RhdGUoKSwgbW9uaXRvcik7CQkJCQotCQkJfQkJCQotCQl9OwotCQkKLQkJbWFuYWdlci5hY2NlcHQoc3RhcnRpbmdWaXNpdG9yLCBudWxsLCBfaXNNYW51YWwsIF9pc0J1aWxkLCBfdmFsT3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCQkKLQkJZm9yIChNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBtZSA6IF9wcm9qZWN0cy5lbnRyeVNldCgpKXsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSl7Ci0JCQkJX3ZhbE9wZXJhdGlvbi5nZXRSZXN1bHQoKS5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQlyZXR1cm4gX3ZhbE9wZXJhdGlvbjsKLQkJCX0KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtZS5nZXRLZXkoKTsKLQkJCVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmFjY2VwdChzdGFydGluZ1Zpc2l0b3IsIHByb2plY3QsIF9pc01hbnVhbCwgX2lzQnVpbGQsIF92YWxPcGVyYXRpb24sIG1vbml0b3IpOwotCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBtZS5nZXRWYWx1ZSgpKXsKLQkJCQltYW5hZ2VyLnZhbGlkYXRlKHByb2plY3QsIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIF9pc01hbnVhbCxfaXNCdWlsZCwgCi0JCQkJCUluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRCwgX3ZhbE9wZXJhdGlvbiwgbW9uaXRvcik7Ci0JCQl9Ci0JCQltYW5hZ2VyLmFjY2VwdChmaW5pc2hlZFZpc2l0b3IsIHByb2plY3QsIF9pc01hbnVhbCwgX2lzQnVpbGQsIF92YWxPcGVyYXRpb24sIG1vbml0b3IpOwotCQl9Ci0JCW1hbmFnZXIuYWNjZXB0KGZpbmlzaGVkVmlzaXRvciwgbnVsbCwgX2lzTWFudWFsLCBfaXNCdWlsZCwgX3ZhbE9wZXJhdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiBfdmFsT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZShtb25pdG9yKTsJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1OTM4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBQcm9jZXNzIHRoZSB2YWxpZGF0b3IgKHZlcnNpb24gMikgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRXh0ZW5zaW9uUmVhZGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIgX21lOwotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRXh0ZW5zaW9uUmVhZGVyIGdldERlZmF1bHQoKXsKLQkJaWYgKF9tZSA9PSBudWxsKV9tZSA9IG5ldyBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIoKTsKLQkJcmV0dXJuIF9tZTsKLQl9Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIoKXt9Ci0JCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVlcCBpZiB0cnVlIGxvYWQgYWxsIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciBlYWNoIHZhbGlkYXRvciwgaWYgZmFsc2UKLQkgKiBkbyBhIHNoYWxsb3cgbG9hZCwgd2hlcmUgb25seSB0aGUgdmFsaWRhdG9yIGNsYXNzLCBpZCwgbmFtZSBhbmQgbWVzc2FnZSBjYXRlZ29yaWVzIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yW10gcHJvY2Vzcyhib29sZWFuIGRlZXAsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGdldEV4dGVuc2lvblBvaW50KCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKXJldHVybiBuZXcgVmFsaWRhdG9yWzBdOwotCQkJCQotCQlmb3IgKElFeHRlbnNpb24gZXh0IDogZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpKXsKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhbGlkYXRvciA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSl7Ci0JCQkJVmFsaWRhdG9yIHYgPSBwcm9jZXNzVmFsaWRhdG9yKHZhbGlkYXRvciwgZXh0LmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZXh0LmdldExhYmVsKCksIGRlZXAsIHByb2plY3QpOwotCQkJCWlmICh2ICE9IG51bGwpbGlzdC5hZGQodik7Ci0JCQl9Ci0JCX0KLQkJVmFsaWRhdG9yW10gdmFsID0gbmV3IFZhbGlkYXRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh2YWwpOwotCQlyZXR1cm4gdmFsOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgaW4gYSB2YWxpZGF0b3IgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0b3IgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgSWYgdHJ1ZSBsb2FkIGFsbCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgZWFjaAotCSAqICAgICAgICAgICAgdmFsaWRhdG9yLCBpZiBmYWxzZSBkbyBhIHNoYWxsb3cgbG9hZCwgd2hlcmUgb25seSB0aGUKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvciBjbGFzcywgaWQgYW5kIG5hbWUncyBhcmUgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdCB0aGF0IHlvdSBhcmUgZGVmaW5lZCBpbi4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaAotCSAqICAgICAgICAgICAgbWVhbnMgdGhhdCB5b3UgYXJlIGEgZ2xvYmFsIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCB2YWxpZGF0b3Igb3IgbnVsbCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgcHJvY2Vzc1ZhbGlkYXRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmFsaWRhdG9yLCBTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBkZWVwLCAKLQkJCUlQcm9qZWN0IHByb2plY3QpIHsKLQkJVmFsaWRhdG9yLlYyIHYgPSBudWxsOwotCQl0cnkgewotCQkJQWJzdHJhY3RWYWxpZGF0b3IgdmIgPSAoQWJzdHJhY3RWYWxpZGF0b3IpdmFsaWRhdG9yLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRXh0ZW5zaW9uQ29uc3RhbnRzLkF0dHJpYkNsYXNzKTsKLQkJCXYgPSBWYWxpZGF0b3IuY3JlYXRlKHZiLCBwcm9qZWN0KS5hc1YyVmFsaWRhdG9yKCk7Ci0JCQl2LnNldElkKGlkKTsKLQkJCXYuc2V0TmFtZShsYWJlbCk7Ci0JCQl2LnNldEJ1aWxkVmFsaWRhdGlvbihnZXRBdHRyaWJ1dGUodmFsaWRhdG9yLCBFeHRlbnNpb25Db25zdGFudHMuYnVpbGQsIHRydWUpKTsKLQkJCXYuc2V0TWFudWFsVmFsaWRhdGlvbihnZXRBdHRyaWJ1dGUodmFsaWRhdG9yLCBFeHRlbnNpb25Db25zdGFudHMubWFudWFsLCB0cnVlKSk7Ci0JCQl2LnNldFZlcnNpb24oZ2V0QXR0cmlidXRlKHZhbGlkYXRvciwgRXh0ZW5zaW9uQ29uc3RhbnRzLnZlcnNpb24sIDEpKTsKLQkJCXYuc2V0U291cmNlSWQodmFsaWRhdG9yLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuc291cmNlSWQpKTsKLQkJCWlmIChkZWVwKXsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IHZhbGlkYXRvci5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKylwcm9jZXNzVmFsaWRhdG9yQ2hpbGRyZW4odiwgY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCUlDb250cmlidXRvciBjb250cmliID0gdmFsaWRhdG9yLmdldENvbnRyaWJ1dG9yKCk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkVyckNvbmZpZywgY29udHJpYi5nZXROYW1lKCkpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSBtZXNzYWdlcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLgotCSAqIEBwYXJhbSB2Ci0JICogQHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSB2YWxpZGF0b3IgZGlkIG5vdCBkZWZpbmUgYW55IG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyBMaXN0PE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IGFkZE1lc3NhZ2VzKFZhbGlkYXRvciB2KXsKLQkJTGlzdDxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8TWVzc2FnZVNldmVyaXR5U2V0dGluZz4oKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZ2V0RXh0ZW5zaW9uUG9pbnQoKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpcmV0dXJuIGxpc3Q7Ci0JCUlFeHRlbnNpb24gZXh0ID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9uKHYuZ2V0SWQoKSk7Ci0JCWlmIChleHQgPT0gbnVsbClyZXR1cm4gbGlzdDsKLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gOiBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpewotCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBlbGVtLmdldENoaWxkcmVuKEV4dGVuc2lvbkNvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubmFtZSkpewotCQkJCWxpc3QuYWRkKHByb2Nlc3NNZXNzYWdlKGNlKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGV4dGVuc2lvbiBwb2ludCBmb3IgdGhlIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBvciBubyBleHRlbnNpb25zLgotCSAqLwotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGdldEV4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIEV4dGVuc2lvbkNvbnN0YW50cy52YWxpZGF0b3IpOwotCX0KLQkKLQotCS8qKgotCSAqIFByb2Nlc3MgYSBtZXNzYWdlIGVsZW1lbnQgZm9yIHRoZSB2YWxpZGF0b3IsIGJ5IGNyZWF0aW5nIGEgTWVzc2FnZUNhdGVnb3J5IGZvciBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgYSBNZXNzYWdlQ2F0ZWdvcnkgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgcHJvY2Vzc01lc3NhZ2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCVN0cmluZyBzID0gY2UuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkuc2V2ZXJpdHkpOwotCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5IHNldiA9IG51bGw7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuTWVzc2FnZUNhdGVnb3J5LnNldkVycm9yLmVxdWFscyhzKSlzZXYgPSBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LkVycm9yOwotCQllbHNlIGlmIChFeHRlbnNpb25Db25zdGFudHMuTWVzc2FnZUNhdGVnb3J5LnNldldhcm5pbmcuZXF1YWxzKHMpKXNldiA9IE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuV2FybmluZzsKLQkJZWxzZSBpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5zZXZJZ25vcmUuZXF1YWxzKHMpKXNldiA9IE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuSWdub3JlOwotCQkKLQkJcmV0dXJuIG5ldyBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nKGNlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuTWVzc2FnZUNhdGVnb3J5LmlkKSwgCi0JCQljZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5sYWJlbCksIHNldik7CQkKLQl9Ci0KLQkvKiogCi0JICogUHJvY2VzcyB0aGUgY2hpbGRyZW4gb2YgdGhlIHZhbGlkYXRvciB0YWcsIGkuZS4gaW5jbHVkZSBhbmQgZXhjbHVkZSBncm91cHMuCi0JICogCi0JICogIEBwYXJhbSB2IHRoZSB2YWxpZGF0b3IgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdXAKLQkgKiAgQHBhcmFtIGdyb3VwIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlIGVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NWYWxpZGF0b3JDaGlsZHJlbihWYWxpZGF0b3IuVjIgdiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdyb3VwKSB7Ci0JCUZpbHRlckdyb3VwIGZnID0gRmlsdGVyR3JvdXAuY3JlYXRlKGdyb3VwLmdldE5hbWUoKSk7Ci0JCWlmIChmZyA9PSBudWxsKXJldHVybjsJCQkKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bGVzID0gZ3JvdXAuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uQ29uc3RhbnRzLnJ1bGVzKTsKLQkJLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lCi0JCWZvciAoaW50IGk9MDsgaTxydWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByID0gcnVsZXNbaV0uZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvcihpbnQgaj0wOyBqPHIubGVuZ3RoOyBqKyspewotCQkJCXByb2Nlc3NSdWxlKGZnLCByW2pdKTsKLQkJCX0KLQkJfQotCQl2LmFkZChmZyk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBhIHJ1bGUgaW4gb25lIG9mIHRoZSBydWxlIGdyb3Vwcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmcgdGhlIGZpbHRlciBncm91cCB0aGF0IHdlIGFyZSBidWlsZGluZyB1cCAKLQkgKiBAcGFyYW0gcnVsZSBhIHJ1bGUgaW4gdGhlIGdyb3VwLCBsaWtlIGZpbGVleHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSdWxlKEZpbHRlckdyb3VwIGZnLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVsZSkgewotCQlGaWx0ZXJSdWxlIGZyID0gRmlsdGVyUnVsZS5jcmVhdGUocnVsZS5nZXROYW1lKCkpOwotCQlpZiAoZnIgPT0gbnVsbCl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFZhbE1lc3NhZ2VzLkVyckZpbHRlclJ1bGUpOwotCQlmci5zZXREYXRhKHJ1bGUpOwotCQlmZy5hZGQoZnIpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYW55IG9mIHRoZSB2YWxpZGF0b3JzIG5lZWQgdG8gYmUgbWlncmF0ZWQsIGFuZCBpZiBzbyBhbnN3ZXIgYSBuZXcKLQkgKiBWYWxpZGF0b3IgYXJyYXkuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcnMgdGhlIGV4aXN0aW5nIHZhbGlkYXRvcnMgKGZyb20gdGhlIHByZWZlcmVuY2VzKS4KLQkgKiAgCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZhbGlkYXRvcnMgbmVlZGVkIHRvIGJlIG1pZ3JhdGVkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBtaWdyYXRlKFZhbGlkYXRvcltdIHZhbGlkYXRvcnMsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJTWFwPFN0cmluZywgVmFsaWRhdG9yPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4odmFsaWRhdG9ycy5sZW5ndGgpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycyltYXAucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBnZXRFeHRlbnNpb25Qb2ludCgpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQkJCQkKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dCA6IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKSl7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCB2YWxpZGF0b3IgOiBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpewotCQkJCVZhbGlkYXRvciB2ID0gcHJvY2Vzc1ZhbGlkYXRvcih2YWxpZGF0b3IsIGV4dC5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGV4dC5nZXRMYWJlbCgpLCB0cnVlLCBwcm9qZWN0KTsKLQkJCQlpZiAodiA9PSBudWxsKWNvbnRpbnVlOwotCQkJCVZhbGlkYXRvciBvbGQgPSBtYXAuZ2V0KHYuZ2V0SWQoKSk7Ci0JCQkJaWYgKG9sZCA9PSBudWxsIHx8IG9sZC5nZXRWZXJzaW9uKCkgPCB2LmdldFZlcnNpb24oKSl7Ci0JCQkJCS8vVE9ETyB3ZSBtYXkgYmUgcmVwbGFjaW5nIHVzZXIgcHJlZmVyZW5jZXMsIGF0IHNvbWUgcG9pbnQgd2UgbWF5IHdhbnQgdG8gZG8gYSByZWFsIG1pZ3JhdGlvbi4KLQkJCQkJbWFwLnB1dCh2LmdldElkKCksIHYpOwotCQkJCQljb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvdW50ID4gMCl7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gbmV3IFZhbGlkYXRvclttYXAuc2l6ZSgpXTsKLQkJCW1hcC52YWx1ZXMoKS50b0FycmF5KHZhbHMpOwotCQkJcmV0dXJuIHZhbHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lLCBib29sZWFuIGRmdCl7Ci0JCVN0cmluZyB2ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIGRmdDsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHYpKXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodikpcmV0dXJuIGZhbHNlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZnQ7Ci0JfQotCQotCXByaXZhdGUgaW50IGdldEF0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUsIGludCBkZnQpewotCQlTdHJpbmcgdiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwotCQlpZiAodiA9PSBudWxsKXJldHVybiBkZnQ7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2KTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0LgotCQl9Ci0JCXJldHVybiBkZnQ7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZy4KLS8vCSAqIEBwYXJhbSBlbGVtCi0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSl7Ci0vLwkJU3RyaW5nIG5hbWUgPSBlbGVtLmdldE5hbWUoKTsKLS8vCQlTdHJpbmdbXSBhdHRyaWJzID0gZWxlbS5nZXRBdHRyaWJ1dGVOYW1lcygpOwotLy8JCVN0cmluZ1tdIHZhbHMgPSBuZXcgU3RyaW5nW2F0dHJpYnMubGVuZ3RoXTsKLS8vCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKyl2YWxzW2ldID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0cmlic1tpXSk7Ci0vLwkJU3RyaW5nIHYgPSBlbGVtLmdldFZhbHVlKCk7Ci0vLwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtLmdldENoaWxkcmVuKCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKWR1bXAoY2hpbGRyZW5baV0pOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvRmlsdGVyR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0ZpbHRlckdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGY2ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvRmlsdGVyR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkV4dGVuc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNZXNzYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlckdyb3VwIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JLyoqIEEgbGlzdCBvZiBGaWx0ZXJSdWxlJ3MgZm9yIHRoaXMgZ3JvdXAuICovCi0JTGlzdDxGaWx0ZXJSdWxlPiBfcnVsZXMgPSBuZXcgTGlua2VkTGlzdDxGaWx0ZXJSdWxlPigpOwotCUZpbHRlclJ1bGVbXSBfcnVsZXNBcnJheTsKLQotCS8qKgotCSAqIEFuc3dlciBhIGZpbHRlciBncm91cCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIG5hbWUgZWl0aGVyICJpbmNsdWRlIiBvciAiZXhjbHVkZSIKLQkgKiAKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzbid0IGNvcnJlY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJHcm91cCBjcmVhdGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5pbmNsdWRlLmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IEZpbHRlckluY2x1ZGVHcm91cCgpOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLmV4Y2x1ZGUuZXF1YWxzKG5hbWUpKXJldHVybiBuZXcgRmlsdGVyRXhjbHVkZUdyb3VwKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSBuZXcgZmlsdGVyIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBleGNsdWRlIGlmIHRydWUgYW4gZXhjbHVzaW9uIGdyb3VwIGlzIHJldHVybmVkLCBvdGhlcndpc2UgYW4gaW5jbHVzaW9uIGdyb3VwIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsdGVyR3JvdXAgY3JlYXRlKGJvb2xlYW4gZXhjbHVkZSl7Ci0JCWlmIChleGNsdWRlKSByZXR1cm4gbmV3IEZpbHRlckV4Y2x1ZGVHcm91cCgpOwotCQlyZXR1cm4gbmV3IEZpbHRlckluY2x1ZGVHcm91cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChGaWx0ZXJSdWxlIGZyKSB7Ci0JCV9ydWxlc0FycmF5ID0gbnVsbDsKLQkJX3J1bGVzLmFkZChmcik7Ci0JfQotCQotCS8qKgotCSAqIElmIHlvdSBjYW4sIHJlbW92ZSB0aGlzIHJ1bGUgZnJvbSB5b3Vyc2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gZnIgdGhlIHJ1bGUgdGhhdCBpcyBiZWluZyByZW1vdmVkCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBydWxlIHdhcyByZW1vdmVkLCBhbmQgZmFsc2UgaWYgaXQgd2FzIG5vdC4gSWYgeW91IGRpZG4ndCBpbmNsdWRlIHRoZSBydWxlIGluIHRoZQotCSAqIGZpcnN0IHBsYWNlLCBmYWxzZSB3b3VsZCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlKEZpbHRlclJ1bGUgZnIpewotCQlpZiAoX3J1bGVzLnJlbW92ZShmcikpewotCQkJX3J1bGVzQXJyYXkgPSAgbnVsbDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIEZpbHRlclJ1bGVbXSBnZXRSdWxlcygpewotCQlGaWx0ZXJSdWxlW10gcnVsZXMgPSBfcnVsZXNBcnJheTsKLQkJaWYgKHJ1bGVzID09IG51bGwpewotCQkJcnVsZXMgPSBuZXcgRmlsdGVyUnVsZVtfcnVsZXMuc2l6ZSgpXTsKLQkJCV9ydWxlcy50b0FycmF5KHJ1bGVzKTsKLQkJCV9ydWxlc0FycmF5ID0gcnVsZXM7Ci0JCX0KLQkJcmV0dXJuIHJ1bGVzOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLQkKLQkvKiogQW5zd2VyIHRoZSB0eXBlIGFzIGEgdHlwZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gYSB1c2VyLCB0aGF0IGlzIGl0IGhhcyBiZWVuIGxvY2FsaXplZC4gKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpc3BsYXlhYmxlVHlwZSgpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVySW5jbHVkZUdyb3VwIGV4dGVuZHMgRmlsdGVyR3JvdXAgewotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBWYWxNZXNzYWdlcy5UeXBlSW5jbHVkZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuR3JvdXBJbmNsdWRlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIEZpbHRlckdyb3VwIGNyZWF0ZSgpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVySW5jbHVkZUdyb3VwKCk7Ci0JCX0KLQkJCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyRXhjbHVkZUdyb3VwIGV4dGVuZHMgRmlsdGVyR3JvdXAgewotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuVHlwZUV4Y2x1ZGU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBGaWx0ZXJHcm91cCBjcmVhdGUoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlckV4Y2x1ZGVHcm91cCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlhYmxlVHlwZSgpIHsKLQkJCXJldHVybiBWYWxNZXNzYWdlcy5Hcm91cEV4Y2x1ZGU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdmFsaWRhdGUgdGhlIHJlc291cmNlIGJhc2VkIG9uIHRoZSBmaWx0ZXJzIGluIHRoaXMgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQuCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gVGhpcyBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZQotCSAqIG9ubHkgdGhlIHByb2plY3QgbGV2ZWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUZpbHRlclJ1bGVbXSBydWxlcyA9IGdldFJ1bGVzKCk7Ci0JCWJvb2xlYW4gZXhjbHVkZSA9IGlzRXhjbHVkZSgpOwotCQlib29sZWFuIGluY2x1ZGUgPSBpc0luY2x1ZGUoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChGaWx0ZXJSdWxlIHJ1bGUgOiBydWxlcyl7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJQm9vbGVhbiBtYXRjaCA9IHJ1bGUubWF0Y2hlc1Jlc291cmNlKHJlc291cmNlKTsKLQkJCQlpZiAobWF0Y2ggIT0gbnVsbCljb3VudCsrOwotCQkJCWlmIChleGNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIGZhbHNlOwotCQkJCWlmIChpbmNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCUJvb2xlYW4gbWF0Y2ggPSBydWxlLm1hdGNoZXNQcm9qZWN0KHByb2plY3QpOwotCQkJaWYgKG1hdGNoICE9IG51bGwpY291bnQrKzsKLQkJCWlmIChleGNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIGZhbHNlOwotCQkJaWYgKGluY2x1ZGUgJiYgbWF0Y2ggIT0gbnVsbCAmJiBtYXRjaClyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZXhjbHVkZSlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNvdW50ID09IDApcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyBpcyBhbiBpbmNsdXNpb24gZmlsdGVyLCB0aGF0IGlzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdAotCSAqIG1hdGNoIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIGlzIGFuIGV4Y2x1c2lvbiBmaWx0ZXIsIHRoYXQgaXMgaWYgYW55IG9mIHRoZSBydWxlcyBtYXRjaCB0aGUgCi0JICogcmVzb3VyY2UgaXMgbm90IHZhbGlkYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4Y2x1ZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZpbHRlckdyb3VwIGNyZWF0ZSgpOwotCi0JLyoqIEFuc3dlciBhIGRlZXAgY29weSBvZiB5b3Vyc2VsZi4gKi8KLQlwdWJsaWMgRmlsdGVyR3JvdXAgY29weSgpIHsKLQkJRmlsdGVyR3JvdXAgZmcgPSBjcmVhdGUoKTsKLQkJRmlsdGVyUnVsZVtdIHJ1bGVzID0gZ2V0UnVsZXMoKTsKLQkJZmcuX3J1bGVzQXJyYXkgPSBuZXcgRmlsdGVyUnVsZVtydWxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8cnVsZXMubGVuZ3RoOyBpKyspewotCQkJZmcuX3J1bGVzQXJyYXlbaV0gPSBydWxlc1tpXS5jb3B5KCk7Ci0JCQlmZy5fcnVsZXMuYWRkKGZnLl9ydWxlc0FycmF5W2ldKTsKLQkJfQotCQlyZXR1cm4gZmc7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmVhN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvRmlsdGVyUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5FeHRlbnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJlZkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQSBydWxlIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgb3V0IChvciBpbikgdmFsaWRhdGlvbiBvbiBhIHJlc291cmNlLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlclJ1bGUgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIF9wYXR0ZXJuOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJ1bGUgYmFzZWQgb24gYW4gZXh0ZW5zaW9uIGVsZW1lbnQuCi0JICogQHBhcmFtIG5hbWUgdGhlIGV4dGVuc2lvbiBlbGVtZW50LCBpdCBjYW4gYmUgb25lIG9mIHByb2plY3ROYXR1cmUsIGZhY2V0LCBmaWxlZXh0LCBmaWxlIG9yIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbHRlclJ1bGUgY3JlYXRlKFN0cmluZyBuYW1lKXsKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmZpbGVleHQuZXF1YWxzKG5hbWUpKXJldHVybiBuZXcgRmlsZUV4dCgpOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUucHJvamVjdE5hdHVyZS5lcXVhbHMobmFtZSkpcmV0dXJuIG5ldyBQcm9qZWN0TmF0dXJlKCk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5maWxlLmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IEZpbGUoKTsKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmNvbnRlbnRUeXBlLmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IENvbnRlbnRUeXBlKCk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5mYWNldC5lcXVhbHMobmFtZSkpcmV0dXJuIG5ldyBGYWNldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJSdWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgaW50IHR5cGUpewotCQlGaWxlIGV4dCA9IG5ldyBGaWxlKCk7Ci0JCWV4dC5zZXREYXRhKHBhdHRlcm4pOwotCQlleHQuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJZXh0LnNldFR5cGUodHlwZSk7Ci0JCXJldHVybiBleHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyUnVsZSBjcmVhdGVGaWxlRXh0KFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpewotCQlGaWxlRXh0IGV4dCA9IG5ldyBGaWxlRXh0KCk7Ci0JCWV4dC5zZXREYXRhKHBhdHRlcm4pOwotCQlleHQuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJcmV0dXJuIGV4dDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJSdWxlIGNyZWF0ZUZhY2V0KFN0cmluZyBmYWNldElkKXsKLQkJRmFjZXQgZmFjZXQgPSBuZXcgRmFjZXQoKTsKLQkJZmFjZXQuc2V0RGF0YShmYWNldElkKTsKLQkJcmV0dXJuIGZhY2V0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbHRlclJ1bGUgY3JlYXRlUHJvamVjdChTdHJpbmcgcHJvamVjdE5hdHVyZSl7Ci0JCVByb2plY3ROYXR1cmUgcG4gPSBuZXcgUHJvamVjdE5hdHVyZSgpOwotCQlwbi5zZXREYXRhKHByb2plY3ROYXR1cmUpOwotCQlyZXR1cm4gcG47Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyUnVsZSBjcmVhdGVDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUsIGJvb2xlYW4gZXhhY3RNYXRjaCl7Ci0JCUNvbnRlbnRUeXBlIGN0ID0gbmV3IENvbnRlbnRUeXBlKCk7Ci0JCWN0LnNldERhdGEoY29udGVudFR5cGUpOwotCQljdC5zZXRFeGFjdE1hdGNoKGV4YWN0TWF0Y2gpOwotCQlyZXR1cm4gY3Q7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bGUpOwotCi0JLyoqIAotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBydWxlIG1hdGNoZXMgdGhlIHJlc291cmNlLCBmYWxzZSBpZiBpdCBkb2Vzbid0LCBhbmQKLQkgKiBudWxsIGlmIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5IHRvIHJlc291cmNlcy4KLQkgKiAKLQkgKiAJQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBtYXRjaGVzUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBydWxlIG1hdGNoZXMgdGhlIHByb2plY3QsIGZhbHNlIGlmIGl0IGRvZXNuJ3QsIGFuZCBudWxsIGlmIHRoZQotCSAqIHJ1bGUgZG9lcyBub3QgYXBwbHkuCi0JICogCi0JICogCUBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSl7Ci0JCV9wYXR0ZXJuID0gZGF0YTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldERpc3BsYXlhYmxlVHlwZSgpICsgIjogIiArIF9wYXR0ZXJuOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKiBBbnN3ZXIgYSBuYW1lIG9mIHRoZSBydWxlLCB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gYSB1c2VyLiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpewotCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCl7Ci0JCXJldHVybiBfcGF0dGVybjsKLQl9Ci0JCi0JLyoqIEFuc3dlciB0aGUgdHlwZSBvZiBydWxlLiAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOwotCQotCS8qKiBBbnN3ZXIgYSB0eXBlIHRoYXQgY2FuIGJlIGRpc3BsYXllZCB0byBhbiBlbmQgdXNlci4gKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpc3BsYXlhYmxlVHlwZSgpOwotCQotCXB1YmxpYyBib29sZWFuIGFzQm9vbGVhbihTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYURlZmF1bHQpewotCQlpZiAodmFsdWUgPT0gbnVsbClyZXR1cm4gYURlZmF1bHQ7Ci0JCWlmICh2YWx1ZS5lcXVhbHMoRXh0ZW5zaW9uQ29uc3RhbnRzLlRydWUpKXJldHVybiB0cnVlOwotCQlpZiAodmFsdWUuZXF1YWxzKEV4dGVuc2lvbkNvbnN0YW50cy5GYWxzZSkpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYURlZmF1bHQ7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvamVjdE5hdHVyZSBleHRlbmRzIEZpbHRlclJ1bGUgewotCi0JCQotCQlwdWJsaWMgRmlsdGVyUnVsZSBjb3B5KCkgewotCQkJUHJvamVjdE5hdHVyZSBydWxlID0gbmV3IFByb2plY3ROYXR1cmUoKTsKLQkJCXJ1bGUuX3BhdHRlcm4gPSBfcGF0dGVybjsKLQkJCXJldHVybiBydWxlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXREYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKSB7Ci0JCQlfcGF0dGVybiA9IHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmlkKTsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlhYmxlVHlwZSgpIHsKLQkJCXJldHVybiBWYWxNZXNzYWdlcy5SdWxlUHJvamVjdE5hdHVyZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLnByb2plY3ROYXR1cmU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKF9wYXR0ZXJuKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJfQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUV4dCBleHRlbmRzIEZpbHRlclJ1bGUgewotCQkKLQkJcHJpdmF0ZSBib29sZWFuIF9jYXNlU2Vuc2l0aXZlOwotCQkKLQkJcHVibGljIEZpbHRlclJ1bGUgY29weSgpIHsKLQkJCUZpbGVFeHQgcnVsZSA9IG5ldyBGaWxlRXh0KCk7Ci0JCQlydWxlLl9wYXR0ZXJuID0gX3BhdHRlcm47Ci0JCQlydWxlLl9jYXNlU2Vuc2l0aXZlID0gX2Nhc2VTZW5zaXRpdmU7Ci0JCQlyZXR1cm4gcnVsZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmZpbGVleHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVUeXBlKCkgewotCQkJcmV0dXJuIFZhbE1lc3NhZ2VzLlJ1bGVGaWxlRXh0OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldERhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bGUpIHsKLQkJCV9wYXR0ZXJuID0gcnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIuZXh0KTsKLQkJCV9jYXNlU2Vuc2l0aXZlID0gYXNCb29sZWFuKHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmNhc2VTZW5zaXRpdmUpLCBmYWxzZSk7CQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpZiAoX2Nhc2VTZW5zaXRpdmUpcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkZpbGVFeHRXaXRoQ2FzZSwgZ2V0RGlzcGxheWFibGVUeXBlKCksIF9wYXR0ZXJuKTsKLQkJCXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5GaWxlRXh0V2l0aG91dENhc2UsIGdldERpc3BsYXlhYmxlVHlwZSgpLCBfcGF0dGVybik7Ci0JCX0KLQotCQlwdWJsaWMgQm9vbGVhbiBtYXRjaGVzUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlTdHJpbmcgZXh0ID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKF9jYXNlU2Vuc2l0aXZlKXJldHVybiBfcGF0dGVybi5lcXVhbHMoZXh0KTsKLQkJCXJldHVybiBfcGF0dGVybi5lcXVhbHNJZ25vcmVDYXNlKGV4dCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCQlyZXR1cm4gX2Nhc2VTZW5zaXRpdmU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBsb2FkKFByZWZlcmVuY2VzIHJpZCkgewotCQkJX2Nhc2VTZW5zaXRpdmUgPSByaWQuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmNhc2VTZW5zaXRpdmUsIGZhbHNlKTsKLQkJCXN1cGVyLmxvYWQocmlkKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNhdmUoUHJlZmVyZW5jZXMgcmlkKSB7Ci0JCQlyaWQucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmNhc2VTZW5zaXRpdmUsIF9jYXNlU2Vuc2l0aXZlKTsKLQkJCXN1cGVyLnNhdmUocmlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlfY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGUgZXh0ZW5kcyBGaWx0ZXJSdWxlIHsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBfY2FzZVNlbnNpdGl2ZTsKLQkJcHJpdmF0ZSBpbnQJCV90eXBlOwotCQkKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlsZVR5cGVGaWxlID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlsZVR5cGVGb2xkZXIgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGaWxlVHlwZUZ1bGwgPSAzOwotCQkKLQkJcHVibGljIEZpbGUoKXsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgRmlsdGVyUnVsZSBjb3B5KCkgewotCQkJRmlsZSBydWxlID0gbmV3IEZpbGUoKTsKLQkJCXJ1bGUuX3BhdHRlcm4gPSBfcGF0dGVybjsKLQkJCXJ1bGUuX2Nhc2VTZW5zaXRpdmUgPSBfY2FzZVNlbnNpdGl2ZTsKLQkJCXJ1bGUuX3R5cGUgPSBfdHlwZTsKLQkJCXJldHVybiBydWxlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUuZmlsZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlpZiAoX3R5cGUgPT0gRmlsZVR5cGVGb2xkZXIpcmV0dXJuIFZhbE1lc3NhZ2VzLlJ1bGVGb2xkZXI7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuUnVsZUZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKSB7Ci0JCQlfcGF0dGVybiA9IHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLm5hbWUpOwotCQkJaWYgKF9wYXR0ZXJuID09IG51bGwpdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihWYWxNZXNzYWdlcy5FcnJQYXR0ZXJuQXR0cmliKTsKLQkJCV9jYXNlU2Vuc2l0aXZlID0gYXNCb29sZWFuKHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmNhc2VTZW5zaXRpdmUpLCBmYWxzZSk7CQotCQkJU3RyaW5nIHR5cGUgPSBydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5maWxlVHlwZSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oVmFsTWVzc2FnZXMuRXJyVHlwZVJlcSk7Ci0JCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLkZpbGVUeXBlLmZpbGUuZXF1YWxzKHR5cGUpKV90eXBlID0gRmlsZVR5cGVGaWxlOwotCQkJZWxzZSBpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLkZpbGVUeXBlLmZvbGRlci5lcXVhbHModHlwZSkpX3R5cGUgPSBGaWxlVHlwZUZvbGRlcjsKLQkJCWVsc2UgaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5GaWxlVHlwZS5mdWxsLmVxdWFscyh0eXBlKSlfdHlwZSA9IEZpbGVUeXBlRnVsbDsKLQkJCWVsc2UgewotCQkJCU9iamVjdFtdIHBhcm1zID0ge3R5cGUsIEV4dGVuc2lvbkNvbnN0YW50cy5GaWxlVHlwZS5maWxlLCBFeHRlbnNpb25Db25zdGFudHMuRmlsZVR5cGUuZm9sZGVyLCAKLQkJCQkJRXh0ZW5zaW9uQ29uc3RhbnRzLkZpbGVUeXBlLmZ1bGx9OwotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyVHlwZSwgcGFybXMpKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmIChfY2FzZVNlbnNpdGl2ZSlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRmlsZUV4dFdpdGhDYXNlLCBnZXREaXNwbGF5YWJsZVR5cGUoKSwgX3BhdHRlcm4pOwotCQkJcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkZpbGVFeHRXaXRob3V0Q2FzZSwgZ2V0RGlzcGxheWFibGVUeXBlKCksIF9wYXR0ZXJuKTsKLQkJfQotCQkKLQkJcHVibGljIEJvb2xlYW4gbWF0Y2hlc1Jlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJc3dpdGNoIChfdHlwZSl7Ci0JCQljYXNlIEZpbGVUeXBlRmlsZToKLQkJCQluYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBGaWxlVHlwZUZvbGRlcjoKLQkJCQluYW1lID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBGaWxlVHlwZUZ1bGw6Ci0JCQkJbmFtZSA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlpZiAoX2Nhc2VTZW5zaXRpdmUpcmV0dXJuIF9wYXR0ZXJuLmVxdWFscyhuYW1lKTsKLQkJCXJldHVybiBfcGF0dGVybi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbG9hZChQcmVmZXJlbmNlcyByaWQpIHsKLQkJCV9jYXNlU2Vuc2l0aXZlID0gcmlkLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5jYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JCQlfdHlwZSA9IHJpZC5nZXRJbnQoUHJlZkNvbnN0YW50cy5maWxlVHlwZSwgLTEpOwotCQkJc3VwZXIubG9hZChyaWQpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2F2ZShQcmVmZXJlbmNlcyByaWQpIHsKLQkJCXJpZC5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuY2FzZVNlbnNpdGl2ZSwgX2Nhc2VTZW5zaXRpdmUpOwotCQkJcmlkLnB1dEludChQcmVmQ29uc3RhbnRzLmZpbGVUeXBlLCBfdHlwZSk7Ci0JCQlzdXBlci5zYXZlKHJpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQkJX2Nhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQkJX3R5cGUgPSB0eXBlOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZhY2V0IGV4dGVuZHMgRmlsdGVyUnVsZSB7Ci0JCQotCQlwdWJsaWMgRmlsdGVyUnVsZSBjb3B5KCkgewotCQkJRmFjZXQgcnVsZSA9IG5ldyBGYWNldCgpOwotCQkJcnVsZS5fcGF0dGVybiA9IF9wYXR0ZXJuOwotCQkJcmV0dXJuIHJ1bGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBFeHRlbnNpb25Db25zdGFudHMuUnVsZS5mYWNldDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuUnVsZUZhY2V0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVsZSkgewotCQkJX3BhdHRlcm4gPSBydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5pZCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBtYXRjaGVzUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgX3BhdHRlcm4pOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb250ZW50VHlwZSBleHRlbmRzIEZpbHRlclJ1bGUgewotCQkKLQkJcHJpdmF0ZSBJQ29udGVudFR5cGUgCV90eXBlOwotCQlwcml2YXRlIGJvb2xlYW4JCQlfZXhhY3RNYXRjaCA9IHRydWU7Ci0JCQotCQlwdWJsaWMgRmlsdGVyUnVsZSBjb3B5KCkgewotCQkJQ29udGVudFR5cGUgcnVsZSA9IG5ldyBDb250ZW50VHlwZSgpOwotCQkJcnVsZS5fcGF0dGVybiA9IF9wYXR0ZXJuOwotCQkJcnVsZS5fdHlwZSA9IF90eXBlOwotCQkJcnVsZS5fZXhhY3RNYXRjaCA9IF9leGFjdE1hdGNoOwotCQkJcmV0dXJuIHJ1bGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBFeHRlbnNpb25Db25zdGFudHMuUnVsZS5jb250ZW50VHlwZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuUnVsZUNvbnRlbnRUeXBlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbG9hZChQcmVmZXJlbmNlcyByaWQpIHsKLQkJCV9leGFjdE1hdGNoID0gcmlkLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5leGFjdE1hdGNoLCB0cnVlKTsKLQkJCXN1cGVyLmxvYWQocmlkKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNhdmUoUHJlZmVyZW5jZXMgcmlkKSB7Ci0JCQlyaWQucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmV4YWN0TWF0Y2gsIF9leGFjdE1hdGNoKTsKLQkJCXN1cGVyLnNhdmUocmlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldERhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bGUpIHsKLQkJCXNldERhdGEocnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIuaWQpKTsKLQkJCWJvb2xlYW4gZXhhY3RNYXRjaCA9IHRydWU7Ci0JCQlTdHJpbmcgZXhhY3QgPSBydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5leGFjdE1hdGNoKTsKLQkJCWlmIChFeHRlbnNpb25Db25zdGFudHMuRmFsc2UuZXF1YWxzKGV4YWN0KSkgZXhhY3RNYXRjaCA9IGZhbHNlOwotCQkJc2V0RXhhY3RNYXRjaChleGFjdE1hdGNoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIHBhdHRlcm4pIHsKLQkJCV9wYXR0ZXJuID0gcGF0dGVybjsKLQkJCV90eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUocGF0dGVybik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWlmIChfdHlwZSA9PSBudWxsKXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjZCA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChjZCA9PSBudWxsKXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCQlJQ29udGVudFR5cGUgY3QgPSBjZC5nZXRDb250ZW50VHlwZSgpOwotCQkJCQlpZiAoY3QgPT0gbnVsbClyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCQlpZiAoX2V4YWN0TWF0Y2gpbWF0Y2ggPSBjdC5nZXRJZCgpLmVxdWFscyhfdHlwZS5nZXRJZCgpKTsKLQkJCQkJZWxzZSBtYXRjaCA9IGN0LmlzS2luZE9mKF90eXBlKTsKLQkJCQkJCi0JCQkJCWlmIChtYXRjaCAmJiBUcmFjaW5nLmlzVHJhY2VNYXRjaGVzKCkpVHJhY2luZy5sb2codG9TdHJpbmcoKSArICIgaGFzIG1hdGNoZWQgIiArIHJlc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbWF0Y2g7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJaWYoVHJhY2luZy5pc0xvZ2dpbmcoKSlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNob3VsZCB0aGUgY29udGVudCB0eXBlIG1hdGNoIGV4YWN0bHksIG9yIHNob3VsZCBzdWIgdHlwZXMgYmUKLQkJICogaW5jbHVkZWQgYXMgd2VsbD8KLQkJICogCi0JCSAqIEBwYXJhbSBleGFjdE1hdGNoCi0JCSAqICAgICAgICAgICAgSWYgdHJ1ZSB0aGlzIHJ1bGUgd2lsbCBvbmx5IG1hdGNoIHRoaXMgc3BlY2lmaWMgY29udGVudAotCQkgKiAgICAgICAgICAgIHR5cGUuIElmIGZhbHNlIHRoaXMgcnVsZSB3aWxsIG1hdGNoIHRoaXMgY29udGVudCB0eXBlIGFuZAotCQkgKiAgICAgICAgICAgIGFueSBvZiBpdCdzIHN1YiB0eXBlcy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEV4YWN0TWF0Y2goYm9vbGVhbiBleGFjdE1hdGNoKSB7Ci0JCQlfZXhhY3RNYXRjaCA9IGV4YWN0TWF0Y2g7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKF9leGFjdE1hdGNoKXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5Db250ZW50VHlwZUV4YWN0LCBnZXREaXNwbGF5YWJsZVR5cGUoKSwgX3BhdHRlcm4pOwotCQkJcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkNvbnRlbnRUeXBlTm90RXhhY3QsIGdldERpc3BsYXlhYmxlVHlwZSgpLCBfcGF0dGVybik7Ci0JCX0KLQkJCi0JfQotCi0JLyoqIEFuc3dlciBhIGRlZXAgY29weSBvZiB5b3Vyc2VsZi4gKi8KLQlwdWJsaWMgYWJzdHJhY3QgRmlsdGVyUnVsZSBjb3B5KCk7Ci0KLQkvKioKLQkgKiBTYXZlIHlvdXJzZWxmIGluIHRoZSBwcmVmZXJlbmNlIGZpbGUuCi0JICogQHBhcmFtIHJpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUHJlZmVyZW5jZXMgcmlkKSB7Ci0JCXJpZC5wdXQoUHJlZkNvbnN0YW50cy5ydWxlVHlwZSwgZ2V0VHlwZSgpKTsKLQkJcmlkLnB1dChQcmVmQ29uc3RhbnRzLnBhdHRlcm4sIGdldFBhdHRlcm4oKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFByZWZlcmVuY2VzIHJ1bGUpIHsKLQkJc2V0RGF0YShydWxlLmdldChQcmVmQ29uc3RhbnRzLnBhdHRlcm4sIG51bGwpKTsJCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0dsb2JhbFByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9HbG9iYWxQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQzYmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0dsb2JhbFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZ2xvYmFsIFByZWZlcmVuY2VzIGFzIHNldCBvbiB0aGUgVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsUHJlZmVyZW5jZXMgewotCQotCS8qKiBmYWxzZSAtIERlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHNob3VsZCBhbGwgdGhlIHZhbGlkYXRpb24gYmUgc3VzcGVuZGVkIHNldHRpbmcuICovIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBEZWZhdWx0U3VzcGVuZCA9IGZhbHNlOwotCQotCS8qKiBmYWxzZSAtIERlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGF1dG8gc2F2ZSBzZXR0aW5nLiAqLyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRGVmYXVsdEF1dG9TYXZlID0gZmFsc2U7Ci0JCi0JLyoqIGZhbHNlIC0gRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgY29uZmlybSBkaWFsb2cgc2V0dGluZy4gKi8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERlZmF1bHRDb25maXJtID0gdHJ1ZTsKLQkKLQkvKiogZmFsc2UgLSBEZWZhdWx0IHNldHRpbmcgZm9yIGxldHRpbmcgcHJvamVjdHMgb3ZlcnJpZGUgdGhlIGdsb2JhbCBzZXR0aW5ncy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRGVmYXVsdE92ZXJyaWRlID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBfZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBEZWZhdWx0U3VzcGVuZDsKLQlwcml2YXRlIGJvb2xlYW4gX3NhdmVBdXRvbWF0aWNhbGx5ID0gRGVmYXVsdEF1dG9TYXZlOwotCXByaXZhdGUgYm9vbGVhbiBfY29uZmlybURpYWxvZyA9IERlZmF1bHRDb25maXJtOwotCXByaXZhdGUgYm9vbGVhbiBfb3ZlcnJpZGUgPSBEZWZhdWx0T3ZlcnJpZGU7Ci0JCi0JLyoqIFRoZSBwbHVnLWluIHN0YXRlIHRpbWUgc3RhbXAuICovCi0JcHJpdmF0ZSBsb25nCV9zdGF0ZVRpbWVTdGFtcDsKLQkKLQkvKioKLQkgKiBUaGUgb25seSB2YWxpZCB3YXkgdG8gZ2V0IHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgaXMgdGhyb3VnaCB0aGUgVmFsTWFuYWdlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXIjZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBHbG9iYWxQcmVmZXJlbmNlcygpewl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0U2F2ZUF1dG9tYXRpY2FsbHkoKSB7Ci0JCXJldHVybiBfc2F2ZUF1dG9tYXRpY2FsbHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2F2ZUF1dG9tYXRpY2FsbHkoYm9vbGVhbiBzYXZlQXV0b21hdGljYWxseSkgewotCQlfc2F2ZUF1dG9tYXRpY2FsbHkgPSBzYXZlQXV0b21hdGljYWxseTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgYWxsIHZhbGlkYXRpb24gaGFzIGJlZW4gZGlzYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBfZGlzYWJsZUFsbFZhbGlkYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oYm9vbGVhbiBkaXNhYmxlQWxsVmFsaWRhdGlvbikgewotCQlfZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBkaXNhYmxlQWxsVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLiBUaGlzIGRvZXNuJ3QgcmVzZXQKLQkgKiB0aGUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0VG9EZWZhdWx0KCkgewotCQlfZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBEZWZhdWx0U3VzcGVuZDsKLQkJX3NhdmVBdXRvbWF0aWNhbGx5ID0gRGVmYXVsdEF1dG9TYXZlOwotCQlfY29uZmlybURpYWxvZyA9IERlZmF1bHRDb25maXJtOwotCQlfb3ZlcnJpZGUgPSBEZWZhdWx0T3ZlcnJpZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29uZmlybURpYWxvZygpIHsKLQkJcmV0dXJuIF9jb25maXJtRGlhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1EaWFsb2coYm9vbGVhbiBjb25maXJtRGlhbG9nKSB7Ci0JCV9jb25maXJtRGlhbG9nID0gY29uZmlybURpYWxvZzsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRTdGF0ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIF9zdGF0ZVRpbWVTdGFtcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZVRpbWVTdGFtcChsb25nIHN0YXRlVGltZVN0YW1wKSB7Ci0JCV9zdGF0ZVRpbWVTdGFtcCA9IHN0YXRlVGltZVN0YW1wOwotCX0KLQotCS8qKiBBbnN3ZXIgd2hldGhlciBvciBub3QgcHJvamVjdHMgYXJlIGFsbG93ZWQgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcy4gKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVycmlkZSgpIHsKLQkJcmV0dXJuIF9vdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7Ci0JCV9vdmVycmlkZSA9IG92ZXJyaWRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvSVZhbGlkYXRvclZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0lWYWxpZGF0b3JWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODNhYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvSVZhbGlkYXRvclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IG9iamVjdHMgdGhhdCB2aXNpdCBlbmFibGVkIHZhbGlkYXRvcnMuCi0gKiA8cD4gCi0gKiBVc2FnZToKLSAqIDxwcmU+Ci0gKiBjbGFzcyBWaXNpdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvclZpc2l0b3IgewotICogICAgcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gKiAgICAgICAvLyB5b3VyIGNvZGUgaGVyZQotICogICAgfQotICogfQotICogVmFsaWRhdG9yTWFuYWdlciB2bSA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotICogdm0uYWNjZXB0KG5ldyBWaXNpdG9yKCksIC4uLik7Ci0gKiA8L3ByZT4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yVmlzaXRvciB7Ci0JCi0JLyoqCi0JICogVmlzaXRzIHRoZSBnaXZlbiB2YWxpZGF0b3IuCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqLwotCXZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc01hbnVhbCwgCi0JCQlib29sZWFuIGlzQnVpbGQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1Byb2plY3RQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvUHJvamVjdFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Zjk2NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvUHJvamVjdFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJQcm9qZWN0OwotCi0vKioKLSAqIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0LgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQcmVmZXJlbmNlcyB7Ci0JLyoqIGZhbHNlIC0gRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgInNob3VsZCBhbGwgdGhlIHZhbGlkYXRpb24gYmUgc3VzcGVuZGVkIiBzZXR0aW5nLiAqLyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRGVmYXVsdFN1c3BlbmQgPSBmYWxzZTsKLQkKLQkvKiogZmFsc2UgLSBEZWZhdWx0IHNldHRpbmcgZm9yIGxldHRpbmcgcHJvamVjdHMgb3ZlcnJpZGUgdGhlIGdsb2JhbCBzZXR0aW5ncy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdAlfcHJvamVjdDsKLQotCXByaXZhdGUgYm9vbGVhbiAJX292ZXJyaWRlID0gRGVmYXVsdE92ZXJyaWRlOwotCXByaXZhdGUgYm9vbGVhbgkJX3N1c3BlbmQgPSBEZWZhdWx0U3VzcGVuZDsKLQkKLQlwcml2YXRlIFZhbGlkYXRvcltdCV92YWxpZGF0b3JzOwotCQotCXB1YmxpYyBQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCl7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBfb3ZlcnJpZGU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKLQkJX292ZXJyaWRlID0gb3ZlcnJpZGU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFN1c3BlbmQoKSB7Ci0JCXJldHVybiBfc3VzcGVuZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U3VzcGVuZChib29sZWFuIHN1c3BlbmQpIHsKLQkJX3N1c3BlbmQgPSBzdXNwZW5kOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIEByZXR1cm4gYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMoKSB7Ci0JCVZhbGlkYXRvcltdIHZhbHMgPSBfdmFsaWRhdG9yczsKLQkJaWYgKHZhbHMgPT0gbnVsbCl7Ci0JCQl2YWxzID0gaW5pdCgpOwotCQkJX3ZhbGlkYXRvcnMgPSB2YWxzOwotCQl9Ci0JCXJldHVybiB2YWxzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKFZhbGlkYXRvcltdIHZhbGlkYXRvcnMpewotCQlfdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7Ci0JfQotCQotCXByaXZhdGUgVmFsaWRhdG9yW10gaW5pdCgpewotCQlWYWxpZGF0b3JbXSB2YWxzID0gbnVsbDsKLQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwbSA9IG5ldyBWYWxQcmVmTWFuYWdlclByb2plY3QoX3Byb2plY3QpOwotCQlpZiAodnBtLmhhc1Byb2plY3RTcGVjaWZpY1NldHRpbmdzKCkpewotCQkJdnBtLmxvYWRQcm9qZWN0UHJlZmVyZW5jZXModGhpcyk7Ci0JCQl2YWxzID0gX3ZhbGlkYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycygpOwotCQl9Ci0JCWlmICh2YWxzID09IG51bGwpdmFscyA9IG5ldyBWYWxpZGF0b3JbMF07Ci0JCXJldHVybiB2YWxzOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9WYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1ZhbGlkYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk2NjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1ZhbGlkYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotLyoqCi0gKiBJbXBsZW1lbnQgc29tZSBjb21tb24gdmFsaWRhdG9yIG1ldGhvZHMsIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0IG9mIHRoZSBBUEkuCi0gKiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JIZWxwZXIgewotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yIGFscmVhZHkgaGFzIGFuIGV4Y2x1ZGUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFeGNsdWRlR3JvdXAoVmFsaWRhdG9yLlYyIHYpewotCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IHYuZ2V0R3JvdXBzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxncm91cHMubGVuZ3RoOyBpKyspewotCQkJaWYgKGdyb3Vwc1tpXS5pc0V4Y2x1ZGUoKSlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4OGY2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPGgxPlZhbGlkYXRpb24gRnJhbWV3b3JrPC9oMT4KLTxoMz5CdWlsZCBCYXNlZCBWYWxpZGF0aW9uPC9oMz4KLVRoZSBtYWluIGNsYXNzIGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9uIGlzIHRoZSAKLTxhIGhyZWY9IlZhbEJ1aWxkZXJKb2IuaHRtbCI+VmFsQnVpbGRlckpvYjwvYT4uIFRoaXMgZ2V0cyB0cmlnZ2VyZWQgYXMgcGFydCBvZiB0aGUKLWJ1aWxkIG1lY2hhbmlzbS4gSXQgcmVhY3RzIHRvIHJlc291cmNlIGNoYW5nZSBldmVudHMsIGFuZCBmcm9tIHRoYXQgZGV0ZXJtaW5lcyB3aGF0IG5lZWRzIHRvIGJlIAotdmFsaWRhdGVkLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQyZDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci08aDE+VmFsaWRhdGlvbiBGcmFtZXdvcms8L2gxPgotPGgzPkRlcGVuZGVuY3kgU3VwcG9ydDwvaDM+Ci08cD5Tb21ldGltZXMgcmVzb3VyY2VzIGRlcGVuZCBvbiBvdGhlciByZXNvdXJjZXMsIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgYXJlIAotdmFsaWQgb3Igbm90LiBBbiBleGFtcGxlIHdvdWxkIGJlIHRoYXQgYW4gWE1MIHJlc291cmNlIGNvdWxkIGRlcGVuZCBvbiBhIERURC4gSWYgYXQgc29tZSAKLXBvaW50IGluIHRoZSBmdXR1cmUgdGhlIERURCBjaGFuZ2VzLCB0aGVuIHRoZSBkZXBlbmRlbnQgWE1MIHJlc291cmNlIHNob3VsZCBiZSAKLXJldmFsaWRhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IHN0aWxsIG1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGNoYW5nZWQgRFREIAotZmlsZS4gSW4gb3JkZXIgdG8gZG8gdGhpcyBlZmZpY2llbnRseSwgdGhlcmUgbmVlZHMgdG8gYmUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiAKLXRoZSBEVEQgYW5kIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIGl0LjxwPlRvIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFsbG93cyAKLXRoaXMgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0byBiZSByZXR1cm5lZCBhcyBwYXJ0IG9mIGEKLTxhIGhyZWY9IkFic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlLCBpbnQsIFZhbGlkYXRpb25TdGF0ZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj4KLXZhbGlkYXRlIG9wZXJhdGlvbjwvYT4uIFNpbmNlIHRoZSB2YWxpZGF0b3IgbmVlZGVkIHRvIGZpZ3VyZSB0aGlzIG91dCBhbnl3YXlzLCAKLXdoeSBub3QgcGFzcyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGZyYW1ld29yaywgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQuIAotVGhpcyBzYXZlcyB0aGUgY29zdCBvZiBoYXZpbmcgdG8gcGFyc2UgdGhlIGZpbGUgYXQgc29tZSBsYXRlciBwb2ludCBpbiB0aW1lIAotKHdoZW4gdGhlIGZpbGUgaXMgcHJvYmFibHkgc2l0dGluZyBjb2xkIG9uIGRpc2spLiBUaGUgZmV3ZXIgdGltZXMgdGhhdCB3ZSBuZWVkIAotdG8gb3BlbiwgcmVhZCBhbmQvb3IgcGFyc2UgdGhlIHNhbWUgZmlsZSwgd2lsbCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgCi1wcm9kdWN0LgotPHA+SW4gcGFydGljdWxhciB3aGVuIHRoZSB2YWxpZGF0ZSBtZXRob2QgcmV0dXJucywgYQotPGEgaHJlZj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIj5WYWxpZGF0aW9uUmVzdWx0PC9hPiBtdXN0IGJlIHJldHVybmVkLCBpbnNpZGUgb2YgCi10aGlzIHJlc3VsdCwgYWxsIHlvdXIgZGVwZW5kZW5jaWVzIG5lZWQgdG8gYmUgc3BlY2lmaWVkIHdpdGggdGhlJm5ic3A7Ci08YSBocmVmPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0RGVwZW5kc09uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVtdKSI+Ci1zZXREZXBlbmRzT248L2E+IG1ldGhvZC48cD5JbiBhZGRpdGlvbiB0byBrZWVwaW5nIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIAotdXAtdG8tZGF0ZSB0aHJvdWdoIHRoZSBub3JtYWwgY291cnNlIG9mIHZhbGlkYXRpb24sIGRpcmVjdCBhY2Nlc3MgaXMgYWxzbyAKLXByb3ZpZGVkIHRvIHRoZSBkZXBlbmRlbmN5IHN1cHBvcnQgdGhyb3VnaCB0aGUKLTxhIGhyZWY9IlZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREZXBlbmRlbmN5SW5kZXgoKSI+Z2V0RGVwZW5kZW5jeUluZGV4PC9hPiAKLW1ldGhvZC4gVGhlIDxhIGhyZWY9IklEZXBlbmRlbmN5SW5kZXguaHRtbCI+SURlcGVuZGVuY3lJbmRleDwvYT4gYWxsb3dzIHlvdSB0byAKLWRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdG9yLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZlODczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy9yZWZlcmVuY2lhbEZpbGVFeHRTY2hlbWEuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/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+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVhYTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InZhbGlkYXRvci12MiIgbmFtZT0iVmFsaWRhdG9yIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFsbCB2YWxpZGF0b3JzIHRoYXQgd2lzaCB0byB1c2UgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBuZWVkIHRvIGV4dGVuZCB0aGlzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHNob3J0IGlkIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgcGx1Zy1pbiwgc28gdGhhdCB0aGlzIHZhbGlkYXRvciBjYW4gYmUgaWRlbnRpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzaG9ydCB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHZhbGlkYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSB2YWxpZGF0b3IgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbmNsdWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4Y2x1ZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1lc3NhZ2VDYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgdmFsaWRhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSXMgdGhpcyB2YWxpZGF0b3IgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9ucz8gVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW51YWwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElzIHRoaXMgdmFsaWRhdG9yIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb25zPyBUaGUgZGVmYXVsdCBpcyB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gb2YgdGhlIGRlZmluaXRpb24uIEl0IGlzIGEgc2ltcGxlIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSAxLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZWlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgdmFsaWRhdG9yIGFsc28gc2VydmVzIGFzIGFuIGFzLXlvdS10eXBlIHZhbGlkYXRvciAoYWxzbyBrbm93IGFzIGFuIElTb3VyY2VWYWxpZGF0b3IpIHRoZW4gaXQmYXBvcztzIHNvdXJjZSBpZCBpcyBzcGVjaWZpZWQgaGVyZSwgc28gdGhhdCB0aGUgdHdvIHZhbGlkYXRvcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgYW5vdGhlci4KLUJ5IHNvdXJjZSBpZCwgd2UgbWVhbiB0aGUgaWQgdGhhdCBpcyB1c2VkIGluIHRoZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZVZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImluY2x1ZGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBzZXQgb2YgaW5jbHVzaW9uIHJ1bGVzLCB3aGljaCBhcmUgdXNlZCBpbiBmaWx0ZXJpbmcgd2hpY2ggcmVzb3VyY2VzIGdldCB2YWxpZGF0ZWQuIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSBydWxlcyBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgdGhlIHZhbGlkYXRvciB0byBiZSBjYWxsZWQgb24gdGhlIHBhcnRpY3VsYXIgcmVzb3VyY2UuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bGVzIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBjb250YWlucyBhIHNldCBvZiBleGNsdXNpb24gcnVsZXMsIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgYXJlIG1hdGNoZWQsIHRoZW4gdGhlIHZhbGlkYXRvciBpcyBub3QgY2FsbGVkIG9uIHRoaXMgcmVzb3VyY2UuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bGVzIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZWV4dCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgY2FzZSBzZW5zaXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdE5hdHVyZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byBmaWx0ZXIgb24gcHJvamVjdCBuYXR1cmVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIHByb2plY3QgbmF0dXJlIGlkLCBmb3IgZXhhbXBsZSAmcXVvdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZmlsZSBvciBmb2xkZXIgbmFtZS4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCB0aGF0IGlzIGl0IHN0YXJ0cyB3aXRoIGEgbGVhZGluZyBzbGFzaCAoJnF1b3Q7LyZxdW90OyksIG9yIGl0IGNhbiBiZSBhIHJlbGF0aXZlIG5hbWUuIEZvbGRlciBuYW1lcyBhcmUgc2VwYXJhdGVkIHdpdGggdGhlIGZvcndhcmQgc2xhc2ggKCZxdW90Oy8mcXVvdDspIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBuYW1lIGlzIG5vdCBjYXNlIHNlbnN0aXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gZmFsc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVHlwZSBvZiBuYW1lLCB0aGVyZSBhcmUgdGhyZWUgY2hvaWNlcy4gJmx0O3VsJmd0OyZsdDtsaSZndDtmb2xkZXIgLSBzcGVjaWZpZXMgYSBwcm9qZWN0IHJlbGF0aXZlIGZvbGRlciBuYW1lLiZsdDsvbGkmZ3Q7Jmx0O2xpJmd0O2ZpbGUgLSBhIHNpbXBsZSBmaWxlIG5hbWUgKGkuZS4gbm8gcGF0aCBpbmZvcm1hdGlvbikuJmx0Oy9saSZndDsmbHQ7bGkmZ3Q7ZnVsbCAtIGEgZnVsbHkgcXVhbGlmaWVkIChwcm9qZWN0IHJlbGF0aXZlKSBmaWxlIG5hbWUuJmx0Oy9saSZndDsmbHQ7L3VsJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm9sZGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZpbGUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVsZXMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgc2V0IG9mIHJ1bGVzIGZvciBkZXRlcm1pbmluZyBpZiBhIHJlc291cmNlIGlzIHBhc3NlZCB0byB0aGlzIHZhbGlkYXRvciBvciBub3QuIFRoZSBydWxlcyBhcmUgT1ImYXBvcztlZCB0b2dldGhlci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZWV4dCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3ROYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWNldCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmYWNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gZmlsdGVyIGJhc2VkIG9uIGNvbnRlbnQgdHlwZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjb250ZW50IHR5cGUgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhhY3RNYXRjaCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbnRlbnQgdHlwZSBuZWVkcyB0byBtYXRjaCBleGFjdGx5LiBTZXQgdG8gZmFsc2UgaWYgc3ViIHR5cGVzIGFyZSBjb25zaWRlcmVkIG1hdGNoZXMgYXMgd2VsbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWVzc2FnZUNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBVc2VkIHRvIGdyb3VwIHRvZ2V0aGVyIGEgc2V0IG9mIG1lc3NhZ2VzLCB3aGVyZSB0aGUgdXNlciBjYW4gY2hhbmdlIHRoZSBtZXNzYWdlIHNldmVyaXR5IG9mIGFsbCB0aGUgbWVzc2FnZXMgaW4gdGhlIGdyb3VwLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN1cHBvcnQgaW4gdGhlIEpEVCwgd2hlcmUgZm9yIGV4YW1wbGUgYSB1c2VyIGNhbiBzcGVjaWZ5IHdoZXRoZXIgdXNlZCBtZXRob2RzIHNob3VsZCBiZSBlcnJvcnMsIHdhcm5pbmdzIG9yIGlnbm9yZWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc2ltcGxlIGlkIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyB2YWxpZGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzaG9ydCwgb25lIGxpbmUgbGFiZWwgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyLCB0aGF0IGRlc2NyaWJlcyB0aGUgbWVzc2FnZSBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNldmVyaXR5Ij4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBzZXZlcml0eSBmb3IgdGhpcyBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImVycm9yIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaWdub3JlIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBXZWJUb29scyAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0OyEtLSBBIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHJlc291cmNlcyB0aGF0IGhhdmUgaHRtbCBvciBodG0gZmlsZSBleHRlbnNpb25zLiAtLSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciZxdW90OwotICAgICAgICAgaWQ9JnF1b3Q7VGVzdCZxdW90OyBuYW1lPSZxdW90OyVWYWxpZGF0b3IuTmFtZSZxdW90OyZndDsKLSAgICAgICZsdDt2YWxpZGF0b3IKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3QuVGVzdFZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICAgICZsdDtpbmNsdWRlJmd0OwotICAgICAgICAgICAgJmx0O3J1bGVzJmd0OwotICAgICAgICAgICAgICAgJmx0O2ZpbGVleHQgZXh0PSZxdW90O2h0bWwmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgJmx0O2ZpbGVleHQgZXh0PSZxdW90O2h0bSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3J1bGVzJmd0OwotICAgICAgICAgJmx0Oy9pbmNsdWRlJmd0OwotICAgICAgJmx0Oy92YWxpZGF0b3ImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQcm92aXNpb25hbCBBUEkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckRlbGVnYXRlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckRlbGVnYXRlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTVmODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3JEZWxlZ2F0ZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/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