Updated download dialog patch
artur <[email protected]> Tue, 14 Dec 2010 20:54:13 +0100
| Newsgroups | gmane.network.freenet.frost.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format. --------------070101010302050001010502 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Hi, I have reworked some of the code for the download dialog. The Dialog should now appear in all places. Plus I have added the functionality to rename files, add a prefix and some minor fixes. I hope you like it. Cheers artur PS: If you wondered why it took me so long to get the next update ready: I got injured during a sports accident (I do skydiving) and could not use my PC for quite some time. Still haven't regained my full flexibility in my right arm... In the same time I switched my employer and got some catchup to do there, and last but not least some other private stuff I had to spend time on. So I hope next year will be better, and I will be able to do some more regular work on Frost. --------------070101010302050001010502 Content-Type: text/plain; name="DownloadDialogNew.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DownloadDialogNew.patch" DQpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiAuDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpNb2RpZmllZDogc3Zu Omlnbm9yZQ0KICAgLSAuc2V0dGluZ3MKYnVpbGQKX291dF8KLmdpdAoNCiAgICsgLmdpdAou c2V0dGluZ3MKX291dF8KYnVpbGQKY29uZmlnCmRvd25sb2FkcwpleGVjCmZyb3N0MC5sb2cK bG9jYWxkYXRhCnN0b3JlCg0KDQpJbmRleDogc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9k b3dubG9hZC9Eb3dubG9hZE1hbmFnZXIuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJj ZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNYW5hZ2VyLmphdmEJKHJl dmlzaW9uIDMxOTcpDQorKysgc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9E b3dubG9hZE1hbmFnZXIuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTE0LDcgKzE0LDcgQEAN CiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNz IEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KKyAqLwogcGFja2FnZSBmcm9z dC5maWxlVHJhbnNmZXIuZG93bmxvYWQ7CiAKIGltcG9ydCBqYXZhLmlvLio7CkBAIC0zMyw3 ICszMyw4IEBADQogCiBwdWJsaWMgY2xhc3MgRG93bmxvYWRNYW5hZ2VyIGltcGxlbWVudHMg RXhpdFNhdmFibGUgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dl ciA9IExvZ2dlci5nZXRMb2dnZXIoRG93bmxvYWRNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7 CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dn ZXIoRG93bmxvYWRNYW5hZ2VyLmNsYXNzCisJCQkuZ2V0TmFtZSgpKTsKIAogCXByaXZhdGUg RG93bmxvYWRNb2RlbCBtb2RlbDsKIAlwcml2YXRlIERvd25sb2FkUGFuZWwgcGFuZWw7CkBA IC00OCw3ICs0OSw3IEBADQogCX0KIAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJv d3MgU3RvcmFnZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFBhbmVsKCk7CisJCWdldFBhbmVs KCk7CiAJCWdldE1vZGVsKCkuaW5pdGlhbGl6ZSgpOwogCX0KIApAQCAtNTYsODYgKzU3LDg5 IEBADQogCSAqIFN0YXJ0IGRvd25sb2FkIG5vdyAobWFudWFsbHkpLgogCSAqLwogCXB1Ymxp YyBib29sZWFuIHN0YXJ0RG93bmxvYWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVt KSB7Ci0JICAgIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5j ZU1hbmFnZXIoKSAhPSBudWxsICkgewotCSAgICAgICAgcmV0dXJuIEZpbGVUcmFuc2Zlck1h bmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpLnN0YXJ0RG93bmxvYWQoZGxJ dGVtKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHJldHVybiB0aWNrZXIuc3RhcnREb3du bG9hZChkbEl0ZW0pOwotCSAgICB9CisJCWlmIChGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3Qo KS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRmlsZVRy YW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkKKwkJCQkJLnN0 YXJ0RG93bmxvYWQoZGxJdGVtKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aWNrZXIuc3Rh cnREb3dubG9hZChkbEl0ZW0pOworCQl9CiAJfQogCiAJcHVibGljIHZvaWQgc3RhcnRUaWNr ZXIoKSB7Ci0gICAgICAgIGlmIChDb3JlLmlzRnJlZW5ldE9ubGluZSgpKSB7Ci0gICAgICAg ICAgICBnZXRUaWNrZXIoKS5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoQ29y ZS5pc0ZyZWVuZXRPbmxpbmUoKSkgeworCQkJZ2V0VGlja2VyKCkuc3RhcnQoKTsKKwkJfQor CX0KIAotICAgIHB1YmxpYyB2b2lkIGV4aXRTYXZlKCkgdGhyb3dzIFN0b3JhZ2VFeGNlcHRp b24gewotICAgICAgICBnZXRQYW5lbCgpLmdldFRhYmxlRm9ybWF0KCkuc2F2ZVRhYmxlTGF5 b3V0KCk7Ci0gICAgICAgIGdldE1vZGVsKCkuZXhpdFNhdmUoKTsKLSAgICB9CisJcHVibGlj IHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7CisJCWdldFBhbmVs KCkuZ2V0VGFibGVGb3JtYXQoKS5zYXZlVGFibGVMYXlvdXQoKTsKKwkJZ2V0TW9kZWwoKS5l eGl0U2F2ZSgpOworCX0KIAotICAgIHB1YmxpYyB2b2lkIGFkZFBhbmVsVG9NYWluRnJhbWUo ZmluYWwgTWFpbkZyYW1lIG1haW5GcmFtZSkgewotICAgICAgICBtYWluRnJhbWUuYWRkUGFu ZWwoIk1haW5GcmFtZS50YWJiZWRQYW5lLmRvd25sb2FkcyIsIGdldFBhbmVsKCkpOwotICAg IH0KKwlwdWJsaWMgdm9pZCBhZGRQYW5lbFRvTWFpbkZyYW1lKGZpbmFsIE1haW5GcmFtZSBt YWluRnJhbWUpIHsKKwkJbWFpbkZyYW1lLmFkZFBhbmVsKCJNYWluRnJhbWUudGFiYmVkUGFu ZS5kb3dubG9hZHMiLCBnZXRQYW5lbCgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDb3Vu dCBydW5uaW5nIGl0ZW1zIGluIG1vZGVsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVw ZGF0ZUZpbGVUcmFuc2ZlckluZm9ybWF0aW9uKGZpbmFsIEZpbGVUcmFuc2ZlckluZm9ybWF0 aW9uIGluZm9zKSB7Ci0gICAgICAgIGludCB3YWl0aW5nSXRlbXMgPSAwOwotICAgICAgICBp bnQgcnVubmluZ0l0ZW1zID0gMDsKLSAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtb2Rl bC5nZXRJdGVtQ291bnQoKTsgeCsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25s b2FkSXRlbSBkbEl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIG1vZGVsLmdldEl0ZW1BdCh4 KTsKLSAgICAgICAgICAgIGlmKCBkbEl0ZW0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAg ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0 U3RhdGUoKSAhPSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FCi0gICAgICAgICAgICAg ICAgICAgICYmIGRsSXRlbS5nZXRTdGF0ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRF X0ZBSUxFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3YWl0aW5nSXRlbXMr KzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0U3RhdGUoKSA9 PSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9QUk9HUkVTUykgewotICAgICAgICAgICAgICAg IHJ1bm5pbmdJdGVtcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlu Zm9zLnNldERvd25sb2Fkc1J1bm5pbmcocnVubmluZ0l0ZW1zKTsKLSAgICAgICAgaW5mb3Mu c2V0RG93bmxvYWRzV2FpdGluZyh3YWl0aW5nSXRlbXMpOwotICAgIH0KKwkvKioKKwkgKiBD b3VudCBydW5uaW5nIGl0ZW1zIGluIG1vZGVsLgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0 ZUZpbGVUcmFuc2ZlckluZm9ybWF0aW9uKAorCQkJZmluYWwgRmlsZVRyYW5zZmVySW5mb3Jt YXRpb24gaW5mb3MpIHsKKwkJaW50IHdhaXRpbmdJdGVtcyA9IDA7CisJCWludCBydW5uaW5n SXRlbXMgPSAwOworCQlmb3IgKGludCB4ID0gMDsgeCA8IG1vZGVsLmdldEl0ZW1Db3VudCgp OyB4KyspIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9zdERv d25sb2FkSXRlbSkgbW9kZWwKKwkJCQkJLmdldEl0ZW1BdCh4KTsKKwkJCWlmIChkbEl0ZW0g PT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGRsSXRlbS5nZXRTdGF0 ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUKKwkJCQkJJiYgZGxJdGVtLmdl dFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRkFJTEVEKSB7CisJCQkJd2Fp dGluZ0l0ZW1zKys7CisJCQl9CisJCQlpZiAoZGxJdGVtLmdldFN0YXRlKCkgPT0gRnJvc3RE b3dubG9hZEl0ZW0uU1RBVEVfUFJPR1JFU1MpIHsKKwkJCQlydW5uaW5nSXRlbXMrKzsKKwkJ CX0KKwkJfQorCQlpbmZvcy5zZXREb3dubG9hZHNSdW5uaW5nKHJ1bm5pbmdJdGVtcyk7CisJ CWluZm9zLnNldERvd25sb2Fkc1dhaXRpbmcod2FpdGluZ0l0ZW1zKTsKKwl9CiAKLSAgICAv KioKLSAgICAgKiBDaGVja3MgaWYgYSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkg aW4gbW9kZWwsIGFuZCByZXR1cm5zCi0gICAgICogYSBuZXcgbmFtZSBpZiBuZWVkZWQuCi0g ICAgICovCi0gICAgcHVibGljIFN0cmluZyBlbnN1cmVVbmlxdWVGaWxlbmFtZShmaW5hbCBT dHJpbmcgZmlsZW5hbWUpIHsKKwkvKioKKwkgKiBDaGVja3MgaWYgYSBmaWxlIHdpdGggdGhp cyBuYW1lIGlzIGFscmVhZHkgaW4gbW9kZWwsIGFuZCByZXR1cm5zIGEgbmV3CisJICogbmFt ZSBpZiBuZWVkZWQuCisJICovCisJcHVibGljIFN0cmluZyBlbnN1cmVVbmlxdWVGaWxlbmFt ZShmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKIAotICAgICAgICBTdHJpbmcgbmV3RmlsZW5h bWUgPSBmaWxlbmFtZTsKLSAgICAgICAgaW50IGNvdW50ID0gMjsKKwkJU3RyaW5nIG5ld0Zp bGVuYW1lID0gZmlsZW5hbWU7CisJCWludCBjb3VudCA9IDI7CiAKLSAgICAgICAgd2hpbGUo dHJ1ZSkgewotICAgICAgICAgICAgYm9vbGVhbiBsb29wQWdhaW4gPSBmYWxzZTsKLSAgICAg ICAgICAgIGZvcihpbnQgeD0wOyB4IDwgZ2V0TW9kZWwoKS5nZXRJdGVtQ291bnQoKTsgeCsr KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0g KEZyb3N0RG93bmxvYWRJdGVtKSBnZXRNb2RlbCgpLmdldEl0ZW1BdCh4KTsKLSAgICAgICAg ICAgICAgICBpZiggZGxJdGVtLmdldEZpbGVuYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdG aWxlbmFtZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvb3BBZ2FpbiA9IHRydWU7Ci0g ICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBkdXBsaWNhdGUgZmlsZW5hbWUKLSAg ICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGZpbGVuYW1lIGxpa2UgImZpbGVuYW1l XzIuZXh0IgotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zID0gZmlsZW5hbWUu bGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBvcyA+IDAgKSB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmVmb3JlRG90ID0gZmls ZW5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5h bCBTdHJpbmcgYWZ0ZXJEb3QgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKTsKLSAgICAgICAg ICAgICAgICAgICAgICAgIG5ld0ZpbGVuYW1lID0gYmVmb3JlRG90ICsgIl8iICsgKGNvdW50 KyspICsgYWZ0ZXJEb3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg ICAgICAgICAgICAgICAgICAvLyBubyAnLicgaW4gZmlsZW5hbWUKLSAgICAgICAgICAgICAg ICAgICAgICAgIG5ld0ZpbGVuYW1lID0gZmlsZW5hbWUgKyAiXyIgKyAoY291bnQrKyk7Ci0g ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9 Ci0gICAgICAgICAgICBpZiggIWxvb3BBZ2FpbiApIHsKLSAgICAgICAgICAgICAgICBicmVh azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3RmlsZW5h bWU7Ci0gICAgfQorCQl3aGlsZSAodHJ1ZSkgeworCQkJYm9vbGVhbiBsb29wQWdhaW4gPSBm YWxzZTsKKwkJCWZvciAoaW50IHggPSAwOyB4IDwgZ2V0TW9kZWwoKS5nZXRJdGVtQ291bnQo KTsgeCsrKSB7CisJCQkJZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gKEZyb3N0 RG93bmxvYWRJdGVtKSBnZXRNb2RlbCgpCisJCQkJCQkuZ2V0SXRlbUF0KHgpOworCQkJCWlm IChkbEl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld0ZpbGVuYW1lKSkg eworCQkJCQlsb29wQWdhaW4gPSB0cnVlOworCQkJCQkvLyB3ZSBoYXZlIGEgZHVwbGljYXRl IGZpbGVuYW1lCisJCQkJCS8vIGJ1aWxkIG5ldyBmaWxlbmFtZSBsaWtlICJmaWxlbmFtZV8y LmV4dCIKKwkJCQkJZmluYWwgaW50IHBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7 CisJCQkJCWlmIChwb3MgPiAwKSB7CisJCQkJCQlmaW5hbCBTdHJpbmcgYmVmb3JlRG90ID0g ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7CisJCQkJCQlmaW5hbCBTdHJpbmcgYWZ0ZXJE b3QgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKTsKKwkJCQkJCW5ld0ZpbGVuYW1lID0gYmVm b3JlRG90ICsgIl8iICsgKGNvdW50KyspICsgYWZ0ZXJEb3Q7CisJCQkJCX0gZWxzZSB7CisJ CQkJCQkvLyBubyAnLicgaW4gZmlsZW5hbWUKKwkJCQkJCW5ld0ZpbGVuYW1lID0gZmlsZW5h bWUgKyAiXyIgKyAoY291bnQrKyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIWxv b3BBZ2FpbikgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBuZXdGaWxlbmFt ZTsKKwl9CiAKIAlwdWJsaWMgRG93bmxvYWRQYW5lbCBnZXRQYW5lbCgpIHsKIAkJaWYgKHBh bmVsID09IG51bGwpIHsKQEAgLTE4Miw3ICsxODYsOSBAQA0KIAl9CiAKIAlwdWJsaWMgdm9p ZCBhZGRSZWNlbnREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZG93bmxvYWREaXIpIHsKLQkJ ZmluYWwgU3RyaW5nIGRlZmF1bHREbERpciA9IEZpbGVBY2Nlc3MuYXBwZW5kU2VwYXJhdG9y KENvcmUuZnJvc3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkRJUl9ET1dOTE9B RCkpOworCQlmaW5hbCBTdHJpbmcgZGVmYXVsdERsRGlyID0gRmlsZUFjY2VzcworCQkJCS5h cHBlbmRTZXBhcmF0b3IoQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCQkuZ2V0VmFsdWUoU2V0 dGluZ3NDbGFzcy5ESVJfRE9XTkxPQUQpKTsKIAkJZmluYWwgU3RyaW5nIGRsRGlyID0gRmls ZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZG93bmxvYWREaXIpOwogCQlmaW5hbCBMaXN0SXRl cmF0b3I8U3RyaW5nPiBpID0gcmVjZW50RG93bmxvYWREaXJzLmxpc3RJdGVyYXRvcigpOwog CQlib29sZWFuIGZvdW5kID0gZmFsc2U7CkBAIC0yMjAsNDA2ICsyMjYsNDMwIEBADQogCiAJ LyoqCiAJICogQWRkIGEgbmV3IGRvd25sb2FkIGl0ZW0gdG8gdGhlIGRvd25sb2FkIHRhYmxl IG1vZGVsLgotCSAqIEBwYXJhbSBrZXkgICAgICAgIGNvbXBsZXRlIGtleSBvZiBkb3dubG9h ZCBpdGVtCi0JICogQHBhcmFtIGZpbGVOYW1lICAgZmlsZSBuYW1lCisJICogCisJICogQHBh cmFtIGtleQorCSAqICAgICAgICAgICAgY29tcGxldGUga2V5IG9mIGRvd25sb2FkIGl0ZW0K KwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiAgICAgICAgICAgIGZpbGUgbmFtZQogCSAqLwot CXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9hZChmaW5hbCBTdHJpbmcg a2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFN0cmluZyBkbERpciwgZmluYWwg U3RyaW5nIHByZWZpeCkgewotCSAgICAvLyBUT0RPOiBlbmhhbmNlbWVudDogc2VhcmNoIGZv ciBrZXkgaW4gc2hhcmVkIGZpbGVzLCBtYXliZSBhZGQgYXMgc2hhcmVkIGZpbGUKLSAgICAg ICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gbmV3IEZyb3N0RG93bmxvYWRJ dGVtKGZpbGVOYW1lLCBrZXkpOworCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdE b3dubG9hZChmaW5hbCBTdHJpbmcga2V5LAorCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBm aW5hbCBTdHJpbmcgZGxEaXIsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwkJLy8gVE9ETzog ZW5oYW5jZW1lbnQ6IHNlYXJjaCBmb3Iga2V5IGluIHNoYXJlZCBmaWxlcywgbWF5YmUgYWRk IGFzCisJCS8vIHNoYXJlZCBmaWxlCisJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRl bSA9IG5ldyBGcm9zdERvd25sb2FkSXRlbShmaWxlTmFtZSwga2V5KTsKIAkJZGxJdGVtLnNl dERvd25sb2FkRGlyKGRsRGlyKTsKIAkJZGxJdGVtLnNldEZpbGVuYW1lUHJlZml4KHByZWZp eCk7Ci0gICAgICAgIG1vZGVsLmFkZERvd25sb2FkSXRlbShkbEl0ZW0pOyAvLyBmYWxzZSBp ZiBmaWxlIGlzIGFscmVhZHkgaW4gdGFibGUKKwkJbW9kZWwuYWRkRG93bmxvYWRJdGVtKGRs SXRlbSk7IC8vIGZhbHNlIGlmIGZpbGUgaXMgYWxyZWFkeSBpbiB0YWJsZQogCQlyZXR1cm4g ZGxJdGVtOwogCX0KIAotCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9h ZChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFN0cmlu ZyBkbERpcikgeworCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9hZChm aW5hbCBTdHJpbmcga2V5LAorCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBTdHJp bmcgZGxEaXIpIHsKIAkJcmV0dXJuIGFkZE5ld0Rvd25sb2FkKGtleSwgZmlsZU5hbWUsIGRs RGlyLCBudWxsKTsKIAl9CiAKLQlwdWJsaWMgRnJvc3REb3dubG9hZEl0ZW0gYWRkTmV3RG93 bmxvYWQoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7CisJcHVi bGljIEZyb3N0RG93bmxvYWRJdGVtIGFkZE5ld0Rvd25sb2FkKGZpbmFsIFN0cmluZyBrZXks CisJCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKIAkJcmV0dXJuIGFkZE5ld0Rvd25sb2Fk KGtleSwgZmlsZU5hbWUsIG51bGwsIG51bGwpOwogCX0KKwkKKwlwdWJsaWMgc3RhdGljIExp c3Q8RnJvc3REb3dubG9hZEl0ZW0+IHBhcnNlS2V5cyhmaW5hbCBTdHJpbmcgdGV4dCkgewor CQlMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBuZXcg TGlua2VkTGlzdDxGcm9zdERvd25sb2FkSXRlbT4oKTsKKwkJCisJCWZpbmFsIFN0cmluZ1td IGtleUxpc3QgPSB0ZXh0LnRyaW0oKS5zcGxpdCgiWztcbl0iKTsKKwkJaWYgKGtleUxpc3Qg PT0gbnVsbCB8fCBrZXlMaXN0Lmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gZnJvc3REb3du bG9hZEl0ZW1MaXN0OworCQl9CiAKLQlwdWJsaWMgdm9pZCBhZGRLZXlzKGZpbmFsIFN0cmlu ZyB0ZXh0LCBmaW5hbCBTdHJpbmcgZGxEaXIsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJ dHJ5IHsKLQkJCWZpbmFsIFN0cmluZyBrZXlzID0gdGV4dC50cmltKCk7CisJCWZvciAoZmlu YWwgU3RyaW5nIGVsZW1lbnQgOiBrZXlMaXN0KSB7CisJCQlTdHJpbmcga2V5ID0gZWxlbWVu dC50cmltKCk7CiAKLQkJCWZpbmFsIFN0cmluZ1tdIGtleUxpc3QgPSBrZXlzLnNwbGl0KCJb O1xuXSIpOwotCQkJaWYoIGtleUxpc3QgPT0gbnVsbCB8fCBrZXlMaXN0Lmxlbmd0aCA9PSAw ICkgewotCQkJCXJldHVybjsKKwkJCWlmIChrZXkubGVuZ3RoKCkgPCA1KSB7CisJCQkJY29u dGludWU7CiAJCQl9CiAKLQkJCWZvciggZmluYWwgU3RyaW5nIGVsZW1lbnQgOiBrZXlMaXN0 ICkgewotCQkJCVN0cmluZyBrZXkgPSBlbGVtZW50LnRyaW0oKTsKLQotCQkJCWlmKCBrZXku bGVuZ3RoKCkgPCA1ICkgewotCQkJCQljb250aW51ZTsKKwkJCS8vIG1heWJlIGNvbnZlcnQg aHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCisJCQlpZiAoa2V5LmluZGV4T2YoIiUiKSA+ IDApIHsKKwkJCQl0cnkgeworCQkJCQlrZXkgPSBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29k ZShrZXksICJVVEYtOCIpOworCQkJCX0gY2F0Y2ggKGZpbmFsIGphdmEuaW8uVW5zdXBwb3J0 ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworCQkJCQlsb2dnZXIubG9nKExldmVsLlNFVkVS RSwgIkRlY29kZSBvZiBIVE1MIGNvZGUgZmFpbGVkIiwgZXgpOwogCQkJCX0KKwkJCX0KIAot CQkJCS8vIG1heWJlIGNvbnZlcnQgaHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCi0JCQkJ aWYoIGtleS5pbmRleE9mKCIlIikgPiAwICkgewotCQkJCQl0cnkgewotCQkJCQkJa2V5ID0g amF2YS5uZXQuVVJMRGVjb2Rlci5kZWNvZGUoa2V5LCAiVVRGLTgiKTsKLQkJCQkJfSBjYXRj aCAoZmluYWwgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0J CQkJCQlsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIkRlY29kZSBvZiBIVE1MIGNvZGUgZmFp bGVkIiwgZXgpOwotCQkJCQl9CisJCQkvLyBmaW5kIGtleSB0eXBlIChjaGssc3NrLC4uLikK KwkJCWludCBwb3MgPSAtMTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgRnJlZW5ldEtleXMu Z2V0RnJlZW5ldEtleVR5cGVzKCkubGVuZ3RoOyBpKyspIHsKKwkJCQlmaW5hbCBTdHJpbmcg c3RyaW5nID0gRnJlZW5ldEtleXMuZ2V0RnJlZW5ldEtleVR5cGVzKClbaV07CisJCQkJcG9z ID0ga2V5LmluZGV4T2Yoc3RyaW5nKTsKKwkJCQlpZiAocG9zID49IDApIHsKKwkJCQkJYnJl YWs7CiAJCQkJfQorCQkJfQorCQkJaWYgKHBvcyA8IDApIHsKKwkJCQkvLyBubyB2YWxpZCBr ZXl0eXBlIGZvdW5kCisJCQkJY29udGludWU7CisJCQl9CiAKLQkJCQkvLyBmaW5kIGtleSB0 eXBlIChjaGssc3NrLC4uLikKLQkJCQlpbnQgcG9zID0gLTE7Ci0JCQkJZm9yKCBpbnQgaSA9 IDA7IGkgPCBGcmVlbmV0S2V5cy5nZXRGcmVlbmV0S2V5VHlwZXMoKS5sZW5ndGg7IGkrKyAp IHsKLQkJCQkJZmluYWwgU3RyaW5nIHN0cmluZyA9IEZyZWVuZXRLZXlzLmdldEZyZWVuZXRL ZXlUeXBlcygpW2ldOwotCQkJCQlwb3MgPSBrZXkuaW5kZXhPZihzdHJpbmcpOwotCQkJCQlp ZiggcG9zID49IDAgKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZigg cG9zIDwgMCApIHsKLQkJCQkJLy8gbm8gdmFsaWQga2V5dHlwZSBmb3VuZAotCQkJCQkvL3No b3dJbnZhbGlkS2V5RXJyb3JEaWFsb2coa2V5KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQor CQkJLy8gc3RyaXAgYWxsIGJlZm9yZSBrZXkgdHlwZQorCQkJaWYgKHBvcyA+IDApIHsKKwkJ CQlrZXkgPSBrZXkuc3Vic3RyaW5nKHBvcyk7CisJCQl9CiAKLQkJCQkvLyBzdHJpcCBhbGwg YmVmb3JlIGtleSB0eXBlCi0JCQkJaWYoIHBvcyA+IDAgKSB7Ci0JCQkJCWtleSA9IGtleS5z dWJzdHJpbmcocG9zKTsKLQkJCQl9CisJCQlpZiAoa2V5Lmxlbmd0aCgpIDwgNSkgeworCQkJ CS8vIGF0IGxlYXN0IHRoZSBTU0tAPyBpcyBuZWVkZWQKKwkJCQljb250aW51ZTsKKwkJCX0K IAotCQkJCWlmKCBrZXkubGVuZ3RoKCkgPCA1ICkgewotCQkJCQkvLyBhdCBsZWFzdCB0aGUg U1NLQD8gaXMgbmVlZGVkCi0JCQkJCS8vc2hvd0ludmFsaWRLZXlFcnJvckRpYWxvZyhrZXkp OwotCQkJCQljb250aW51ZTsKLQkJCQl9CisJCQkvLyB0YWtlIHRoZSBmaWxlbmFtZSBmcm9t IHRoZSBsYXN0IHBhcnQgb2YgdGhlIGtleQorCQkJU3RyaW5nIGZpbGVOYW1lOworCQkJZmlu YWwgaW50IHNlcEluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCIvIik7CisJCQlpZiAoc2VwSW5k ZXggPiAtMSkgeworCQkJCWZpbGVOYW1lID0ga2V5LnN1YnN0cmluZyhzZXBJbmRleCArIDEp OworCQkJfSBlbHNlIHsKKwkJCQkvLyBmYWxsYmFjazogdXNlIGtleSBhcyBmaWxlbmFtZQor CQkJCWZpbGVOYW1lID0ga2V5LnN1YnN0cmluZyg0KTsKKwkJCX0KIAotCQkJCS8vIHRha2Ug dGhlIGZpbGVuYW1lIGZyb20gdGhlIGxhc3QgcGFydCBvZiB0aGUga2V5Ci0JCQkJU3RyaW5n IGZpbGVOYW1lOwotCQkJCWZpbmFsIGludCBzZXBJbmRleCA9IGtleS5sYXN0SW5kZXhPZigi LyIpOwotCQkJCWlmICggc2VwSW5kZXggPiAtMSApIHsKLQkJCQkJZmlsZU5hbWUgPSBrZXku c3Vic3RyaW5nKHNlcEluZGV4ICsgMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZmFsbGJh Y2s6IHVzZSBrZXkgYXMgZmlsZW5hbWUKLQkJCQkJZmlsZU5hbWUgPSBrZXkuc3Vic3RyaW5n KDQpOwotCQkJCX0KKwkJCVN0cmluZyBjaGVja0tleSA9IGtleTsKKwkJCS8vIHJlbW92ZSBm aWxlbmFtZSBmcm9tIENISyBrZXkKKwkJCWlmIChrZXkuc3RhcnRzV2l0aCgiQ0hLQCIpICYm IGtleS5pbmRleE9mKCIvIikgPiAtMSkgeworCQkJCWNoZWNrS2V5ID0ga2V5LnN1YnN0cmlu ZygwLCBrZXkuaW5kZXhPZigiLyIpKTsKKwkJCX0KIAotCQkJCVN0cmluZyBjaGVja0tleSA9 IGtleTsKLQkJCQkvLyByZW1vdmUgZmlsZW5hbWUgZnJvbSBDSEsga2V5Ci0JCQkJaWYgKGtl eS5zdGFydHNXaXRoKCJDSEtAIikgJiYga2V5LmluZGV4T2YoIi8iKSA+IC0xICkgewotCQkJ CQljaGVja0tleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoIi8iKSk7Ci0JCQkJ fQorCQkJLy8gT24gMC43IHdlIHJlbWVtYmVyIHRoZSBmdWxsIHByb3ZpZGVkIGRvd25sb2Fk IHVyaSBhcyBrZXkuCisJCQkvLyBJZiB0aGUgbm9kZSByZXBvcnRzIGRvd25sb2FkIGZhaWxl ZCwgZXJyb3IgY29kZSAxMSBsYXRlciwKKwkJCS8vIHRoZW4gd2Ugc3RyaXAgdGhlIGZpbGVu YW1lCisJCQkvLyBmcm9tIHRoZSB1cmkgYW5kIGtlZXAgdHJ5aW5nIHdpdGggY2hrIG9ubHkK IAotCQkJCS8vIE9uIDAuNyB3ZSByZW1lbWJlciB0aGUgZnVsbCBwcm92aWRlZCBkb3dubG9h ZCB1cmkgYXMga2V5LgotCQkJCS8vIElmIHRoZSBub2RlIHJlcG9ydHMgZG93bmxvYWQgZmFp bGVkLCBlcnJvciBjb2RlIDExIGxhdGVyLCB0aGVuIHdlIHN0cmlwIHRoZSBmaWxlbmFtZQot CQkJCS8vIGZyb20gdGhlIHVyaSBhbmQga2VlcCB0cnlpbmcgd2l0aCBjaGsgb25seQorCQkJ Ly8gZmluYWxseSBjaGVjayBpZiB0aGUga2V5IGlzIHZhbGlkIGZvciB0aGlzIG5ldHdvcmsK KwkJCWlmICghRnJlZW5ldEtleXMuaXNWYWxpZEtleShjaGVja0tleSkpIHsKKwkJCQkvLyBz aG93SW52YWxpZEtleUVycm9yRGlhbG9nKGtleSk7CisJCQkJY29udGludWU7CisJCQl9CiAK LQkJCQkvLyBmaW5hbGx5IGNoZWNrIGlmIHRoZSBrZXkgaXMgdmFsaWQgZm9yIHRoaXMgbmV0 d29yawotCQkJCWlmKCAhRnJlZW5ldEtleXMuaXNWYWxpZEtleShjaGVja0tleSkgKSB7Ci0J CQkJCS8vc2hvd0ludmFsaWRLZXlFcnJvckRpYWxvZyhrZXkpOwotCQkJCQljb250aW51ZTsK LQkJCQl9Ci0KLQkJCQkvLyBhZGQgdmFsaWQga2V5IHRvIGRvd25sb2FkIHRhYmxlCi0JCQkJ ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gYWRkTmV3RG93bmxvYWQoa2V5LCBm aWxlTmFtZSwgZGxEaXIpOwotCi0JCQkJZGxJdGVtLnNldEZpbGVuYW1lUHJlZml4KHByZWZp eCk7Ci0KLQkJCQlmaW5hbCBGcm9zdE1lc3NhZ2VPYmplY3QgbXNnID0gTWFpbkZyYW1lLmdl dEluc3RhbmNlKCkuZ2V0TWVzc2FnZVBhbmVsKCkuZ2V0U2VsZWN0ZWRNZXNzYWdlKCk7Ci0J CQkJaWYgKG1zZyAhPSBudWxsICYmICFtc2cuaXNEdW1teSgpKSB7Ci0JCQkJCWRsSXRlbS5h c3NvY2lhdGVXaXRoRnJvc3RNZXNzYWdlT2JqZWN0KG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9 IGNhdGNoKGZpbmFsIFRocm93YWJsZSBleCkgewotCQkJbG9nZ2VyLmxvZyhMZXZlbC5TRVZF UkUsICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGV4KTsKLQkJCS8vc2hvd0ludmFsaWRLZXlF cnJvckRpYWxvZygiPz8/Iik7CisJCQkvLyBhZGQgdmFsaWQga2V5IHRvIGRvd25sb2FkIHRh YmxlCisJCQlmcm9zdERvd25sb2FkSXRlbUxpc3QuYWRkKCBuZXcgRnJvc3REb3dubG9hZEl0 ZW0oZmlsZU5hbWUsIGtleSkpOwogCQl9CisJCXJldHVybiBmcm9zdERvd25sb2FkSXRlbUxp c3Q7CiAJfQorCQogCi0JcHVibGljIHZvaWQgYWRkS2V5cyhmaW5hbCBTdHJpbmcgdGV4dCwg ZmluYWwgU3RyaW5nIGRsRGlyKSB7Ci0JCWFkZEtleXModGV4dCwgZGxEaXIsIG51bGwpOwot CX0KKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmll ZAorCSAqLworCXB1YmxpYyBib29sZWFuIG5vdGlmeURvd25sb2FkRmluaXNoZWQoZmluYWwg RnJvc3REb3dubG9hZEl0ZW0gZG93bmxvYWRJdGVtLAorCQkJZmluYWwgRmNwUmVzdWx0R2V0 IHJlc3VsdCwgZmluYWwgRmlsZSB0YXJnZXRGaWxlKSB7CiAKLQlwdWJsaWMgdm9pZCBhZGRL ZXlzKGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0JCWFkZEtleXModGV4dCwgbnVsbCwgbnVsbCk7 Ci0JfQorCQlmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5h bWUoKTsKKwkJZmluYWwgU3RyaW5nIGtleSA9IGRvd25sb2FkSXRlbS5nZXRLZXkoKTsKIAot ICAgIC8qKgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcmV0 cmllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5vdGlmeURvd25sb2FkRmluaXNo ZWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZG93bmxvYWRJdGVtLCBmaW5hbCBGY3BSZXN1 bHRHZXQgcmVzdWx0LCBmaW5hbCBGaWxlIHRhcmdldEZpbGUpIHsKKwkJYm9vbGVhbiByZXRy eUltbWVkaWF0ZWx5ID0gZmFsc2U7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1l ID0gZG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBr ZXkgPSBkb3dubG9hZEl0ZW0uZ2V0S2V5KCk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCBy ZXN1bHQuaXNTdWNjZXNzKCkgPT0gZmFsc2UpIHsKKwkJCS8vIGRvd25sb2FkIGZhaWxlZAog Ci0gICAgICAgIGJvb2xlYW4gcmV0cnlJbW1lZGlhdGVseSA9IGZhbHNlOworCQkJaWYgKHJl c3VsdCAhPSBudWxsKSB7CisJCQkJZG93bmxvYWRJdGVtLnNldEVycm9yQ29kZURlc2NyaXB0 aW9uKHJlc3VsdAorCQkJCQkJLmdldENvZGVEZXNjcmlwdGlvbigpKTsKKwkJCX0KIAotICAg ICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzU3VjY2VzcygpID09IGZhbHNl KSB7Ci0gICAgICAgICAgICAvLyBkb3dubG9hZCBmYWlsZWQKKwkJCWlmIChyZXN1bHQgIT0g bnVsbCAmJiByZXN1bHQuZ2V0UmV0dXJuQ29kZSgpID09IDUKKwkJCQkJJiYga2V5LnN0YXJ0 c1dpdGgoIkNIS0AiKSAmJiBrZXkuaW5kZXhPZigiLyIpID4gMCkgeworCQkJCS8vIDUgLSBB cmNoaXZlIGZhaWx1cmUKKwkJCQkvLyBub2RlIHRyaWVzIHRvIGFjY2VzcyB0aGUgZmlsZSBh cyBhIC56aXAgZmlsZSwgdHJ5IGRvd25sb2FkCisJCQkJLy8gYWdhaW4gd2l0aG91dCBhbnkg cGF0aAorCQkJCWZpbmFsIFN0cmluZyBuZXdLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5p bmRleE9mKCIvIikpOworCQkJCWRvd25sb2FkSXRlbS5zZXRLZXkobmV3S2V5KTsKKwkJCQlk b3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyk7 CisJCQkJZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1lKDApOworCQkJCWRv d25sb2FkSXRlbS5zZXRJbnRlcm5hbFJlbW92ZUV4cGVjdGVkKHRydWUpOworCQkJCXJldHJ5 SW1tZWRpYXRlbHkgPSB0cnVlOwogCi0gICAgICAgICAgICBpZiggcmVzdWx0ICE9IG51bGwg KSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEVycm9yQ29kZURlc2NyaXB0 aW9uKHJlc3VsdC5nZXRDb2RlRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICB9CisJCQkJ bG9nZ2VyLndhcm5pbmcoIlJlbW92ZWQgYWxsIHBhdGggbGV2ZWxzIGZyb20ga2V5OiAiICsg a2V5CisJCQkJCQkrICIgOyAiICsgbmV3S2V5KTsKIAotICAgICAgICAgICAgaWYoIHJlc3Vs dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZXR1cm5Db2Rl KCkgPT0gNQotICAgICAgICAgICAgICAgICAgICAmJiBrZXkuc3RhcnRzV2l0aCgiQ0hLQCIp Ci0gICAgICAgICAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCIvIikgPiAwICkKLSAgICAg ICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyA1IC0gQXJjaGl2ZSBmYWlsdXJlCi0gICAg ICAgICAgICAgICAgLy8gbm9kZSB0cmllcyB0byBhY2Nlc3MgdGhlIGZpbGUgYXMgYSAuemlw IGZpbGUsIHRyeSBkb3dubG9hZCBhZ2FpbiB3aXRob3V0IGFueSBwYXRoCi0gICAgICAgICAg ICAgICAgZmluYWwgU3RyaW5nIG5ld0tleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4 T2YoIi8iKSk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEtleShuZXdLZXkp OwotICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2Fk SXRlbS5TVEFURV9XQUlUSU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0 TGFzdERvd25sb2FkU3RvcFRpbWUoMCk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVt LnNldEludGVybmFsUmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0 cnlJbW1lZGlhdGVseSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsICYm IHJlc3VsdC5nZXRSZXR1cm5Db2RlKCkgPT0gMTEKKwkJCQkJJiYga2V5LnN0YXJ0c1dpdGgo IkNIS0AiKSAmJiBrZXkuaW5kZXhPZigiLyIpID4gMCkgeworCQkJCS8vIDExIC0gVGhlIFVS SSBoYXMgbW9yZSBtZXRhc3RyaW5ncyBhbmQgSSBjYW4ndCBkZWFsIHdpdGggdGhlbQorCQkJ CS8vIHJlbW92ZSBvbmUgcGF0aCBsZXZlbCBmcm9tIENISworCQkJCWZpbmFsIFN0cmluZyBu ZXdLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5sYXN0SW5kZXhPZigiLyIpKTsKKwkJCQlk b3dubG9hZEl0ZW0uc2V0S2V5KG5ld0tleSk7CisJCQkJZG93bmxvYWRJdGVtLnNldFN0YXRl KEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1dBSVRJTkcpOworCQkJCWRvd25sb2FkSXRlbS5z ZXRMYXN0RG93bmxvYWRTdG9wVGltZSgwKTsKKwkJCQlkb3dubG9hZEl0ZW0uc2V0SW50ZXJu YWxSZW1vdmVFeHBlY3RlZCh0cnVlKTsKKwkJCQlyZXRyeUltbWVkaWF0ZWx5ID0gdHJ1ZTsK IAotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJSZW1vdmVkIGFsbCBwYXRoIGxl dmVscyBmcm9tIGtleTogIitrZXkrIiA7ICIrbmV3S2V5KTsKKwkJCQlsb2dnZXIud2Fybmlu ZygiUmVtb3ZlZCBvbmUgcGF0aCBsZXZlbCBmcm9tIGtleTogIiArIGtleQorCQkJCQkJKyAi IDsgIiArIG5ld0tleSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiggcmVzdWx0ICE9IG51 bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0LmdldFJldHVybkNvZGUoKSA9PSAx MQotICAgICAgICAgICAgICAgICAgICAmJiBrZXkuc3RhcnRzV2l0aCgiQ0hLQCIpCi0gICAg ICAgICAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCIvIikgPiAwICkKLSAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAvLyAxMSAtIFRoZSBVUkkgaGFzIG1vcmUgbWV0YXN0cmlu Z3MgYW5kIEkgY2FuJ3QgZGVhbCB3aXRoIHRoZW0KLSAgICAgICAgICAgICAgICAvLyByZW1v dmUgb25lIHBhdGggbGV2ZWwgZnJvbSBDSEsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJp bmcgbmV3S2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoIi8iKSk7Ci0g ICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEtleShuZXdLZXkpOwotICAgICAgICAg ICAgICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9X QUlUSU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0TGFzdERvd25sb2Fk U3RvcFRpbWUoMCk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEludGVybmFs UmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0cnlJbW1lZGlhdGVs eSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5nZXRS ZXR1cm5Db2RlKCkgPT0gMjcKKwkJCQkJJiYgcmVzdWx0LmdldFJlZGlyZWN0VVJJKCkgIT0g bnVsbCkgeworCQkJCS8vIHBlcm1hbmVudCByZWRpcmVjdCwgdXNlIG5ldyB1cmkKKwkJCQlk b3dubG9hZEl0ZW0uc2V0S2V5KHJlc3VsdC5nZXRSZWRpcmVjdFVSSSgpKTsKKwkJCQlkb3du bG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyk7CisJ CQkJZG93bmxvYWRJdGVtLnNldEludGVybmFsUmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7CisJCQkJ cmV0cnlJbW1lZGlhdGVseSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fy bmluZygiUmVtb3ZlZCBvbmUgcGF0aCBsZXZlbCBmcm9tIGtleTogIitrZXkrIiA7ICIrbmV3 S2V5KTsKKwkJCQlsb2dnZXIud2FybmluZygiUmVkaXJlY3RlZCB0byBVUkk6ICIgKyByZXN1 bHQuZ2V0UmVkaXJlY3RVUkkoKSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiggcmVzdWx0 ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZXR1cm5D b2RlKCkgPT0gMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZWRp cmVjdFVSSSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8g cGVybWFuZW50IHJlZGlyZWN0LCB1c2UgbmV3IHVyaQotICAgICAgICAgICAgICAgIGRvd25s b2FkSXRlbS5zZXRLZXkocmVzdWx0LmdldFJlZGlyZWN0VVJJKCkpOwotICAgICAgICAgICAg ICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlU SU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0SW50ZXJuYWxSZW1vdmVF eHBlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXRyeUltbWVkaWF0ZWx5ID0gdHJ1 ZTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzRmF0YWwoKSkg eworCQkJCS8vIGZhdGFsLCBkb24ndCByZXRyeQorCQkJCS8vIGRvd25sb2FkSXRlbS5zZXRF bmFibGVkKEJvb2xlYW4uRkFMU0UpOyAvLyBrZWVwIGVuYWJsZWQgdG8KKwkJCQkvLyBhbGxv dyBzZW5kaW5nIG9mIHJlcXVlc3RzIGZvciBzaGFyZWQgZmlsZXMKKwkJCQlkb3dubG9hZEl0 ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRkFJTEVEKTsKKwkJCQlsb2dn ZXIud2FybmluZygiRklMRUROOiBEb3dubG9hZCBvZiAiICsgZmlsZW5hbWUKKwkJCQkJCSsg IiBmYWlsZWQgRkFUQUxMWS4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZG93bmxvYWRJdGVtLnNl dFJldHJpZXMoZG93bmxvYWRJdGVtLmdldFJldHJpZXMoKSArIDEpOwogCi0gICAgICAgICAg ICAgICAgbG9nZ2VyLndhcm5pbmcoIlJlZGlyZWN0ZWQgdG8gVVJJOiAiK3Jlc3VsdC5nZXRS ZWRpcmVjdFVSSSgpKTsKKwkJCQlsb2dnZXIud2FybmluZygiRklMRUROOiBEb3dubG9hZCBv ZiAiICsgZmlsZW5hbWUgKyAiIGZhaWxlZC4iKTsKKwkJCQkvLyBzZXQgbmV3IHN0YXRlIC0+ IGZhaWxlZCBvciB3YWl0aW5nIGZvciBhbm90aGVyIHRyeQorCQkJCWlmIChkb3dubG9hZEl0 ZW0uZ2V0UmV0cmllcygpID4gQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCQkuZ2V0SW50VmFs dWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9NQVhfUkVUUklFUykpIHsKKwkJCQkJLy8gZG93 bmxvYWRJdGVtLnNldEVuYWJsZWQoQm9vbGVhbi52YWx1ZU9mKGZhbHNlKSk7IC8vIGtlZXAK KwkJCQkJLy8gZW5hYmxlZCB0byBhbGxvdyBzZW5kaW5nIG9mIHJlcXVlc3RzIGZvciBzaGFy ZWQgZmlsZXMKKwkJCQkJZG93bmxvYWRJdGVtLnNldFN0YXRlKEZyb3N0RG93bmxvYWRJdGVt LlNUQVRFX0ZBSUxFRCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG93bmxvYWRJdGVtLnNldFN0 YXRlKEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1dBSVRJTkcpOworCQkJCX0KKwkJCX0KKwkJ fSBlbHNlIHsKIAotICAgICAgICAgICAgfSBlbHNlIGlmKCByZXN1bHQgIT0gbnVsbCAmJiBy ZXN1bHQuaXNGYXRhbCgpICkgewotICAgICAgICAgICAgICAgIC8vIGZhdGFsLCBkb24ndCBy ZXRyeQotLy8gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEVuYWJsZWQoQm9vbGVh bi5GQUxTRSk7ICAvLyBrZWVwIGVuYWJsZWQgdG8gYWxsb3cgc2VuZGluZyBvZiByZXF1ZXN0 cyBmb3Igc2hhcmVkIGZpbGVzCi0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldFN0 YXRlKEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0ZBSUxFRCk7Ci0gICAgICAgICAgICAgICAg bG9nZ2VyLndhcm5pbmcoIkZJTEVETjogRG93bmxvYWQgb2YgIiArIGZpbGVuYW1lICsgIiBm YWlsZWQgRkFUQUxMWS4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg ICAgZG93bmxvYWRJdGVtLnNldFJldHJpZXMoZG93bmxvYWRJdGVtLmdldFJldHJpZXMoKSAr IDEpOworCQkJbG9nZ2VyLmluZm8oIkZJTEVETjogRG93bmxvYWQgb2YgIiArIGZpbGVuYW1l ICsgIiB3YXMgc3VjY2Vzc2Z1bC4iKTsKIAotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJu aW5nKCJGSUxFRE46IERvd25sb2FkIG9mICIgKyBmaWxlbmFtZSArICIgZmFpbGVkLiIpOwot ICAgICAgICAgICAgICAgIC8vIHNldCBuZXcgc3RhdGUgLT4gZmFpbGVkIG9yIHdhaXRpbmcg Zm9yIGFub3RoZXIgdHJ5Ci0gICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkSXRlbS5nZXRS ZXRyaWVzKCkgPiBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0SW50VmFsdWUoU2V0dGluZ3NDbGFz cy5ET1dOTE9BRF9NQVhfUkVUUklFUykpIHsKLS8vICAgICAgICAgICAgICAgICAgICBkb3du bG9hZEl0ZW0uc2V0RW5hYmxlZChCb29sZWFuLnZhbHVlT2YoZmFsc2UpKTsgLy8ga2VlcCBl bmFibGVkIHRvIGFsbG93IHNlbmRpbmcgb2YgcmVxdWVzdHMgZm9yIHNoYXJlZCBmaWxlcwot ICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9h ZEl0ZW0uU1RBVEVfRkFJTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg ICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0u U1RBVEVfV0FJVElORyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg ICAgICB9IGVsc2UgeworCQkJLy8gZG93bmxvYWQgc3VjY2Vzc2Z1bAorCQkJZG93bmxvYWRJ dGVtLnNldEZpbGVTaXplKG5ldyBMb25nKHRhcmdldEZpbGUubGVuZ3RoKCkpKTsKKwkJCWRv d25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FKTsKKwkJ CWRvd25sb2FkSXRlbS5zZXRFbmFibGVkKEJvb2xlYW4udmFsdWVPZihmYWxzZSkpOwogCi0g ICAgICAgICAgICBsb2dnZXIuaW5mbygiRklMRUROOiBEb3dubG9hZCBvZiAiICsgZmlsZW5h bWUgKyAiIHdhcyBzdWNjZXNzZnVsLiIpOworCQkJZG93bmxvYWRJdGVtLnNldERvd25sb2Fk RmluaXNoZWRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKIAotICAgICAgICAg ICAgLy8gZG93bmxvYWQgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNl dEZpbGVTaXplKG5ldyBMb25nKHRhcmdldEZpbGUubGVuZ3RoKCkpKTsKLSAgICAgICAgICAg IGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FKTsK LSAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRFbmFibGVkKEJvb2xlYW4udmFsdWVPZihm YWxzZSkpOworCQkJLy8gdXBkYXRlIGxhc3REb3dubG9hZGVkIHRpbWUgaW4gZmlsZWxpc3QK KwkJCWlmIChkb3dubG9hZEl0ZW0uaXNTaGFyZWRGaWxlKCkpIHsKKwkJCQlGaWxlTGlzdFN0 b3JhZ2UuaW5zdCgpCisJCQkJCQkudXBkYXRlRnJvc3RGaWxlTGlzdEZpbGVPYmplY3RBZnRl ckRvd25sb2FkKAorCQkJCQkJCQlkb3dubG9hZEl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0 KCkuZ2V0U2hhKCksCisJCQkJCQkJCVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJ CX0KIAotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldERvd25sb2FkRmluaXNoZWRUaW1l KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJCS8vIG1heWJlIHRyYWNrIGRvd25s b2FkCisJCQlpZiAoQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCS5nZXRCb29sVmFsdWUoU2V0 dGluZ3NDbGFzcy5UUkFDS19ET1dOTE9BRFNfRU5BQkxFRCkKKwkJCQkJJiYgIWRvd25sb2Fk SXRlbS5pc1RyYWNrZWQoKSkgeworCQkJCVRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFj a0Rvd25sb2FkS2V5c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UKKwkJCQkJ CS5pbnN0KCk7CisJCQkJdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLnN0b3JlSXRlbShuZXcg VHJhY2tEb3dubG9hZEtleXMoCisJCQkJCQlkb3dubG9hZEl0ZW0uZ2V0S2V5KCksIGRvd25s b2FkSXRlbS5nZXRGaWxlbmFtZSgpLAorCQkJCQkJZG93bmxvYWRJdGVtLmdldEFzc29jaWF0 ZWRCb2FyZE5hbWUoKSwgZG93bmxvYWRJdGVtCisJCQkJCQkJCS5nZXRGaWxlU2l6ZSgpLCBk b3dubG9hZEl0ZW0KKwkJCQkJCQkJLmdldERvd25sb2FkRmluaXNoZWRNaWxsaXMoKSkpOwor CQkJCWRvd25sb2FkSXRlbS5zZXRUcmFja2VkKHRydWUpOworCQkJfQogCi0gICAgICAgICAg ICAvLyB1cGRhdGUgbGFzdERvd25sb2FkZWQgdGltZSBpbiBmaWxlbGlzdAotICAgICAgICAg ICAgaWYoIGRvd25sb2FkSXRlbS5pc1NoYXJlZEZpbGUoKSApIHsKLSAgICAgICAgICAgICAg ICBGaWxlTGlzdFN0b3JhZ2UuaW5zdCgpLnVwZGF0ZUZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0 QWZ0ZXJEb3dubG9hZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5n ZXRGaWxlTGlzdEZpbGVPYmplY3QoKS5nZXRTaGEoKSwKLSAgICAgICAgICAgICAgICAgICAg ICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICk7Ci0gICAgICAgICAgICB9Ci0gICAg ICAgICAgICAKLSAgICAgICAgICAgIC8vIG1heWJlIHRyYWNrIGRvd25sb2FkCi0gICAgICAg ICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNz LlRSQUNLX0RPV05MT0FEU19FTkFCTEVEKSAmJiAhZG93bmxvYWRJdGVtLmlzVHJhY2tlZCgp ICkgewotICAgICAgICAgICAgICAgIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFja0Rv d25sb2FkS2V5c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuaW5zdCgpOwot ICAgICAgICAgICAgICAgIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zdG9yZUl0ZW0oIAot ICAgICAgICAgICAgICAgICAgICBuZXcgVHJhY2tEb3dubG9hZEtleXMoIGRvd25sb2FkSXRl bS5nZXRLZXkoKSwgZG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCksIGRvd25sb2FkSXRlbS5n ZXRBc3NvY2lhdGVkQm9hcmROYW1lKCksIGRvd25sb2FkSXRlbS5nZXRGaWxlU2l6ZSgpLCBk b3dubG9hZEl0ZW0uZ2V0RG93bmxvYWRGaW5pc2hlZE1pbGxpcygpICkKLSAgICAgICAgICAg ICAgICApOwotICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRUcmFja2VkKHRydWUp OwotICAgICAgICAgICAgfQorCQkJLy8gbWF5YmUgbG9nIHN1Y2Nlc3NmdWwgZG93bmxvYWQg dG8gZmlsZSBsb2NhbGRhdGEvZG93bmxvYWRzLnR4dAorCQkJaWYgKENvcmUuZnJvc3RTZXR0 aW5ncworCQkJCQkuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3MuTE9HX0RPV05MT0FEU19F TkFCTEVEKQorCQkJCQkmJiAhZG93bmxvYWRJdGVtLmlzTG9nZ2VkVG9GaWxlKCkpIHsKKwkJ CQlmaW5hbCBTdHJpbmcgbGluZSA9IGRvd25sb2FkSXRlbS5nZXRLZXkoKSArICIvIgorCQkJ CQkJKyBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWUoKTsKKwkJCQlmaW5hbCBTdHJpbmcgZmls ZU5hbWUgPSBDb3JlLmZyb3N0U2V0dGluZ3MKKwkJCQkJCS5nZXRWYWx1ZShTZXR0aW5nc0Ns YXNzLkRJUl9MT0NBTERBVEEpCisJCQkJCQkrICJGcm9zdC1Eb3dubG9hZHMubG9nIjsKKwkJ CQlmaW5hbCBGaWxlIHRhcmdldExvZ0ZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisJCQkJ RmlsZUFjY2Vzcy5hcHBlbmRMaW5lVG9UZXh0ZmlsZSh0YXJnZXRMb2dGaWxlLCBsaW5lKTsK KwkJCQlkb3dubG9hZEl0ZW0uc2V0TG9nZ2VkVG9GaWxlKHRydWUpOworCQkJfQogCi0gICAg ICAgICAgICAvLyBtYXliZSBsb2cgc3VjY2Vzc2Z1bCBkb3dubG9hZCB0byBmaWxlIGxvY2Fs ZGF0YS9kb3dubG9hZHMudHh0Ci0gICAgICAgICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdz LmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkxPR19ET1dOTE9BRFNfRU5BQkxFRCkgJiYg IWRvd25sb2FkSXRlbS5pc0xvZ2dlZFRvRmlsZSgpICkgewotICAgICAgICAgICAgICAgIGZp bmFsIFN0cmluZyBsaW5lID0gZG93bmxvYWRJdGVtLmdldEtleSgpICsgIi8iICsgZG93bmxv YWRJdGVtLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZp bGVOYW1lID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElS X0xPQ0FMREFUQSkgKyAiRnJvc3QtRG93bmxvYWRzLmxvZyI7Ci0gICAgICAgICAgICAgICAg ZmluYWwgRmlsZSB0YXJnZXRMb2dGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotICAgICAg ICAgICAgICAgIEZpbGVBY2Nlc3MuYXBwZW5kTGluZVRvVGV4dGZpbGUodGFyZ2V0TG9nRmls ZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldExvZ2dlZFRvRmls ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KKwkJCWZpbmFsIFN0cmluZyBleGVjUHJvZyA9IENv cmUuZnJvc3RTZXR0aW5ncworCQkJCQkuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09O X0RPV05MT0FEKTsKKwkJCWlmIChleGVjUHJvZyAhPSBudWxsICYmIGV4ZWNQcm9nLmxlbmd0 aCgpID4gMAorCQkJCQkmJiAhZG93bmxvYWRJdGVtLmlzRXh0ZXJuYWwoKQorCQkJCQkmJiAh ZG93bmxvYWRJdGVtLmlzQ29tcGxldGlvblByb2dSdW4oKSkgeworCQkJCWZpbmFsIEZpbGUg ZGlyID0gbmV3IEZpbGUoZG93bmxvYWRJdGVtLmdldERvd25sb2FkRGlyKCkpOworCQkJCWZp bmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkRW52ID0gU3lzdGVtLmdldGVudigpOworCQkJ CWZpbmFsIFN0cmluZ1tdIG5ld0VudiA9IG5ldyBTdHJpbmdbb2xkRW52LnNpemUoKSArIDVd OworCQkJCWZpbmFsIFN0cmluZyBhcmdzW10gPSBuZXcgU3RyaW5nWzZdOworCQkJCWludCBp OwogCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhlY1Byb2cgPSBDb3JlLmZyb3N0U2V0 dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09OX0RPV05MT0FEKTsKLSAgICAg ICAgICAgIGlmKCBleGVjUHJvZyAhPSBudWxsICYmIGV4ZWNQcm9nLmxlbmd0aCgpID4gMCAm JiAhZG93bmxvYWRJdGVtLmlzRXh0ZXJuYWwoKSAmJiAhZG93bmxvYWRJdGVtLmlzQ29tcGxl dGlvblByb2dSdW4oKSApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5l dyBGaWxlKGRvd25sb2FkSXRlbS5nZXREb3dubG9hZERpcigpKTsKLSAgICAgICAgICAgICAg ICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZEVudiA9IFN5c3RlbS5nZXRlbnYoKTsK LSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuZXdFbnYgPSBuZXcgU3RyaW5nW29s ZEVudi5zaXplKCkgKyA1XTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnc1td ID0gbmV3IFN0cmluZ1s2XTsKLSAgICAgICAgICAgICAgICBpbnQgaTsKKwkJCQlhcmdzWzBd ID0gZXhlY1Byb2c7CisJCQkJYXJnc1sxXSA9IGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgp OworCQkJCWFyZ3NbMl0gPSBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWVQcmVmaXgoKTsKKwkJ CQlhcmdzWzNdID0gZG93bmxvYWRJdGVtLmdldEtleSgpOworCQkJCWFyZ3NbNF0gPSBkb3du bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOworCQkJCWFyZ3NbNV0gPSBkb3du bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZE1lc3NhZ2VJZCgpOwogCi0gICAgICAgICAgICAgICAg YXJnc1swXSA9IGV4ZWNQcm9nOwotICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBkb3dubG9h ZEl0ZW0uZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgICAgICAgICBhcmdzWzJdID0gZG93bmxv YWRJdGVtLmdldEZpbGVuYW1lUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgYXJnc1szXSA9 IGRvd25sb2FkSXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBhcmdzWzRdID0gZG93 bmxvYWRJdGVtLmdldEFzc29jaWF0ZWRCb2FyZE5hbWUoKTsKLSAgICAgICAgICAgICAgICBh cmdzWzVdID0gZG93bmxvYWRJdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKTsKKwkJCQlm b3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoYXJnc1tpXSA9 PSBudWxsKSB7CisJCQkJCQlhcmdzW2ldID0gIiI7CisJCQkJCX0KKwkJCQl9CiAKLSAgICAg ICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyApIHsKLSAgICAg ICAgICAgICAgICAgICAgaWYoIGFyZ3NbaV0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAg ICAgICAgICAgIGFyZ3NbaV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg ICAgICAgICAgIH0KKwkJCQlpID0gMDsKKwkJCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJp bmcsIFN0cmluZz4gZW50cnkgOiBvbGRFbnYuZW50cnlTZXQoKSkgeworCQkJCQluZXdFbnZb aSsrXSA9IGVudHJ5LmdldEtleSgpICsgIj0iICsgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQl9 CisJCQkJbmV3RW52W2krK10gPSAiRlJPU1RfRklMRU5BTUU9IiArIGRvd25sb2FkSXRlbS5n ZXRGaWxlbmFtZSgpOworCQkJCW5ld0VudltpKytdID0gIkZST1NUX0ZJTEVOQU1FX1BSRUZJ WD0iCisJCQkJCQkrIGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZVByZWZpeCgpOworCQkJCW5l d0VudltpKytdID0gIkZST1NUX0tFWT0iICsgZG93bmxvYWRJdGVtLmdldEtleSgpOworCQkJ CW5ld0VudltpKytdID0gIkZST1NUX0FTU09DX0JPQVJEX05BTUU9IgorCQkJCQkJKyBkb3du bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOworCQkJCW5ld0VudltpKytdID0g IkZST1NUX0FTU09DX01TR19JRD0iCisJCQkJCQkrIGRvd25sb2FkSXRlbS5nZXRBc3NvY2lh dGVkTWVzc2FnZUlkKCk7CiAKLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAg ICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBvbGRF bnYuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXdFbnZbaSsrXSA9IGVu dHJ5LmdldEtleSgpICsgIj0iICsgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgbmV3RW52W2krK10gPSAiRlJPU1RfRklMRU5BTUU9IiAr IGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgIG5ld0Vudltp KytdID0gIkZST1NUX0ZJTEVOQU1FX1BSRUZJWD0iICsgZG93bmxvYWRJdGVtLmdldEZpbGVu YW1lUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgbmV3RW52W2krK10gPSAiRlJPU1RfS0VZ PSIgKyBkb3dubG9hZEl0ZW0uZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgbmV3RW52W2kr K10gPSAiRlJPU1RfQVNTT0NfQk9BUkRfTkFNRT0iICsgZG93bmxvYWRJdGVtLmdldEFzc29j aWF0ZWRCb2FyZE5hbWUoKTsKLSAgICAgICAgICAgICAgICBuZXdFbnZbaSsrXSA9ICJGUk9T VF9BU1NPQ19NU0dfSUQ9IiArIGRvd25sb2FkSXRlbS5nZXRBc3NvY2lhdGVkTWVzc2FnZUlk KCk7CisJCQkJdHJ5IHsKKwkJCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhhcmdzLCBu ZXdFbnYsIGRpcik7CisJCQkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJ U3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZXhlYyAiICsgZXhlY1Byb2cgKyAiOiAi CisJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfQogCi0gICAgICAgICAg ICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCku ZXhlYyhhcmdzLCBuZXdFbnYsIGRpcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmlu YWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmlu dGxuKCJDb3VsZCBub3QgZXhlYyAiICsgZXhlY1Byb2cgKyAiOiAiICsgZS5nZXRNZXNzYWdl KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKwkJCWRvd25sb2FkSXRl bS5zZXRDb21wbGV0aW9uUHJvZ1J1bih0cnVlKTsKIAotICAgICAgICAgICAgZG93bmxvYWRJ dGVtLnNldENvbXBsZXRpb25Qcm9nUnVuKHRydWUpOworCQkJLy8gbWF5YmUgcmVtb3ZlIGZp bmlzaGVkIGRvd25sb2FkIGltbWVkaWF0ZWx5CisJCQlpZiAoQ29yZS5mcm9zdFNldHRpbmdz CisJCQkJCS5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1PVkVfRklO SVNIRUQpKSB7CisJCQkJRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRN YW5hZ2VyKCkuZ2V0TW9kZWwoKQorCQkJCQkJLnJlbW92ZUZpbmlzaGVkRG93bmxvYWRzKCk7 CisJCQl9CisJCX0KIAotICAgICAgICAgICAgLy8gbWF5YmUgcmVtb3ZlIGZpbmlzaGVkIGRv d25sb2FkIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdz LmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCkg KSB7Ci0gICAgICAgICAgICAgICAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93 bmxvYWRNYW5hZ2VyKCkuZ2V0TW9kZWwoKS5yZW1vdmVGaW5pc2hlZERvd25sb2FkcygpOwot ICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmIChyZXRyeUltbWVkaWF0ZWx5KSB7CisJ CQlkb3dubG9hZEl0ZW0uc2V0TGFzdERvd25sb2FkU3RvcFRpbWUoLTEpOworCQl9IGVsc2Ug eworCQkJZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1lKFN5c3RlbS5jdXJy ZW50VGltZU1pbGxpcygpKTsKKwkJfQogCi0gICAgICAgIGlmKCByZXRyeUltbWVkaWF0ZWx5 ICkgewotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1l KC0xKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRM YXN0RG93bmxvYWRTdG9wVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAg ICAgIH0KKwkJcmV0dXJuIHJldHJ5SW1tZWRpYXRlbHk7CisJfQogCi0gICAgICAgIHJldHVy biByZXRyeUltbWVkaWF0ZWx5OwotICAgIH0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVj a2VkIikKKwlwdWJsaWMgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4gZ2V0RG93bmxvYWRJdGVt TGlzdCgpIHsKKwkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0SXRlbXMoKTsKKwl9CiAKLSAgICBA U3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdDxGcm9zdERv d25sb2FkSXRlbT4gZ2V0RG93bmxvYWRJdGVtTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGdl dE1vZGVsKCkuZ2V0SXRlbXMoKTsKLSAgICB9CisJLyoqCisJICogQ2hvb3NlcyBuZXh0IGRv d25sb2FkIGl0ZW0gdG8gc3RhcnQgZnJvbSBkb3dubG9hZCB0YWJsZS4KKwkgKiAKKwkgKiBA cmV0dXJuIHRoZSBuZXh0IGRvd25sb2FkIGl0ZW0gdG8gc3RhcnQgZG93bmxvYWRpbmcgb3Ig bnVsbCBpZiBhIHN1aXRhYmxlCisJICogICAgICAgICBvbmUgd2FzIG5vdCBmb3VuZC4KKwkg Ki8KKwlwdWJsaWMgRnJvc3REb3dubG9hZEl0ZW0gc2VsZWN0TmV4dERvd25sb2FkSXRlbSgp IHsKIAotICAgIC8qKgotICAgICAqIENob29zZXMgbmV4dCBkb3dubG9hZCBpdGVtIHRvIHN0 YXJ0IGZyb20gZG93bmxvYWQgdGFibGUuCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBkb3du bG9hZCBpdGVtIHRvIHN0YXJ0IGRvd25sb2FkaW5nIG9yIG51bGwgaWYgYSBzdWl0YWJsZQot ICAgICAqICAgICAgICAgIG9uZSB3YXMgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1Ymxp YyBGcm9zdERvd25sb2FkSXRlbSBzZWxlY3ROZXh0RG93bmxvYWRJdGVtKCkgeworCQkvLyBn ZXQgdGhlIGl0ZW0gd2l0aCBzdGF0ZSAiV2FpdGluZyIKKwkJZmluYWwgQXJyYXlMaXN0PEZy b3N0RG93bmxvYWRJdGVtPiB3YWl0aW5nSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEZyb3N0RG93 bmxvYWRJdGVtPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsLmdldEl0ZW1Db3Vu dCgpOyBpKyspIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9z dERvd25sb2FkSXRlbSkgbW9kZWwKKwkJCQkJLmdldEl0ZW1BdChpKTsKKwkJCWZpbmFsIGJv b2xlYW4gaXRlbUlzRW5hYmxlZCA9IChkbEl0ZW0uaXNFbmFibGVkKCkgPT0gbnVsbCA/IHRy dWUKKwkJCQkJOiBkbEl0ZW0uaXNFbmFibGVkKCkuYm9vbGVhblZhbHVlKCkpOworCQkJaWYg KCFpdGVtSXNFbmFibGVkKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZGxJdGVt LmlzRXh0ZXJuYWwoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGRsSXRlbS5n ZXRLZXkoKSA9PSBudWxsKSB7CisJCQkJLy8gc3RpbGwgbm8ga2V5LCB3YWl0CisJCQkJY29u dGludWU7CisJCQl9CiAKLSAgICAgICAgLy8gZ2V0IHRoZSBpdGVtIHdpdGggc3RhdGUgIldh aXRpbmciCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxGcm9zdERvd25sb2FkSXRlbT4gd2Fp dGluZ0l0ZW1zID0gbmV3IEFycmF5TGlzdDxGcm9zdERvd25sb2FkSXRlbT4oKTsKLSAgICAg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0g ICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBkbEl0ZW0gPSAoRnJvc3REb3du bG9hZEl0ZW0pIG1vZGVsLmdldEl0ZW1BdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xl YW4gaXRlbUlzRW5hYmxlZCA9IChkbEl0ZW0uaXNFbmFibGVkKCk9PW51bGw/dHJ1ZTpkbEl0 ZW0uaXNFbmFibGVkKCkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgaWYoICFpdGVt SXNFbmFibGVkICkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg fQotICAgICAgICAgICAgaWYoIGRsSXRlbS5pc0V4dGVybmFsKCkgKSB7Ci0gICAgICAgICAg ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggZGxJdGVt LmdldEtleSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RpbGwgbm8ga2V5 LCB3YWl0Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisJCQlp ZiAoZGxJdGVtLmdldFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElO RykgeworCQkJCWNvbnRpbnVlOworCQkJfQogCi0gICAgICAgICAgICBpZiggZGxJdGVtLmdl dFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyApIHsKLSAgICAg ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKwkJCS8vIGNoZWNrIGlmIHdh aXR0aW1lIGlzIGV4cGlyZWQKKwkJCWZpbmFsIGxvbmcgd2FpdHRpbWVNaWxsaXMgPSBDb3Jl LmZyb3N0U2V0dGluZ3MKKwkJCQkJLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRE9XTkxP QURfV0FJVFRJTUUpICogNjBMICogMTAwMEw7CisJCQkvLyBtaW4tPm1pbGxpc2VjCisJCQlp ZiAoZGxJdGVtLmdldExhc3REb3dubG9hZFN0b3BUaW1lKCkgPT0gMCAvLyBuZXZlciBzdGFy dGVkCisJCQkJCXx8IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGRsSXRlbQorCQkJ CQkJCS5nZXRMYXN0RG93bmxvYWRTdG9wVGltZSgpKSA+IHdhaXR0aW1lTWlsbGlzKSB7CisJ CQkJd2FpdGluZ0l0ZW1zLmFkZChkbEl0ZW0pOworCQkJfQorCQl9CiAKLSAgICAgICAgICAg IC8vIGNoZWNrIGlmIHdhaXR0aW1lIGlzIGV4cGlyZWQKLSAgICAgICAgICAgIGZpbmFsIGxv bmcgd2FpdHRpbWVNaWxsaXMgPSBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0SW50VmFsdWUoU2V0 dGluZ3NDbGFzcy5ET1dOTE9BRF9XQUlUVElNRSkgKiA2MEwgKiAxMDAwTDsKLSAgICAgICAg ICAgIC8vIG1pbi0+bWlsbGlzZWMKLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0TGFzdERv d25sb2FkU3RvcFRpbWUoKSA9PSAwIC8vIG5ldmVyIHN0YXJ0ZWQKLSAgICAgICAgICAgICAg ICB8fCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkbEl0ZW0uZ2V0TGFzdERvd25s b2FkU3RvcFRpbWUoKSkgPiB3YWl0dGltZU1pbGxpcykKLSAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICB3YWl0aW5nSXRlbXMuYWRkKGRsSXRlbSk7Ci0gICAgICAgICAgICB9Ci0g ICAgICAgIH0KKwkJaWYgKHdhaXRpbmdJdGVtcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJu IG51bGw7CisJCX0KIAotICAgICAgICBpZiAod2FpdGluZ0l0ZW1zLnNpemUoKSA9PSAwKSB7 Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorCQlpZiAod2FpdGluZ0l0 ZW1zLnNpemUoKSA+IDEpIHsgLy8gcGVyZm9ybWFuY2UgaXNzdWVzCisJCQlDb2xsZWN0aW9u cy5zb3J0KHdhaXRpbmdJdGVtcywgbmV4dEl0ZW1DbXApOworCQl9CisJCXJldHVybiB3YWl0 aW5nSXRlbXMuZ2V0KDApOworCX0KIAotICAgICAgICBpZiAod2FpdGluZ0l0ZW1zLnNpemUo KSA+IDEpIHsgLy8gcGVyZm9ybWFuY2UgaXNzdWVzCi0gICAgICAgICAgICBDb2xsZWN0aW9u cy5zb3J0KHdhaXRpbmdJdGVtcywgbmV4dEl0ZW1DbXApOwotICAgICAgICB9Ci0gICAgICAg IHJldHVybiB3YWl0aW5nSXRlbXMuZ2V0KDApOwotICAgIH0KKwlwdWJsaWMgdm9pZCBub3Rp ZnlEb3dubG9hZEl0ZW1FbmFibGVkU3RhdGVDaGFuZ2VkKAorCQkJZmluYWwgRnJvc3REb3du bG9hZEl0ZW0gZGxJdGVtKSB7CisJCS8vIGZvciBwZXJzaXN0ZW50IGl0ZW1zLCBzZXQgcHJp b3JpdHkgdG8gNiAocGF1c2UpIHdoZW4gZGlzYWJsZWQ7IGFuZCB0bworCQkvLyBjb25maWd1 cmVkIGRlZmF1bHQgaWYgZW5hYmxlZAorCQlpZiAoRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0 KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9 CisJCWlmIChkbEl0ZW0uaXNFeHRlcm5hbCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYg KGRsSXRlbS5nZXRTdGF0ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1BST0dSRVNT KSB7CisJCQkvLyBub3QgcnVubmluZywgbm90IGluIHF1ZXVlCisJCQlyZXR1cm47CisJCX0K KwkJZmluYWwgYm9vbGVhbiBpdGVtSXNFbmFibGVkID0gKGRsSXRlbS5pc0VuYWJsZWQoKSA9 PSBudWxsID8gdHJ1ZQorCQkJCTogZGxJdGVtLmlzRW5hYmxlZCgpLmJvb2xlYW5WYWx1ZSgp KTsKKwkJaWYgKGl0ZW1Jc0VuYWJsZWQpIHsKKwkJCS8vIGl0ZW0gaXMgbm93IGVuYWJsZWQK KwkJCWZpbmFsIGludCBwcmlvID0gQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCS5nZXRJbnRW YWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQpOwor CQkJRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkK KwkJCQkJLmNoYW5nZUl0ZW1Qcmlvcml0ZXMobmV3IE1vZGVsSXRlbVtdIHsgZGxJdGVtIH0s IHByaW8pOworCQl9IGVsc2UgeworCQkJLy8gaXRlbSBpcyBub3cgZGlzYWJsZWQKKwkJCUZp bGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpCisJCQkJ CS5jaGFuZ2VJdGVtUHJpb3JpdGVzKG5ldyBNb2RlbEl0ZW1bXSB7IGRsSXRlbSB9LCA2KTsK KwkJfQorCX0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvd25sb2FkSXRlbUVuYWJsZWRT dGF0ZUNoYW5nZWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtKSB7Ci0gICAgICAg IC8vIGZvciBwZXJzaXN0ZW50IGl0ZW1zLCBzZXQgcHJpb3JpdHkgdG8gNiAocGF1c2UpIHdo ZW4gZGlzYWJsZWQ7IGFuZCB0byBjb25maWd1cmVkIGRlZmF1bHQgaWYgZW5hYmxlZAotICAg ICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5h Z2VyKCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg ICAgICBpZiggZGxJdGVtLmlzRXh0ZXJuYWwoKSApIHsKLSAgICAgICAgICAgIHJldHVybjsK LSAgICAgICAgfQotICAgICAgICBpZiggZGxJdGVtLmdldFN0YXRlKCkgIT0gRnJvc3REb3du bG9hZEl0ZW0uU1RBVEVfUFJPR1JFU1MgKSB7Ci0gICAgICAgICAgICAvLyBub3QgcnVubmlu Zywgbm90IGluIHF1ZXVlCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg ICAgZmluYWwgYm9vbGVhbiBpdGVtSXNFbmFibGVkID0gKGRsSXRlbS5pc0VuYWJsZWQoKT09 bnVsbD90cnVlOmRsSXRlbS5pc0VuYWJsZWQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAg IGlmKCBpdGVtSXNFbmFibGVkICkgewotICAgICAgICAgICAgLy8gaXRlbSBpcyBub3cgZW5h YmxlZAotICAgICAgICAgICAgZmluYWwgaW50IHByaW8gPSBDb3JlLmZyb3N0U2V0dGluZ3Mu Z2V0SW50VmFsdWUoU2V0dGluZ3NDbGFzcy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxFX0RPV05M T0FEKTsKLSAgICAgICAgICAgIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNp c3RlbmNlTWFuYWdlcigpLmNoYW5nZUl0ZW1Qcmlvcml0ZXMobmV3IE1vZGVsSXRlbVtdIHtk bEl0ZW19LCBwcmlvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGl0ZW0g aXMgbm93IGRpc2FibGVkCi0gICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3Qo KS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKG5ldyBNb2Rl bEl0ZW1bXSB7ZGxJdGVtfSwgNik7Ci0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogVXNl ZCB0byBzb3J0IEZyb3N0RG93bmxvYWRJdGVtcyBieSBsYXN0VXBkYXRlU3RhcnRUaW1lTWls bGlzIGFzY2VuZGluZy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9y PEZyb3N0RG93bmxvYWRJdGVtPiBuZXh0SXRlbUNtcCA9IG5ldyBDb21wYXJhdG9yPEZyb3N0 RG93bmxvYWRJdGVtPigpIHsKKwkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIEZyb3N0RG93 bmxvYWRJdGVtIHZhbHVlMSwKKwkJCQlmaW5hbCBGcm9zdERvd25sb2FkSXRlbSB2YWx1ZTIp IHsKIAotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc29ydCBGcm9zdERvd25sb2FkSXRlbXMg YnkgbGFzdFVwZGF0ZVN0YXJ0VGltZU1pbGxpcyBhc2NlbmRpbmcuCi0gICAgICovCi0gICAg cHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxGcm9zdERvd25sb2FkSXRlbT4gbmV4 dEl0ZW1DbXAgPSBuZXcgQ29tcGFyYXRvcjxGcm9zdERvd25sb2FkSXRlbT4oKSB7Ci0gICAg ICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBGcm9zdERvd25sb2FkSXRlbSB2YWx1ZTEs IGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIHZhbHVlMikgeworCQkJLy8gY2hvb3NlIGl0ZW0g dGhhdCB3aXRoIGxvd2VzdCBhZGRlZFRpbWUKKwkJCWZpbmFsIGludCBjbXAxID0gTWl4ZWQu Y29tcGFyZUxvbmcodmFsdWUxLmdldERvd25sb2FkQWRkZWRNaWxsaXMoKSwKKwkJCQkJdmFs dWUyLmdldERvd25sb2FkQWRkZWRNaWxsaXMoKSk7CisJCQlpZiAoY21wMSAhPSAwKSB7CisJ CQkJcmV0dXJuIGNtcDE7CisJCQl9CiAKLSAgICAgICAgICAgIC8vIGNob29zZSBpdGVtIHRo YXQgd2l0aCBsb3dlc3QgYWRkZWRUaW1lCi0gICAgICAgICAgICBmaW5hbCBpbnQgY21wMSA9 IE1peGVkLmNvbXBhcmVMb25nKHZhbHVlMS5nZXREb3dubG9hZEFkZGVkTWlsbGlzKCksIHZh bHVlMi5nZXREb3dubG9hZEFkZGVkTWlsbGlzKCkpOwotICAgICAgICAgICAgaWYoIGNtcDEg IT0gMCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY21wMTsKLSAgICAgICAgICAgIH0K KwkJCS8vIGVxdWFsIGFkZGVkVGltZXMsIGNob29zZSBieSBibG9ja3NSZW1haW5pbmcKKwkJ CWludCBibG9ja3NUb2RvMTsKKwkJCWludCBibG9ja3NUb2RvMjsKIAotICAgICAgICAgICAg Ly8gZXF1YWwgYWRkZWRUaW1lcywgY2hvb3NlIGJ5IGJsb2Nrc1JlbWFpbmluZwotICAgICAg ICAgICAgaW50IGJsb2Nrc1RvZG8xOwotICAgICAgICAgICAgaW50IGJsb2Nrc1RvZG8yOwor CQkJLy8gY29tcHV0ZSByZW1haW5pbmcgYmxvY2tzCisJCQlpZiAodmFsdWUxLmdldFJlcXVp cmVkQmxvY2tzKCkgPiAwICYmIHZhbHVlMS5nZXREb25lQmxvY2tzKCkgPiAwKSB7CisJCQkJ YmxvY2tzVG9kbzEgPSB2YWx1ZTEuZ2V0UmVxdWlyZWRCbG9ja3MoKQorCQkJCQkJLSB2YWx1 ZTEuZ2V0RG9uZUJsb2NrcygpOworCQkJfSBlbHNlIHsKKwkJCQlibG9ja3NUb2RvMSA9IElu dGVnZXIuTUFYX1ZBTFVFOyAvLyBuZXZlciBzdGFydGVkCisJCQl9CisJCQlpZiAodmFsdWUy LmdldFJlcXVpcmVkQmxvY2tzKCkgPiAwICYmIHZhbHVlMi5nZXREb25lQmxvY2tzKCkgPiAw KSB7CisJCQkJYmxvY2tzVG9kbzIgPSB2YWx1ZTIuZ2V0UmVxdWlyZWRCbG9ja3MoKQorCQkJ CQkJLSB2YWx1ZTIuZ2V0RG9uZUJsb2NrcygpOworCQkJfSBlbHNlIHsKKwkJCQlibG9ja3NU b2RvMiA9IEludGVnZXIuTUFYX1ZBTFVFOyAvLyBuZXZlciBzdGFydGVkCisJCQl9CiAKLSAg ICAgICAgICAgIC8vIGNvbXB1dGUgcmVtYWluaW5nIGJsb2NrcwotICAgICAgICAgICAgaWYo IHZhbHVlMS5nZXRSZXF1aXJlZEJsb2NrcygpID4gMCAmJiB2YWx1ZTEuZ2V0RG9uZUJsb2Nr cygpID4gMCApIHsKLSAgICAgICAgICAgICAgICBibG9ja3NUb2RvMSA9IHZhbHVlMS5nZXRS ZXF1aXJlZEJsb2NrcygpIC0gdmFsdWUxLmdldERvbmVCbG9ja3MoKTsKLSAgICAgICAgICAg IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tzVG9kbzEgPSBJbnRlZ2VyLk1BWF9W QUxVRTsgLy8gbmV2ZXIgc3RhcnRlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYo IHZhbHVlMi5nZXRSZXF1aXJlZEJsb2NrcygpID4gMCAmJiB2YWx1ZTIuZ2V0RG9uZUJsb2Nr cygpID4gMCApIHsKLSAgICAgICAgICAgICAgICBibG9ja3NUb2RvMiA9IHZhbHVlMi5nZXRS ZXF1aXJlZEJsb2NrcygpIC0gdmFsdWUyLmdldERvbmVCbG9ja3MoKTsKLSAgICAgICAgICAg IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tzVG9kbzIgPSBJbnRlZ2VyLk1BWF9W QUxVRTsgLy8gbmV2ZXIgc3RhcnRlZAotICAgICAgICAgICAgfQorCQkJZmluYWwgaW50IGNt cDIgPSBNaXhlZC5jb21wYXJlSW50KGJsb2Nrc1RvZG8xLCBibG9ja3NUb2RvMik7CisJCQlp ZiAoY21wMiAhPSAwKSB7CisJCQkJcmV0dXJuIGNtcDI7CisJCQl9CiAKLSAgICAgICAgICAg IGZpbmFsIGludCBjbXAyID0gTWl4ZWQuY29tcGFyZUludChibG9ja3NUb2RvMSwgYmxvY2tz VG9kbzIpOwotICAgICAgICAgICAgaWYoIGNtcDIgIT0gMCApIHsKLSAgICAgICAgICAgICAg ICByZXR1cm4gY21wMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZXF1YWwg cmVtYWluaW5nQmxvY2tzLCBjaG9vc2Ugc21hbGxlciBmaWxlIChmaWxlc2l6ZSBjYW4gYmUg LTEpCi0gICAgICAgICAgICByZXR1cm4gTWl4ZWQuY29tcGFyZUxvbmcodmFsdWUxLmdldEZp bGVTaXplKCksIHZhbHVlMi5nZXRGaWxlU2l6ZSgpKTsKLSAgICAgICAgfQotICAgIH07CisJ CQkvLyBlcXVhbCByZW1haW5pbmdCbG9ja3MsIGNob29zZSBzbWFsbGVyIGZpbGUgKGZpbGVz aXplIGNhbiBiZSAtMSkKKwkJCXJldHVybiBNaXhlZAorCQkJCQkuY29tcGFyZUxvbmcodmFs dWUxLmdldEZpbGVTaXplKCksIHZhbHVlMi5nZXRGaWxlU2l6ZSgpKTsKKwkJfQorCX07CiB9 CkluZGV4OiBzb3VyY2UvZnJvc3QvZmlsZVRyYW5zZmVyL2Rvd25sb2FkL0Rvd25sb2FkUGFu ZWwuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIv ZG93bmxvYWQvRG93bmxvYWRQYW5lbC5qYXZhCShyZXZpc2lvbiAzMTk3KQ0KKysrIHNvdXJj ZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRQYW5lbC5qYXZhCSh3b3Jr aW5nIGNvcHkpDQpAQCAtMTQsNyArMTQsNyBAQA0KICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcg d2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK ICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5 LCBVU0EuCi0qLworICovCiBwYWNrYWdlIGZyb3N0LmZpbGVUcmFuc2Zlci5kb3dubG9hZDsK IAogaW1wb3J0IGphdmEuYXd0Lio7CkBAIC0zNyw2ICszNyw3IEBADQogaW1wb3J0IGZyb3N0 LmZjcC4qOwogaW1wb3J0IGZyb3N0LmZpbGVUcmFuc2Zlci4qOwogaW1wb3J0IGZyb3N0LmZp bGVUcmFuc2Zlci5jb21tb24uKjsKK2ltcG9ydCBmcm9zdC5ndWkuQWRkTmV3RG93bmxvYWRz RGlhbG9nOwogaW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtleXNT dG9yYWdlOwogaW1wb3J0IGZyb3N0LnV0aWwuKjsKIGltcG9ydCBmcm9zdC51dGlsLmd1aS4q OwpAQCAtNjAsMjEgKzYxLDIxIEBADQogCXByaXZhdGUgZmluYWwgSlRvb2xCYXIgZG93bmxv YWRUb29sQmFyID0gbmV3IEpUb29sQmFyKCk7CiAJcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRv d25sb2FkUGFzdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJ Y29uKCIvZGF0YS90b29sYmFyL2VkaXQtcGFzdGUucG5nIikpOwogCXByaXZhdGUgZmluYWwg SkJ1dHRvbiBkb3dubG9hZEFjdGl2YXRlQnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xr aXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9tZWRpYS1wbGF5YmFjay1zdGFydC5w bmciKSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkUGF1c2VCdXR0b24g PSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIvZGF0YS90b29sYmFy L21lZGlhLXBsYXliYWNrLXBhdXNlLnBuZyIpKTsKLSAgICBwcml2YXRlIGZpbmFsIEpCdXR0 b24gZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbiA9IG5ldyBKQnV0dG9uKE1pc2NUb29sa2l0 LmxvYWRJbWFnZUljb24oIi9kYXRhL3Rvb2xiYXIvdmlldy1yZWZyZXNoLnBuZyIpKTsKLSAg ICBwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJTZWxlY3RCdXR0b24gPSBuZXcg SkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIvZGF0YS90b29sYmFyL2ZvbGRl ci1vcGVuLnBuZyIpKTsKLSAgICBwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJD cmVhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIv ZGF0YS90b29sYmFyL2ZvbGRlci1uZXcucG5nIikpOwotICAgIHByaXZhdGUgZmluYWwgSkJ1 dHRvbiBkb3dubG9hZERpckFwcGx5QnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xraXQu bG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci92aWV3LXJlZnJlc2gucG5nIikpOworCXBy aXZhdGUgZmluYWwgSkJ1dHRvbiBkb3dubG9hZFBhdXNlQnV0dG9uID0gbmV3IEpCdXR0b24o TWlzY1Rvb2xraXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9tZWRpYS1wbGF5YmFj ay1wYXVzZS5wbmciKSk7CisJcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkUHJlZml4 QXBwbHlCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIv ZGF0YS90b29sYmFyL3ZpZXctcmVmcmVzaC5wbmciKSk7CisJcHJpdmF0ZSBmaW5hbCBKQnV0 dG9uIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xraXQu bG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9mb2xkZXItb3Blbi5wbmciKSk7CisJcHJp dmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0 b24oTWlzY1Rvb2xraXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9mb2xkZXItbmV3 LnBuZyIpKTsKKwlwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJBcHBseUJ1dHRv biA9IG5ldyBKQnV0dG9uKE1pc2NUb29sa2l0LmxvYWRJbWFnZUljb24oIi9kYXRhL3Rvb2xi YXIvdmlldy1yZWZyZXNoLnBuZyIpKTsKIAlwcml2YXRlIGZpbmFsIEpNZW51IGRvd25sb2Fk RGlyUmVjZW50TWVudSA9IG5ldyBKTWVudSgpOwotICAgIHByaXZhdGUgZmluYWwgSlRleHRG aWVsZCBkb3dubG9hZFByZWZpeFRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKKwlw cml2YXRlIGZpbmFsIEpUZXh0RmllbGQgZG93bmxvYWRQcmVmaXhUZXh0RmllbGQgPSBuZXcg SlRleHRGaWVsZCgzMCk7CiAJcHJpdmF0ZSBmaW5hbCBKVGV4dEZpZWxkIGRvd25sb2FkRGly VGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwogCXByaXZhdGUgZmluYWwgSlRleHRG aWVsZCBkb3dubG9hZFRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKIAlwcml2YXRl IGZpbmFsIEpMYWJlbCBkb3dubG9hZEl0ZW1Db3VudExhYmVsID0gbmV3IEpMYWJlbCgpOwog CXByaXZhdGUgZmluYWwgSkxhYmVsIGRvd25sb2FkUXVpY2tsb2FkTGFiZWwgPSBuZXcgSkxh YmVsKCk7CiAJcHJpdmF0ZSBmaW5hbCBKTGFiZWwgZG93bmxvYWRQcmVmaXhMYWJlbCA9IG5l dyBKTGFiZWwoKTsKIAlwcml2YXRlIGZpbmFsIEpMYWJlbCBkb3dubG9hZERpckxhYmVsID0g bmV3IEpMYWJlbCgpOwotICAgIHByaXZhdGUgZmluYWwgSkNoZWNrQm94IHJlbW92ZUZpbmlz aGVkRG93bmxvYWRzQ2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0gICAgcHJpdmF0ZSBm aW5hbCBKQ2hlY2tCb3ggc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyA9IG5ldyBKQ2hl Y2tCb3goKTsKKwlwcml2YXRlIGZpbmFsIEpDaGVja0JveCByZW1vdmVGaW5pc2hlZERvd25s b2Fkc0NoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOworCXByaXZhdGUgZmluYWwgSkNoZWNr Qm94IHNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMgPSBuZXcgSkNoZWNrQm94KCk7CiAJ cHJpdmF0ZSBDb2xvciBkb3dubG9hZERpckRlZmF1bHRCYWNrZ3JvdW5kOwogCXByaXZhdGUg U29ydGVkTW9kZWxUYWJsZSBtb2RlbFRhYmxlOwogCkBAIC04NSwyOSArODYsMjkgQEANCiAK IAlwdWJsaWMgRG93bmxvYWRQYW5lbCgpIHsKIAkJc3VwZXIoKTsKLSAgICAgICAgQ29yZS5m cm9zdFNldHRpbmdzLmFkZFVwZGF0ZXIodGhpcyk7CisJCUNvcmUuZnJvc3RTZXR0aW5ncy5h ZGRVcGRhdGVyKHRoaXMpOwogCiAJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2Uo KTsKIAkJbGFuZ3VhZ2UuYWRkTGFuZ3VhZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CiAJfQogCi0g ICAgcHVibGljIERvd25sb2FkVGFibGVGb3JtYXQgZ2V0VGFibGVGb3JtYXQoKSB7Ci0gICAg ICAgIHJldHVybiAoRG93bmxvYWRUYWJsZUZvcm1hdCkgbW9kZWxUYWJsZS5nZXRUYWJsZUZv cm1hdCgpOwotICAgIH0KKwlwdWJsaWMgRG93bmxvYWRUYWJsZUZvcm1hdCBnZXRUYWJsZUZv cm1hdCgpIHsKKwkJcmV0dXJuIChEb3dubG9hZFRhYmxlRm9ybWF0KSBtb2RlbFRhYmxlLmdl dFRhYmxlRm9ybWF0KCk7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhpcyBEb2N1bWVudCBj aGFuZ2VzIGFsbCBuZXdsaW5lcyBpbiB0aGUgdGV4dCBpbnRvIHNlbWljb2xvbnMuCi0gICAg ICogTmVlZGVkIGlmIHRoZSB1c2VyIHBhc3RlcyBtdWx0aXBsZSBkb3dubG9hZCBrZXlzLCBl YWNoIG9uIGEgbGluZSwKLSAgICAgKiBpbnRvIHRoZSBkb3dubG9hZCB0ZXh0IGZpZWxkLgot ICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBIYW5kbGVNdWx0aUxpbmVLZXlzRG9jdW1l bnQgZXh0ZW5kcyBQbGFpbkRvY3VtZW50IHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAg IHB1YmxpYyB2b2lkIGluc2VydFN0cmluZyhmaW5hbCBpbnQgb2ZmcywgU3RyaW5nIHN0ciwg ZmluYWwgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0g ICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgnXG4nLCAnOycpOwotICAgICAgICAgICAg c3RyID0gc3RyLnJlcGxhY2UoJ1xyJywgJyAnKTsKLSAgICAgICAgICAgIHN1cGVyLmluc2Vy dFN0cmluZyhvZmZzLCBzdHIsIGEpOwotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIFRo aXMgRG9jdW1lbnQgY2hhbmdlcyBhbGwgbmV3bGluZXMgaW4gdGhlIHRleHQgaW50byBzZW1p Y29sb25zLgorCSAqIE5lZWRlZCBpZiB0aGUgdXNlciBwYXN0ZXMgbXVsdGlwbGUgZG93bmxv YWQga2V5cywgZWFjaCBvbiBhIGxpbmUsCisJICogaW50byB0aGUgZG93bmxvYWQgdGV4dCBm aWVsZC4KKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgSGFuZGxlTXVsdGlMaW5lS2V5c0RvY3Vt ZW50IGV4dGVuZHMgUGxhaW5Eb2N1bWVudCB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9p ZCBpbnNlcnRTdHJpbmcoZmluYWwgaW50IG9mZnMsIFN0cmluZyBzdHIsIGZpbmFsIEF0dHJp YnV0ZVNldCBhKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24geworCQkJc3RyID0gc3Ry LnJlcGxhY2UoJ1xuJywgJzsnKTsKKwkJCXN0ciA9IHN0ci5yZXBsYWNlKCdccicsICcgJyk7 CisJCQlzdXBlci5pbnNlcnRTdHJpbmcob2Zmcywgc3RyLCBhKTsKKwkJfQorCX0KIAogCXB1 YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJCWlmICghaW5pdGlhbGl6ZWQpIHsKQEAgLTEz MiwyMyArMTMzLDIzIEBADQogCQkJbWVudS5hZGQoZG93bmxvYWREaXJSZWNlbnRNZW51KTsK IAkJCWRvd25sb2FkRGlyUmVjZW50TWVudS5hZGRNZW51TGlzdGVuZXIobGlzdGVuZXIpOwog Ci0gICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuc2V0Um9sbG92ZXIodHJ1ZSk7Ci0gICAg ICAgICAgICBkb3dubG9hZFRvb2xCYXIuc2V0RmxvYXRhYmxlKGZhbHNlKTsKKwkJCWRvd25s b2FkVG9vbEJhci5zZXRSb2xsb3Zlcih0cnVlKTsKKwkJCWRvd25sb2FkVG9vbEJhci5zZXRG bG9hdGFibGUoZmFsc2UpOwogCi0gICAgICAgICAgICByZW1vdmVGaW5pc2hlZERvd25sb2Fk c0NoZWNrQm94LnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgICAgICBzaG93RXh0ZXJuYWxH bG9iYWxRdWV1ZUl0ZW1zLnNldE9wYXF1ZShmYWxzZSk7CisJCQlyZW1vdmVGaW5pc2hlZERv d25sb2Fkc0NoZWNrQm94LnNldE9wYXF1ZShmYWxzZSk7CisJCQlzaG93RXh0ZXJuYWxHbG9i YWxRdWV1ZUl0ZW1zLnNldE9wYXF1ZShmYWxzZSk7CiAKLSAgICAgICAgICAgIGZpbmFsIEpQ YW5lbCBwYW5lbEhlYWRlciA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKwkJ CWZpbmFsIEpQYW5lbCBwYW5lbEhlYWRlciA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91 dCgpKTsKIAogCQkJLy8gVG9vbGJhcgogCQkJZG93bmxvYWRUb29sQmFyLmFkZChkb3dubG9h ZEFjdGl2YXRlQnV0dG9uKTsKIAkJCWRvd25sb2FkVG9vbEJhci5hZGQoZG93bmxvYWRQYXVz ZUJ1dHRvbik7Ci0gICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVS aWdpZEFyZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOwotICAgICAgICAgICAgZG93bmxvYWRU b29sQmFyLmFkZChyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94KTsKLSAgICAgICAg ICAgIGlmKCBQZXJzaXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsK LSAgICAgICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVSaWdpZEFy ZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOwotICAgICAgICAgICAgICAgIGRvd25sb2FkVG9v bEJhci5hZGQoc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyk7Ci0gICAgICAgICAgICB9 CisJCQlkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVu c2lvbig4LCAwKSkpOworCQkJZG93bmxvYWRUb29sQmFyLmFkZChyZW1vdmVGaW5pc2hlZERv d25sb2Fkc0NoZWNrQm94KTsKKwkJCWlmKCBQZXJzaXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0 ZW5jZUVuYWJsZWQoKSApIHsKKwkJCQlkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVS aWdpZEFyZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOworCQkJCWRvd25sb2FkVG9vbEJhci5h ZGQoc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyk7CisJCQl9CiAJCQlkb3dubG9hZFRv b2xCYXIuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKIAkJCWRvd25sb2FkVG9v bEJhci5hZGQoZG93bmxvYWRJdGVtQ291bnRMYWJlbCk7CiAKQEAgLTIwOSw3ICsyMTAsNyBA QA0KIAkJCWRvd25sb2FkUHJlZml4VGV4dEZpZWxkLnNldE1pbmltdW1TaXplKGRvd25sb2Fk VGV4dEZpZWxkLmdldFByZWZlcnJlZFNpemUoKSk7CiAJCQlkb3dubG9hZERpclRleHRGaWVs ZC5zZXRNaW5pbXVtU2l6ZShkb3dubG9hZFRleHRGaWVsZC5nZXRQcmVmZXJyZWRTaXplKCkp OwogCi0gICAgICAgICAgICBkb3dubG9hZFRleHRGaWVsZC5zZXREb2N1bWVudChuZXcgSGFu ZGxlTXVsdGlMaW5lS2V5c0RvY3VtZW50KCkpOworCQkJZG93bmxvYWRUZXh0RmllbGQuc2V0 RG9jdW1lbnQobmV3IEhhbmRsZU11bHRpTGluZUtleXNEb2N1bWVudCgpKTsKIAkJCWRvd25s b2FkRGlyVGV4dEZpZWxkLnNldFRleHQoQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNl dHRpbmdzQ2xhc3MuRElSX0RPV05MT0FEKSk7CiAKIAkJCWRvd25sb2FkRGlyRGVmYXVsdEJh Y2tncm91bmQgPSBkb3dubG9hZERpclRleHRGaWVsZC5nZXRCYWNrZ3JvdW5kKCk7CkBAIC0y MTcsNyArMjE4LDcgQEANCiAKIAkJCS8vIGNyZWF0ZSB0aGUgbWFpbiBkb3dubG9hZCBwYW5l bAogCQkJbW9kZWxUYWJsZSA9IG5ldyBTb3J0ZWRNb2RlbFRhYmxlKG1vZGVsKTsKLSAgICAg ICAgICAgIG5ldyBUYWJsZUZpbmRBY3Rpb24oKS5pbnN0YWxsKG1vZGVsVGFibGUuZ2V0VGFi bGUoKSk7CisJCQluZXcgVGFibGVGaW5kQWN0aW9uKCkuaW5zdGFsbChtb2RlbFRhYmxlLmdl dFRhYmxlKCkpOwogCQkJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CiAJCQlwYW5l bEhlYWRlci5hZGQoZG93bmxvYWRUb29sQmFyLCBCb3JkZXJMYXlvdXQuUEFHRV9TVEFSVCk7 CiAJCQlwYW5lbEhlYWRlci5hZGQoZ2IsIEJvcmRlckxheW91dC5DRU5URVIpOwpAQCAtMjI2 LDcgKzIyNyw3IEBADQogCQkJYWRkKG1vZGVsVGFibGUuZ2V0U2Nyb2xsUGFuZSgpLCBCb3Jk ZXJMYXlvdXQuQ0VOVEVSKTsKIAkJCWZvbnRDaGFuZ2VkKCk7CiAKLSAgICAgICAgICAgIG1v ZGVsVGFibGUuZ2V0VGFibGUoKS5zZXREZWZhdWx0UmVuZGVyZXIoT2JqZWN0LmNsYXNzLCBu ZXcgQ2VsbFJlbmRlcmVyKCkpOworCQkJbW9kZWxUYWJsZS5nZXRUYWJsZSgpLnNldERlZmF1 bHRSZW5kZXJlcihPYmplY3QuY2xhc3MsIG5ldyBDZWxsUmVuZGVyZXIoKSk7CiAKIAkJCS8v IGxpc3RlbmVycwogCQkJZG93bmxvYWRUZXh0RmllbGQuYWRkQWN0aW9uTGlzdGVuZXIobGlz dGVuZXIpOwpAQCAtMjM2LDIxICsyMzcsMjEgQEANCiAJCQltb2RlbFRhYmxlLmdldFNjcm9s bFBhbmUoKS5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCW1vZGVsVGFibGUuZ2V0 VGFibGUoKS5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7CiAJCQltb2RlbFRhYmxlLmdldFRh YmxlKCkuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICByZW1vdmVG aW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LmFkZEl0ZW1MaXN0ZW5lcihsaXN0ZW5lcik7Ci0g ICAgICAgICAgICBzaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1zLmFkZEl0ZW1MaXN0ZW5l cihsaXN0ZW5lcik7CisJCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LmFkZEl0 ZW1MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQlzaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1z LmFkZEl0ZW1MaXN0ZW5lcihsaXN0ZW5lcik7CiAJCQlkb3dubG9hZFByZWZpeEFwcGx5QnV0 dG9uLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCWRvd25sb2FkRGlyVGV4dEZp ZWxkLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCWRvd25sb2FkRGlyVGV4dEZpZWxk LmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJTZWxlY3RCdXR0 b24uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJDcmVhdGVC dXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJBcHBs eUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICBDb3Jl LmZyb3N0U2V0dGluZ3MuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTZXR0aW5nc0NsYXNz LkZJTEVfTElTVF9GT05UX05BTUUsIGxpc3RlbmVyKTsKLSAgICAgICAgICAgIENvcmUuZnJv c3RTZXR0aW5ncy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNldHRpbmdzQ2xhc3MuRklM RV9MSVNUX0ZPTlRfU0laRSwgbGlzdGVuZXIpOwotICAgICAgICAgICAgQ29yZS5mcm9zdFNl dHRpbmdzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5GSUxFX0xJ U1RfRk9OVF9TVFlMRSwgbGlzdGVuZXIpOworCQkJQ29yZS5mcm9zdFNldHRpbmdzLmFkZFBy b3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1F LCBsaXN0ZW5lcik7CisJCQlDb3JlLmZyb3N0U2V0dGluZ3MuYWRkUHJvcGVydHlDaGFuZ2VM aXN0ZW5lcihTZXR0aW5nc0NsYXNzLkZJTEVfTElTVF9GT05UX1NJWkUsIGxpc3RlbmVyKTsK KwkJCUNvcmUuZnJvc3RTZXR0aW5ncy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNldHRp bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU1RZTEUsIGxpc3RlbmVyKTsKIAogCQkJLy9TZXR0 aW5ncwotICAgICAgICAgICAgcmVtb3ZlRmluaXNoZWREb3dubG9hZHNDaGVja0JveC5zZXRT ZWxlY3RlZChDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3Mu RE9XTkxPQURfUkVNT1ZFX0ZJTklTSEVEKSk7Ci0gICAgICAgICAgICBzaG93RXh0ZXJuYWxH bG9iYWxRdWV1ZUl0ZW1zLnNldFNlbGVjdGVkKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29s VmFsdWUoU2V0dGluZ3NDbGFzcy5HUV9TSE9XX0VYVEVSTkFMX0lURU1TX0RPV05MT0FEKSk7 CisJCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFNlbGVjdGVkKENvcmUu ZnJvc3RTZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1P VkVfRklOSVNIRUQpKTsKKwkJCXNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0U2Vs ZWN0ZWQoQ29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkdR X1NIT1dfRVhURVJOQUxfSVRFTVNfRE9XTkxPQUQpKTsKIAkJCXNldERvd25sb2FkaW5nQWN0 aXZhdGVkKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5E T1dOTE9BRElOR19BQ1RJVkFURUQpKTsKIAogCQkJYXNzaWduSG90a2V5cygpOwpAQCAtMjY4 LDIwICsyNjksMjAgQEANCiAJcHJpdmF0ZSB2b2lkIHJlZnJlc2hMYW5ndWFnZSgpIHsKIAkJ ZG93bmxvYWRQYXN0ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5ndWFnZS5nZXRTdHJpbmco IkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAucGFzdGVLZXlzIikpOwogCQlkb3dubG9h ZEFjdGl2YXRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93 bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hY3RpdmF0ZURvd25sb2FkaW5nIikpOwotICAg ICAgICBkb3dubG9hZFBhdXNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0 cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5wYXVzZURvd25sb2FkaW5nIikp OwotICAgICAgICByZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFRleHQobGFu Z3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUucmVtb3ZlRmluaXNoZWREb3dubG9hZHMi KSk7Ci0gICAgICAgIHNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0VGV4dChsYW5n dWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5zaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0 ZW1zIikpOworCQlkb3dubG9hZFBhdXNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5wYXVzZURvd25sb2Fk aW5nIikpOworCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFRleHQobGFu Z3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUucmVtb3ZlRmluaXNoZWREb3dubG9hZHMi KSk7CisJCXNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0VGV4dChsYW5ndWFnZS5n ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5zaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1zIikp OwogCi0gICAgICAgIGRvd25sb2FkVGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hZGRLZXlzIikpOwot ICAgICAgICBkb3dubG9hZFByZWZpeFRleHRGaWVsZC5zZXRUb29sVGlwVGV4dChsYW5ndWFn ZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuZG93bmxvYWRQcmVm aXgiKSk7Ci0gICAgICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxh bmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5kb3dubG9h ZERpciIpKTsKKwkJZG93bmxvYWRUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2Uu Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmFkZEtleXMiKSk7CisJ CWRvd25sb2FkUHJlZml4VGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0 cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5kb3dubG9hZFByZWZpeCIpKTsK KwkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3Ry aW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmRvd25sb2FkRGlyIikpOwogCi0g ICAgICAgIGRvd25sb2FkUHJlZml4QXBwbHlCdXR0b24uc2V0VG9vbFRpcFRleHQobGFuZ3Vh Z2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmFwcGx5RG93bmxv YWRQcmVmaXgiKSk7Ci0gICAgICAgIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uLnNldFRvb2xU aXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRp cC5zZWxlY3REb3dubG9hZERpciIpKTsKLSAgICAgICAgZG93bmxvYWREaXJDcmVhdGVCdXR0 b24uc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9v bGJhci50b29sdGlwLmNyZWF0ZURvd25sb2FkRGlyIikpOwotICAgICAgICBkb3dubG9hZERp ckFwcGx5QnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv YWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hcHBseURvd25sb2FkRGlyIikpOworCQlkb3dubG9h ZFByZWZpeEFwcGx5QnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygi RG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hcHBseURvd25sb2FkUHJlZml4IikpOwor CQlkb3dubG9hZERpclNlbGVjdEJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5ndWFnZS5nZXRT dHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuc2VsZWN0RG93bmxvYWREaXIi KSk7CisJCWRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5jcmVhdGVEb3dubG9h ZERpciIpKTsKKwkJZG93bmxvYWREaXJBcHBseUJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5n dWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuYXBwbHlEb3du bG9hZERpciIpKTsKIAotICAgICAgICBkb3dubG9hZERpclJlY2VudE1lbnUuc2V0VGV4dChs YW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmRvd25sb2FkRGlyTWVu dS5zZXREb3dubG9hZERpclRvIikpOworCQlkb3dubG9hZERpclJlY2VudE1lbnUuc2V0VGV4 dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmRvd25sb2FkRGly TWVudS5zZXREb3dubG9hZERpclRvIikpOwogCiAJCWRvd25sb2FkUXVpY2tsb2FkTGFiZWwu c2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmxhYmVs LmRvd25sb2FkUXVpY2tsb2FkIikgKyAiOiAiKTsKIAkJZG93bmxvYWRQcmVmaXhMYWJlbC5z ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIubGFiZWwu ZG93bmxvYWRQcmVmaXgiKSArICI6ICIpOwpAQCAtMjk5LDg2NyArMzAwLDg4NiBAQA0KIAl9 CiAKIAlwcml2YXRlIHZvaWQgdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k KCkgewotCSAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShkb3dubG9hZERpclRleHRG aWVsZC5nZXRUZXh0KCkpOwotCSAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JICAg ICAgICBkb3dubG9hZERpclRleHRGaWVsZC5zZXRCYWNrZ3JvdW5kKGRvd25sb2FkRGlyRGVm YXVsdEJhY2tncm91bmQpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgZG93bmxvYWREaXJU ZXh0RmllbGQuc2V0QmFja2dyb3VuZChDb2xvci5SRUQpOwotCSAgICB9CisJCWZpbmFsIEZp bGUgZmlsZSA9IG5ldyBGaWxlKGRvd25sb2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKSk7CisJ CWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKwkJCWRvd25sb2FkRGlyVGV4dEZpZWxkLnNl dEJhY2tncm91bmQoZG93bmxvYWREaXJEZWZhdWx0QmFja2dyb3VuZCk7CisJCX0gZWxzZSB7 CisJCQlkb3dubG9hZERpclRleHRGaWVsZC5zZXRCYWNrZ3JvdW5kKENvbG9yLlJFRCk7CisJ CX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgZG93bmxvYWREaXJUZXh0RmllbGRfa2V5UmVsZWFz ZWQoZmluYWwgS2V5RXZlbnQgZSkgewotCSAgICB1cGRhdGVEb3dubG9hZERpclRleHRGaWVs ZEJhY2tncm91bmQoKTsKKwkJdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k KCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyVGV4dEZpZWxkX2ZvY3VzTG9z dChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKLQkgICAgZmluYWwgU3RyaW5nIGRpciA9IGRvd25s b2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKTsKKwkJZmluYWwgU3RyaW5nIGRpciA9IGRvd25s b2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKTsKIAotCSAgICB1cGRhdGVEb3dubG9hZERpclRl eHRGaWVsZEJhY2tncm91bmQoKTsKLSAgICAgICAgICAgIH0KKwkJdXBkYXRlRG93bmxvYWRE aXJUZXh0RmllbGRCYWNrZ3JvdW5kKCk7CisJfQogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcg Z2V0RG93bmxvYWRQcmVmaXgoKSB7CiAJCXJldHVybiBkb3dubG9hZFByZWZpeFRleHRGaWVs ZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9CisJfQogCiAJcHJpdmF0ZSBmaW5hbCBTdHJp bmcgZ2V0RG93bmxvYWREaXIoKSB7CiAJCWZpbmFsIFN0cmluZyBkaXIgPSBkb3dubG9hZERp clRleHRGaWVsZC5nZXRUZXh0KCk7CiAKLSAgICAgICAgaWYgKGRpci5sZW5ndGgoKSA9PSAw KSB7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKKwkJaWYgKGRpci5sZW5ndGgoKSA9PSAwKSB7 CisJCQlyZXR1cm4gbnVsbDsKIAkJfSBlbHNlIHsKLSAgICAgICAgCXJldHVybiBkaXI7Ci0g ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisJCQlyZXR1cm4gZGly OworCQl9CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9u X2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGZpbmFs IEpGaWxlQ2hvb3NlciBmYyA9IG5ldyBKRmlsZUNob29zZXIoRmlsZUFjY2Vzcy5hcHBlbmRT ZXBhcmF0b3IoZG93bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIGZj LnNldERpYWxvZ1RpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMu ZmlsZWNob29zZXIudGl0bGUiKSk7Ci0gICAgICAgIGZjLnNldEZpbGVIaWRpbmdFbmFibGVk KHRydWUpOwotICAgICAgICBmYy5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIu RElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgIGZjLnNldE11bHRpU2VsZWN0aW9uRW5hYmxl ZChmYWxzZSk7CisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uX2FjdGlv blBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCWZpbmFsIEpGaWxlQ2hvb3Nl ciBmYyA9IG5ldyBKRmlsZUNob29zZXIoRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZG93 bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKSk7CisJCWZjLnNldERpYWxvZ1RpdGxlKGxh bmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMuZmlsZWNob29zZXIudGl0bGUi KSk7CisJCWZjLnNldEZpbGVIaWRpbmdFbmFibGVkKHRydWUpOworCQlmYy5zZXRGaWxlU2Vs ZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7CisJCWZjLnNldE11 bHRpU2VsZWN0aW9uRW5hYmxlZChmYWxzZSk7CiAKLSAgICAgICAgZmluYWwgaW50IHJldHVy blZhbCA9IGZjLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFs ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgZmluYWwg RmlsZSBmaWxlID0gZmMuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICBDb3JlLmZy b3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ESVJfTEFTVF9VU0VELCBmaWxl LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkLnNldFRl eHQoZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgdXBkYXRlRG93bmxvYWREaXJUZXh0 RmllbGRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg ICAgICB9CisJCWZpbmFsIGludCByZXR1cm5WYWwgPSBmYy5zaG93T3BlbkRpYWxvZyh0aGlz KTsKKwkJaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsK KwkJCWZpbmFsIEZpbGUgZmlsZSA9IGZjLmdldFNlbGVjdGVkRmlsZSgpOworCQkJQ29yZS5m cm9zdFNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0xBU1RfVVNFRCwgZmls ZS5nZXRQYXJlbnQoKSk7CisJCQlkb3dubG9hZERpclRleHRGaWVsZC5zZXRUZXh0KGZpbGUu Z2V0UGF0aCgpKTsKKwkJCXVwZGF0ZURvd25sb2FkRGlyVGV4dEZpZWxkQmFja2dyb3VuZCgp OworCQl9CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9u X2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgCUZpbGUgZGly ID0gbmV3IEZpbGUoZG93bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKTsKKwlwcml2YXRl IHZvaWQgZG93bmxvYWREaXJDcmVhdGVCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj dGlvbkV2ZW50IGUpIHsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShkb3dubG9hZERpclRleHRG aWVsZC5nZXRUZXh0KCkpOwogCi0gICAgCXRyeSB7Ci0gICAgCQlkaXIubWtkaXJzKCk7Ci0g ICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmb28pIHsKLSAgICAgICAgICAgICAgICB9CisJCXRy eSB7CisJCQlkaXIubWtkaXJzKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmb28pIHsKKwkJ fQogCi0gICAgCXVwZGF0ZURvd25sb2FkRGlyVGV4dEZpZWxkQmFja2dyb3VuZCgpOwotICAg ICAgICAgICAgICAgIH0KKwkJdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k KCk7CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5RG93bmxvYWRQcmVmaXhUb1NlbGVj dGVkRG93bmxvYWRzKCkgewotICAgICAgICBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0 ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7CisJcHJpdmF0ZSB2b2lkIGFw cGx5RG93bmxvYWRQcmVmaXhUb1NlbGVjdGVkRG93bmxvYWRzKCkgeworCQlmaW5hbCBNb2Rl bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7 CiAKLSAgICAgICAgZm9yIChmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0ZW1zKSB7 Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpID0gKEZyb3N0RG93bmxv YWRJdGVtKW1pOworCQlmb3IgKGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMp IHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGkgPSAoRnJvc3REb3dubG9hZEl0ZW0p bWk7CiAKLSAgICAgICAgICAgIGlmICghaS5pc0V4dGVybmFsKCkpIHsKLSAgICAgICAgICAg IAlpLnNldEZpbGVuYW1lUHJlZml4KGdldERvd25sb2FkUHJlZml4KCkpOwotICAgICAgICAg ICAgICAgIGkuZmlyZVZhbHVlQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9 Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgIHByaXZhdGUgdm9p ZCBhcHBseURvd25sb2FkRGlyVG9TZWxlY3RlZERvd25sb2FkcygpIHsKLSAgICAgICAgZmlu YWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJ dGVtcygpOworCQkJaWYgKCFpLmlzRXh0ZXJuYWwoKSkgeworCQkJCWkuc2V0RmlsZW5hbWVQ cmVmaXgoZ2V0RG93bmxvYWRQcmVmaXgoKSk7CisJCQkJaS5maXJlVmFsdWVDaGFuZ2VkKCk7 CisJCQl9CisJCX0KKwl9CiAKLSAgICAgICAgZm9yIChmaW5hbCBNb2RlbEl0ZW0gbWkgOiBz ZWxlY3RlZEl0ZW1zKSB7Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBp ID0gKEZyb3N0RG93bmxvYWRJdGVtKW1pOworCXByaXZhdGUgdm9pZCBhcHBseURvd25sb2Fk RGlyVG9TZWxlY3RlZERvd25sb2FkcygpIHsKKwkJZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0 ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwogCi0gICAgICAgICAg ICBpZiAoIWkuaXNFeHRlcm5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXREb3dubG9h ZERpcihnZXREb3dubG9hZERpcigpKTsKLSAgICAgICAgICAgICAgICBpLmZpcmVWYWx1ZUNo YW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlmb3IgKGZpbmFsIE1vZGVs SXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMpIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVt IGkgPSAoRnJvc3REb3dubG9hZEl0ZW0pbWk7CisKKwkJCWlmICghaS5pc0V4dGVybmFsKCkp IHsKKwkJCQlpLnNldERvd25sb2FkRGlyKGdldERvd25sb2FkRGlyKCkpOworCQkJCWkuZmly ZVZhbHVlQ2hhbmdlZCgpOworCQkJfQorCQl9CiAJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRv d25sb2FkRGlyQXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50 IGUpIHsKLSAgICAgICAgYXBwbHlEb3dubG9hZERpclRvU2VsZWN0ZWREb3dubG9hZHMoKTsK LSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkUHJlZml4QXBwbHlCdXR0 b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgYXBw bHlEb3dubG9hZFByZWZpeFRvU2VsZWN0ZWREb3dubG9hZHMoKTsKLSAgICB9CisJcHJpdmF0 ZSB2b2lkIGRvd25sb2FkRGlyQXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj dGlvbkV2ZW50IGUpIHsKKwkJYXBwbHlEb3dubG9hZERpclRvU2VsZWN0ZWREb3dubG9hZHMo KTsKKwl9CiAKKwlwcml2YXRlIHZvaWQgZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbl9hY3Rp b25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQlhcHBseURvd25sb2FkUHJl Zml4VG9TZWxlY3RlZERvd25sb2FkcygpOworCX0KKwkKKwkKKwogCS8qKgogCSAqIGRvd25s b2FkVGV4dEZpZWxkIEFjdGlvbiBMaXN0ZW5lciAoRG93bmxvYWQvUXVpY2tsb2FkKQotICAg ICAqIFRoZSB0ZXh0ZmllbGQgY2FuIGNvbnRhaW4gMSBrZXkgdG8gZG93bmxvYWQgb3IgbXVs dGlwbGUga2V5cyBzZXBhcmF0ZWQgYnkgJzsnLgorCSAqIFRoZSB0ZXh0ZmllbGQgY2FuIGNv bnRhaW4gMSBrZXkgdG8gZG93bmxvYWQgb3IgbXVsdGlwbGUga2V5cyBzZXBhcmF0ZWQgYnkg JzsnLgogCSAqLwotCXByaXZhdGUgdm9pZCBkb3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJm b3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotCQlEb3dubG9hZE1hbmFnZXIgZGxNYW5h Z2VyID0gRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCk7 CisJIHByaXZhdGUgdm9pZCBkb3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJmb3JtZWQoZmlu YWwgQWN0aW9uRXZlbnQgZSkgeworCQkgCisJCSBTdHJpbmcga2V5bGlzdCA9IGRvd25sb2Fk VGV4dEZpZWxkLmdldFRleHQoKTsKKwkJIAorCQkgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4g ZnJvc3REb3dubG9hZEl0ZW1MaXN0ID0gRG93bmxvYWRNYW5hZ2VyLnBhcnNlS2V5cyhrZXls aXN0KTsKIAotCQlkbE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoZ2V0RG93bmxvYWRE aXIoKSk7Ci0gICAgCWRsTWFuYWdlci5hZGRLZXlzKGRvd25sb2FkVGV4dEZpZWxkLmdldFRl eHQoKSwgZ2V0RG93bmxvYWREaXIoKSwgZ2V0RG93bmxvYWRQcmVmaXgoKSk7Ci0gICAgICAg IGRvd25sb2FkVGV4dEZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KKwkJIGZpbmFsIEFkZE5l d0Rvd25sb2Fkc0RpYWxvZyBhZGROZXdEb3dubG9hZHNEaWFsb2cgPSBuZXcgQWRkTmV3RG93 bmxvYWRzRGlhbG9nKAorCQkJCSBNYWluRnJhbWUuZ2V0SW5zdGFuY2UoKSwgZnJvc3REb3du bG9hZEl0ZW1MaXN0KTsKKwkJIGZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IGFkZE5ld0Rvd25s b2Fkc0RpYWxvZy5zdGFydERpYWxvZyhmcm9zdERvd25sb2FkSXRlbUxpc3QpOwogCi0JLyoq Ci0JICogR2V0IGtleVR5cGVkIGZvciBkb3dubG9hZFRhYmxlCi0JICovCi0JcHJpdmF0ZSB2 b2lkIGRvd25sb2FkVGFibGVfa2V5UHJlc3NlZChmaW5hbCBLZXlFdmVudCBlKSB7Ci0JCWZp bmFsIGNoYXIga2V5ID0gZS5nZXRLZXlDaGFyKCk7Ci0JCWlmIChrZXkgPT0gS2V5RXZlbnQu VktfREVMRVRFICYmICFtb2RlbFRhYmxlLmdldFRhYmxlKCkuaXNFZGl0aW5nKCkpIHsKLSAg ICAgICAgICAgIHJlbW92ZVNlbGVjdGVkRG93bmxvYWRzKCk7Ci0JCX0KLQl9CiAKLSAgICBw cml2YXRlIHZvaWQgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKSB7Ci0gICAgICAgIGZpbmFs IE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRl bXMoKTsKKwkJIERvd25sb2FkTW9kZWwgZG93bmxvYWRNb2RlbCA9IEZpbGVUcmFuc2Zlck1h bmFnZXIuaW5zdCgpLmdldERvd25sb2FkTWFuYWdlcigpLmdldE1vZGVsKCk7CisJCSBmb3Io ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJvc3REb3dubG9hZEl0ZW0gOiBmcm9zdERvd25s b2FkSXRlbUxpc3QgKSB7CisJCQkgZG93bmxvYWRNb2RlbC5hZGREb3dubG9hZEl0ZW0oZnJv c3REb3dubG9hZEl0ZW0pOworCQkgfQorCSB9CiAKLSAgICAgICAgZmluYWwgTGlzdDxTdHJp bmc+IGV4dGVybmFsUmVxdWVzdHNUb1JlbW92ZSA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4o KTsKLSAgICAgICAgZmluYWwgTGlzdDxNb2RlbEl0ZW0+IHJlcXVlc3RzVG9SZW1vdmUgPSBu ZXcgTGlua2VkTGlzdDxNb2RlbEl0ZW0+KCk7Ci0gICAgICAgIGZvciggZmluYWwgTW9kZWxJ dGVtIG1pIDogc2VsZWN0ZWRJdGVtcyApIHsKLSAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93 bmxvYWRJdGVtIGkgPSAoRnJvc3REb3dubG9hZEl0ZW0pbWk7Ci0gICAgICAgICAgICByZXF1 ZXN0c1RvUmVtb3ZlLmFkZChtaSk7Ci0gICAgICAgICAgICBpZiggaS5pc0V4dGVybmFsKCkg KSB7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuYWxSZXF1ZXN0c1RvUmVtb3ZlLmFkZChpLmdl dEdxSWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCSAvKioKKwkg ICogR2V0IGtleVR5cGVkIGZvciBkb3dubG9hZFRhYmxlCisJICAqLworCSBwcml2YXRlIHZv aWQgZG93bmxvYWRUYWJsZV9rZXlQcmVzc2VkKGZpbmFsIEtleUV2ZW50IGUpIHsKKwkJIGZp bmFsIGNoYXIga2V5ID0gZS5nZXRLZXlDaGFyKCk7CisJCSBpZiAoa2V5ID09IEtleUV2ZW50 LlZLX0RFTEVURSAmJiAhbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmlzRWRpdGluZygpKSB7CisJ CQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJIH0KKwkgfQogCi0gICAgICAgIGZp bmFsIE1vZGVsSXRlbVtdIHJpID0gcmVxdWVzdHNUb1JlbW92ZS50b0FycmF5KG5ldyBNb2Rl bEl0ZW1bcmVxdWVzdHNUb1JlbW92ZS5zaXplKCldKTsKLSAgICAgICAgbW9kZWwucmVtb3Zl SXRlbXMocmkpOworCSBwcml2YXRlIHZvaWQgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKSB7 CisJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT ZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmNsZWFy U2VsZWN0aW9uKCk7CisJCSBmaW5hbCBMaXN0PFN0cmluZz4gZXh0ZXJuYWxSZXF1ZXN0c1Rv UmVtb3ZlID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworCQkgZmluYWwgTGlzdDxNb2Rl bEl0ZW0+IHJlcXVlc3RzVG9SZW1vdmUgPSBuZXcgTGlua2VkTGlzdDxNb2RlbEl0ZW0+KCk7 CisJCSBmb3IoIGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMgKSB7CisJCQkg ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSA9IChGcm9zdERvd25sb2FkSXRlbSltaTsKKwkJ CSByZXF1ZXN0c1RvUmVtb3ZlLmFkZChtaSk7CisJCQkgaWYoIGkuaXNFeHRlcm5hbCgpICkg eworCQkJCSBleHRlcm5hbFJlcXVlc3RzVG9SZW1vdmUuYWRkKGkuZ2V0R3FJZGVudGlmaWVy KCkpOworCQkJIH0KKwkJIH0KIAotICAgICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5p bnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgIT0gbnVsbCAmJiBleHRlcm5hbFJlcXVl c3RzVG9SZW1vdmUuc2l6ZSgpID4gMCApIHsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7 Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZv aWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmlu c3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5yZW1vdmVSZXF1ZXN0cyhleHRlcm5hbFJl cXVlc3RzVG9SZW1vdmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0uc3Rh cnQoKTsKLSAgICAgICAgfQotICAgIH0KKwkJIGZpbmFsIE1vZGVsSXRlbVtdIHJpID0gcmVx dWVzdHNUb1JlbW92ZS50b0FycmF5KG5ldyBNb2RlbEl0ZW1bcmVxdWVzdHNUb1JlbW92ZS5z aXplKCldKTsKKwkJIG1vZGVsLnJlbW92ZUl0ZW1zKHJpKTsKIAotCXB1YmxpYyBib29sZWFu IGlzRG93bmxvYWRpbmdBY3RpdmF0ZWQoKSB7Ci0JCXJldHVybiBkb3dubG9hZGluZ0FjdGl2 YXRlZDsKLQl9CisJCSBtb2RlbFRhYmxlLmdldFRhYmxlKCkuY2xlYXJTZWxlY3Rpb24oKTsK IAotCXB1YmxpYyB2b2lkIHNldERvd25sb2FkaW5nQWN0aXZhdGVkKGZpbmFsIGJvb2xlYW4g YikgewotCQlkb3dubG9hZGluZ0FjdGl2YXRlZCA9IGI7CisJCSBpZiggRmlsZVRyYW5zZmVy TWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgIT0gbnVsbCAmJiBleHRl cm5hbFJlcXVlc3RzVG9SZW1vdmUuc2l6ZSgpID4gMCApIHsKKwkJCSBuZXcgVGhyZWFkKCkg eworCQkJCSBAT3ZlcnJpZGUKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgRmls ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkucmVtb3Zl UmVxdWVzdHMoZXh0ZXJuYWxSZXF1ZXN0c1RvUmVtb3ZlKTsKKwkJCQkgfQorCQkJIH0uc3Rh cnQoKTsKKwkJIH0KKwkgfQogCi0gICAgICAgIGRvd25sb2FkQWN0aXZhdGVCdXR0b24uc2V0 RW5hYmxlZCghZG93bmxvYWRpbmdBY3RpdmF0ZWQpOwotICAgICAgICBkb3dubG9hZFBhdXNl QnV0dG9uLnNldEVuYWJsZWQoZG93bmxvYWRpbmdBY3RpdmF0ZWQpOwotCX0KKwkgcHVibGlj IGJvb2xlYW4gaXNEb3dubG9hZGluZ0FjdGl2YXRlZCgpIHsKKwkJIHJldHVybiBkb3dubG9h ZGluZ0FjdGl2YXRlZDsKKwkgfQogCi0JcHVibGljIHZvaWQgc2V0RG93bmxvYWRJdGVtQ291 bnQoZmluYWwgaW50IG5ld0Rvd25sb2FkSXRlbUNvdW50KSB7Ci0JCWRvd25sb2FkSXRlbUNv dW50ID0gbmV3RG93bmxvYWRJdGVtQ291bnQ7CisJIHB1YmxpYyB2b2lkIHNldERvd25sb2Fk aW5nQWN0aXZhdGVkKGZpbmFsIGJvb2xlYW4gYikgeworCQkgZG93bmxvYWRpbmdBY3RpdmF0 ZWQgPSBiOwogCi0JCWZpbmFsIFN0cmluZyBzID0KLQkJCW5ldyBTdHJpbmdCdWlsZGVyKCkK LQkJCQkuYXBwZW5kKGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIu d2FpdGluZyIpKQotCQkJCS5hcHBlbmQoIjogIikKLQkJCQkuYXBwZW5kKGRvd25sb2FkSXRl bUNvdW50KQotCQkJCS50b1N0cmluZygpOwotCQlkb3dubG9hZEl0ZW1Db3VudExhYmVsLnNl dFRleHQocyk7Ci0JfQorCQkgZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbi5zZXRFbmFibGVkKCFk b3dubG9hZGluZ0FjdGl2YXRlZCk7CisJCSBkb3dubG9hZFBhdXNlQnV0dG9uLnNldEVuYWJs ZWQoZG93bmxvYWRpbmdBY3RpdmF0ZWQpOworCSB9CiAKLQlwcml2YXRlIFBvcHVwTWVudURv d25sb2FkIGdldFBvcHVwTWVudURvd25sb2FkKCkgewotCQlpZiAocG9wdXBNZW51RG93bmxv YWQgPT0gbnVsbCkgewotCQkJcG9wdXBNZW51RG93bmxvYWQgPSBuZXcgUG9wdXBNZW51RG93 bmxvYWQoKTsKLQkJCWxhbmd1YWdlLmFkZExhbmd1YWdlTGlzdGVuZXIocG9wdXBNZW51RG93 bmxvYWQpOwotCQl9Ci0JCXJldHVybiBwb3B1cE1lbnVEb3dubG9hZDsKLQl9CisJIHB1Ymxp YyB2b2lkIHNldERvd25sb2FkSXRlbUNvdW50KGZpbmFsIGludCBuZXdEb3dubG9hZEl0ZW1D b3VudCkgeworCQkgZG93bmxvYWRJdGVtQ291bnQgPSBuZXdEb3dubG9hZEl0ZW1Db3VudDsK IAotCXByaXZhdGUgdm9pZCBzaG93RG93bmxvYWRUYWJsZVBvcHVwTWVudShmaW5hbCBNb3Vz ZUV2ZW50IGUpIHsKLSAgICAgICAgLy8gc2VsZWN0IHJvdyB3aGVyZSByaWdodGNsaWNrIG9j Y3VycmVkIGlmIHJvdyB1bmRlciBtb3VzZSBpcyBOT1Qgc2VsZWN0ZWQKLSAgICAgICAgZmlu YWwgUG9pbnQgcCA9IGUuZ2V0UG9pbnQoKTsKLSAgICAgICAgZmluYWwgaW50IHkgPSBtb2Rl bFRhYmxlLmdldFRhYmxlKCkucm93QXRQb2ludChwKTsKLSAgICAgICAgaWYoIHkgPCAwICkg ewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmKCAhbW9kZWxU YWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbk1vZGVsKCkuaXNTZWxlY3RlZEluZGV4KHkp ICkgewotICAgICAgICAgICAgbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbk1v ZGVsKCkuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoeSwgeSk7Ci0gICAgICAgIH0KLQkJZ2V0UG9w dXBNZW51RG93bmxvYWQoKS5zaG93KGUuZ2V0Q29tcG9uZW50KCksIGUuZ2V0WCgpLCBlLmdl dFkoKSk7Ci0JfQorCQkgZmluYWwgU3RyaW5nIHMgPQorCQkJIG5ldyBTdHJpbmdCdWlsZGVy KCkKKwkJCQkgLmFwcGVuZChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29s YmFyLndhaXRpbmciKSkKKwkJCQkgLmFwcGVuZCgiOiAiKQorCQkJCSAuYXBwZW5kKGRvd25s b2FkSXRlbUNvdW50KQorCQkJCSAudG9TdHJpbmcoKTsKKwkJIGRvd25sb2FkSXRlbUNvdW50 TGFiZWwuc2V0VGV4dChzKTsKKwkgfQogCi0JcHJpdmF0ZSB2b2lkIGZvbnRDaGFuZ2VkKCkg ewotCQlmaW5hbCBTdHJpbmcgZm9udE5hbWUgPSBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0VmFs dWUoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FKTsKLQkJZmluYWwgaW50IGZv bnRTdHlsZSA9IENvcmUuZnJvc3RTZXR0aW5ncy5nZXRJbnRWYWx1ZShTZXR0aW5nc0NsYXNz LkZJTEVfTElTVF9GT05UX1NUWUxFKTsKLQkJZmluYWwgaW50IGZvbnRTaXplID0gQ29yZS5m cm9zdFNldHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRf U0laRSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGZvbnROYW1lLCBmb250U3R5bGUsIGZv bnRTaXplKTsKLQkJaWYgKCFmb250LmdldEZhbWlseSgpLmVxdWFscyhmb250TmFtZSkpIHsK LQkJCWxvZ2dlci5zZXZlcmUoIlRoZSBzZWxlY3RlZCBmb250IHdhcyBub3QgZm91bmQgaW4g eW91ciBzeXN0ZW1cbiIgKwotCQkJCQkJICAgIlRoYXQgc2VsZWN0aW9uIHdpbGwgYmUgY2hh bmdlZCB0byBcIlNhbnNTZXJpZlwiLiIpOwotICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRp bmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSwgIlNhbnNT ZXJpZiIpOwotCQkJZm9udCA9IG5ldyBGb250KCJTYW5zU2VyaWYiLCBmb250U3R5bGUsIGZv bnRTaXplKTsKLQkJfQotCQltb2RlbFRhYmxlLnNldEZvbnQoZm9udCk7Ci0JfQorCSBwcml2 YXRlIFBvcHVwTWVudURvd25sb2FkIGdldFBvcHVwTWVudURvd25sb2FkKCkgeworCQkgaWYg KHBvcHVwTWVudURvd25sb2FkID09IG51bGwpIHsKKwkJCSBwb3B1cE1lbnVEb3dubG9hZCA9 IG5ldyBQb3B1cE1lbnVEb3dubG9hZCgpOworCQkJIGxhbmd1YWdlLmFkZExhbmd1YWdlTGlz dGVuZXIocG9wdXBNZW51RG93bmxvYWQpOworCQkgfQorCQkgcmV0dXJuIHBvcHVwTWVudURv d25sb2FkOworCSB9CiAKLQlwcml2YXRlIHZvaWQgZG93bmxvYWRQYXN0ZUJ1dHRvblByZXNz ZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotCQlUcmFuc2ZlcmFibGUgdCA9IFRvb2xraXQu Z2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTeXN0ZW1DbGlwYm9hcmQoKS5nZXRDb250ZW50cyhu dWxsKTsKLQkJU3RyaW5nIHRleHQ7CisJIHByaXZhdGUgdm9pZCBzaG93RG93bmxvYWRUYWJs ZVBvcHVwTWVudShmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJIC8vIHNlbGVjdCByb3cgd2hl cmUgcmlnaHRjbGljayBvY2N1cnJlZCBpZiByb3cgdW5kZXIgbW91c2UgaXMgTk9UIHNlbGVj dGVkCisJCSBmaW5hbCBQb2ludCBwID0gZS5nZXRQb2ludCgpOworCQkgZmluYWwgaW50IHkg PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkucm93QXRQb2ludChwKTsKKwkJIGlmKCB5IDwgMCAp IHsKKwkJCSByZXR1cm47CisJCSB9CisJCSBpZiggIW1vZGVsVGFibGUuZ2V0VGFibGUoKS5n ZXRTZWxlY3Rpb25Nb2RlbCgpLmlzU2VsZWN0ZWRJbmRleCh5KSApIHsKKwkJCSBtb2RlbFRh YmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25JbnRlcnZh bCh5LCB5KTsKKwkJIH0KKwkJIGdldFBvcHVwTWVudURvd25sb2FkKCkuc2hvdyhlLmdldENv bXBvbmVudCgpLCBlLmdldFgoKSwgZS5nZXRZKCkpOworCSB9CiAKLQkJaWYgKHQgPT0gbnVs bCkKLQkJCXJldHVybjsKKwkgcHJpdmF0ZSB2b2lkIGZvbnRDaGFuZ2VkKCkgeworCQkgZmlu YWwgU3RyaW5nIGZvbnROYW1lID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNldHRp bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSk7CisJCSBmaW5hbCBpbnQgZm9udFN0eWxl ID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9M SVNUX0ZPTlRfU1RZTEUpOworCQkgZmluYWwgaW50IGZvbnRTaXplID0gQ29yZS5mcm9zdFNl dHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU0laRSk7 CisJCSBGb250IGZvbnQgPSBuZXcgRm9udChmb250TmFtZSwgZm9udFN0eWxlLCBmb250U2l6 ZSk7CisJCSBpZiAoIWZvbnQuZ2V0RmFtaWx5KCkuZXF1YWxzKGZvbnROYW1lKSkgeworCQkJ IGxvZ2dlci5zZXZlcmUoIlRoZSBzZWxlY3RlZCBmb250IHdhcyBub3QgZm91bmQgaW4geW91 ciBzeXN0ZW1cbiIgKworCQkJICJUaGF0IHNlbGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQgdG8g XCJTYW5zU2VyaWZcIi4iKTsKKwkJCSBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0 dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FLCAiU2Fuc1NlcmlmIik7CisJCQkgZm9u dCA9IG5ldyBGb250KCJTYW5zU2VyaWYiLCBmb250U3R5bGUsIGZvbnRTaXplKTsKKwkJIH0K KwkJIG1vZGVsVGFibGUuc2V0Rm9udChmb250KTsKKwkgfQogCi0JCXRyeSB7Ci0JCQlpZiAo IXQuaXNEYXRhRmxhdm9yU3VwcG9ydGVkKERhdGFGbGF2b3Iuc3RyaW5nRmxhdm9yKSkKLQkJ CQlyZXR1cm47Ci0JCQl0ZXh0ID0gKFN0cmluZyl0LmdldFRyYW5zZmVyRGF0YShEYXRhRmxh dm9yLnN0cmluZ0ZsYXZvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBzdGZ1KSB7Ci0JCQly ZXR1cm47Ci0JCX0KKwkgcHJpdmF0ZSB2b2lkIGRvd25sb2FkUGFzdGVCdXR0b25QcmVzc2Vk KGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJIFRyYW5zZmVyYWJsZSB0ID0gVG9vbGtpdC5n ZXREZWZhdWx0VG9vbGtpdCgpLmdldFN5c3RlbUNsaXBib2FyZCgpLmdldENvbnRlbnRzKG51 bGwpOworCQkgU3RyaW5nIHRleHQ7CiAKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJRmls ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCkuYWRkUmVjZW50 RG93bmxvYWREaXIoZ2V0RG93bmxvYWREaXIoKSk7Ci0JCQlGaWxlVHJhbnNmZXJNYW5hZ2Vy Lmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5hZGRLZXlzKHRleHQsIGdldERvd25sb2Fk RGlyKCkpOwotCQl9Ci0JfQorCQkgaWYgKHQgPT0gbnVsbCkKKwkJCSByZXR1cm47CiAKLQlw cml2YXRlIHZvaWQgZG93bmxvYWRBY3RpdmF0ZUJ1dHRvblByZXNzZWQoZmluYWwgQWN0aW9u RXZlbnQgZSkgewotCQlzZXREb3dubG9hZGluZ0FjdGl2YXRlZCh0cnVlKTsKLQl9CisJCSB0 cnkgeworCQkJIGlmICghdC5pc0RhdGFGbGF2b3JTdXBwb3J0ZWQoRGF0YUZsYXZvci5zdHJp bmdGbGF2b3IpKQorCQkJCSByZXR1cm47CisJCQkgdGV4dCA9IChTdHJpbmcpdC5nZXRUcmFu c2ZlckRhdGEoRGF0YUZsYXZvci5zdHJpbmdGbGF2b3IpOworCQkgfSBjYXRjaCAoRXhjZXB0 aW9uIHN0ZnUpIHsKKwkJCSByZXR1cm47CisJCSB9CiAKLSAgICBwcml2YXRlIHZvaWQgZG93 bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotICAgICAg ICBzZXREb3dubG9hZGluZ0FjdGl2YXRlZChmYWxzZSk7Ci0gICAgfQorCQkgaWYgKHRleHQg IT0gbnVsbCkgeworCQkJIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+IGZyb3N0RG93bmxvYWRJ dGVtTGlzdCA9IERvd25sb2FkTWFuYWdlci5wYXJzZUtleXModGV4dCk7CisJCQkgCisJCQkg ZmluYWwgQWRkTmV3RG93bmxvYWRzRGlhbG9nIGFkZE5ld0Rvd25sb2Fkc0RpYWxvZyA9IG5l dyBBZGROZXdEb3dubG9hZHNEaWFsb2coCisJCQkJCSBNYWluRnJhbWUuZ2V0SW5zdGFuY2Uo KSwgZnJvc3REb3dubG9hZEl0ZW1MaXN0KTsKKwkJCSBmcm9zdERvd25sb2FkSXRlbUxpc3Qg PSBhZGROZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0ZW1M aXN0KTsKIAotCXByaXZhdGUgdm9pZCBkb3dubG9hZFRhYmxlRG91YmxlQ2xpY2soZmluYWwg TW91c2VFdmVudCBlKSB7Ci0JCWZpbmFsIGludCBjbGlja2VkQ29sID0gbW9kZWxUYWJsZS5n ZXRUYWJsZSgpLmNvbHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKLQkJZmluYWwgaW50IG1v ZGVsSXggPSBtb2RlbFRhYmxlLmdldFRhYmxlKCkuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1 bW4oY2xpY2tlZENvbCkuZ2V0TW9kZWxJbmRleCgpOwotCQlpZiAobW9kZWxJeCA9PSAwKSB7 Ci0JCQlyZXR1cm47Ci0JCX0KKwkJCSBEb3dubG9hZE1vZGVsIGRvd25sb2FkTW9kZWwgPSBG aWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5nZXRNb2Rl bCgpOworCQkJIGZvcihmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBmcm9zdERvd25sb2FkSXRl bSA6IGZyb3N0RG93bmxvYWRJdGVtTGlzdCApIHsKKwkJCQkgZG93bmxvYWRNb2RlbC5hZGRE b3dubG9hZEl0ZW0oZnJvc3REb3dubG9hZEl0ZW0pOworCQkJIH0KKwkJIH0KKwkgfQogCi0J CWZpbmFsIE1vZGVsSXRlbSBzZWxlY3RlZEl0ZW0gPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVk SXRlbSgpOwotCQlpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwpIHsKLQkJCWZpbmFsIEZyb3N0 RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJdGVt OwotICAgICAgICAgICAgZmluYWwgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZGxJdGVt LmdldERvd25sb2FkRmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICBpZiggIXRhcmdldEZpbGUu aXNGaWxlKCkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQot CQkJbG9nZ2VyLmluZm8oIkV4ZWN1dGluZzogIiArIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQ YXRoKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlFeGVjdXRlRG9jdW1l bnQub3BlbkRvY3VtZW50KHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaChmaW5h bCBUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNz YWdlRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9w ZW4gdGhlIGZpbGU6ICIrdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiXG4iK3QudG9T dHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAg ICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAg IH0KLQkJfQotCX0KKwkgcHJpdmF0ZSB2b2lkIGRvd25sb2FkQWN0aXZhdGVCdXR0b25QcmVz c2VkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJIHNldERvd25sb2FkaW5nQWN0aXZhdGVk KHRydWUpOworCSB9CiAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBmcm9zdC5TZXR0 aW5nc1VwZGF0ZXIjdXBkYXRlU2V0dGluZ3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0 ZVNldHRpbmdzKCkgewotICAgICAgICBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0 dGluZ3NDbGFzcy5ET1dOTE9BRElOR19BQ1RJVkFURUQsIGlzRG93bmxvYWRpbmdBY3RpdmF0 ZWQoKSk7Ci0JfQorCSBwcml2YXRlIHZvaWQgZG93bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQo ZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkgc2V0RG93bmxvYWRpbmdBY3RpdmF0ZWQoZmFs c2UpOworCSB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzaWduSG90a2V5cygpIHsKKwkgcHJp dmF0ZSB2b2lkIGRvd25sb2FkVGFibGVEb3VibGVDbGljayhmaW5hbCBNb3VzZUV2ZW50IGUp IHsKKwkJIGZpbmFsIGludCBjbGlja2VkQ29sID0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmNv bHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKKwkJIGZpbmFsIGludCBtb2RlbEl4ID0gbW9k ZWxUYWJsZS5nZXRUYWJsZSgpLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGNsaWNrZWRD b2wpLmdldE1vZGVsSW5kZXgoKTsKKwkJIGlmIChtb2RlbEl4ID09IDApIHsKKwkJCSByZXR1 cm47CisJCSB9CiAKLSAgICAvLyBhc3NpZ24ga2V5cyAxLTYgLSBzZXQgcHJpb3JpdHkgb2Yg c2VsZWN0ZWQgaXRlbXMKLSAgICAgICAgZmluYWwgQWN0aW9uIHNldFByaW9yaXR5QWN0aW9u ID0gbmV3IEFic3RyYWN0QWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0 aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAg ICAgZmluYWwgaW50IHByaW8gPSBuZXcgSW50ZWdlcihldmVudC5nZXRBY3Rpb25Db21tYW5k KCkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2Vs ZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAg ICAgICAgIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdl cigpLmNoYW5nZUl0ZW1Qcmlvcml0ZXMoc2VsZWN0ZWRJdGVtcywgcHJpbyk7Ci0gICAgICAg ICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hF Tl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlT dHJva2UoS2V5RXZlbnQuVktfMSwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0 TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0 KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfMiwgMCksICJTRVRQUklPIik7 Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NV U0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktf MywgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hF Tl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlT dHJva2UoS2V5RXZlbnQuVktfNCwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0 TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0 KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfNSwgMCksICJTRVRQUklPIik7 Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NV U0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktf NiwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldEFjdGlvbk1hcCgpLnB1dCgiU0VUUFJJ TyIsIHNldFByaW9yaXR5QWN0aW9uKTsKLSAgICB9CisJCSBmaW5hbCBNb2RlbEl0ZW0gc2Vs ZWN0ZWRJdGVtID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW0oKTsKKwkJIGlmIChzZWxl Y3RlZEl0ZW0gIT0gbnVsbCkgeworCQkJIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRl bSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJdGVtOworCQkJIGZpbmFsIEZpbGUg dGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGRsSXRlbS5nZXREb3dubG9hZEZpbGVuYW1lKCkpOwor CQkJIGlmKCAhdGFyZ2V0RmlsZS5pc0ZpbGUoKSApIHsKKwkJCQkgcmV0dXJuOworCQkJIH0K KwkJCSBsb2dnZXIuaW5mbygiRXhlY3V0aW5nOiAiICsgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0 ZVBhdGgoKSk7CisJCQkgdHJ5IHsKKwkJCQkgRXhlY3V0ZURvY3VtZW50Lm9wZW5Eb2N1bWVu dCh0YXJnZXRGaWxlKTsKKwkJCSB9IGNhdGNoKGZpbmFsIFRocm93YWJsZSB0KSB7CisJCQkJ IEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkgIkNvdWxkIG5v dCBvcGVuIHRoZSBmaWxlOiAiK3RhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkrIlxuIit0 LnRvU3RyaW5nKCksCisJCQkJCQkgIkVycm9yIiwKKwkJCQkJCSBKT3B0aW9uUGFuZS5FUlJP Ul9NRVNTQUdFKTsKKwkJCSB9CisJCSB9CisJIH0KIAotICAgIC8qKgotICAgICAqIFJlbmRl cmVyIGRyYXdzIGJhY2tncm91bmQgb2YgRE9ORSBpdGVtcyBpbiBncmVlbi4KLSAgICAgKi8K LSAgICBwcml2YXRlIGNsYXNzIENlbGxSZW5kZXJlciBleHRlbmRzIERlZmF1bHRUYWJsZUNl bGxSZW5kZXJlciB7CisJIC8qIChub24tSmF2YWRvYykKKwkgICogQHNlZSBmcm9zdC5TZXR0 aW5nc1VwZGF0ZXIjdXBkYXRlU2V0dGluZ3MoKQorCSAgKi8KKwkgcHVibGljIHZvaWQgdXBk YXRlU2V0dGluZ3MoKSB7CisJCSBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0dGlu Z3NDbGFzcy5ET1dOTE9BRElOR19BQ1RJVkFURUQsIGlzRG93bmxvYWRpbmdBY3RpdmF0ZWQo KSk7CisJIH0KIAotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIGNvbF9ncmVlbiAgICA9 IG5ldyBDb2xvcigweDAwLCAweDgwLCAweDAwKTsKKwkgcHJpdmF0ZSB2b2lkIGFzc2lnbkhv dGtleXMoKSB7CiAKLSAgICAgICAgcHVibGljIENlbGxSZW5kZXJlcigpIHsKLSAgICAgICAg ICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KKwkJIC8vIGFzc2lnbiBrZXlzIDEtNiAtIHNldCBw cmlvcml0eSBvZiBzZWxlY3RlZCBpdGVtcworCQkgZmluYWwgQWN0aW9uIHNldFByaW9yaXR5 QWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCkgeworCQkJIHB1YmxpYyB2b2lkIGFjdGlv blBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBldmVudCkgeworCQkJCSBmaW5hbCBpbnQg cHJpbyA9IG5ldyBJbnRlZ2VyKGV2ZW50LmdldEFjdGlvbkNvbW1hbmQoKSkuaW50VmFsdWUo KTsKKwkJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUu Z2V0U2VsZWN0ZWRJdGVtcygpOworCQkJCSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5n ZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKHNlbGVjdGVkSXRl bXMsIHByaW8pOworCQkJIH0KKwkJIH07CisJCSBnZXRJbnB1dE1hcChKQ29tcG9uZW50LldI RU5fQU5DRVNUT1JfT0ZfRk9DVVNFRF9DT01QT05FTlQpLnB1dChLZXlTdHJva2UuZ2V0S2V5 U3Ryb2tlKEtleUV2ZW50LlZLXzEsIDApLCAiU0VUUFJJTyIpOworCQkgZ2V0SW5wdXRNYXAo SkNvbXBvbmVudC5XSEVOX0FOQ0VTVE9SX09GX0ZPQ1VTRURfQ09NUE9ORU5UKS5wdXQoS2V5 U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS18yLCAwKSwgIlNFVFBSSU8iKTsKKwkJ IGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBP TkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfMywgMCksICJT RVRQUklPIik7CisJCSBnZXRJbnB1dE1hcChKQ29tcG9uZW50LldIRU5fQU5DRVNUT1JfT0Zf Rk9DVVNFRF9DT01QT05FTlQpLnB1dChLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50 LlZLXzQsIDApLCAiU0VUUFJJTyIpOworCQkgZ2V0SW5wdXRNYXAoSkNvbXBvbmVudC5XSEVO X0FOQ0VTVE9SX09GX0ZPQ1VTRURfQ09NUE9ORU5UKS5wdXQoS2V5U3Ryb2tlLmdldEtleVN0 cm9rZShLZXlFdmVudC5WS181LCAwKSwgIlNFVFBSSU8iKTsKKwkJIGdldElucHV0TWFwKEpD b21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0 cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfNiwgMCksICJTRVRQUklPIik7CisJCSBn ZXRBY3Rpb25NYXAoKS5wdXQoIlNFVFBSSU8iLCBzZXRQcmlvcml0eUFjdGlvbik7CisJIH0K IAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJs ZUNlbGxSZW5kZXJlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGZpbmFsIEpUYWJsZSB0YWJs ZSwKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgIGZpbmFs IGJvb2xlYW4gaXNTZWxlY3RlZCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRm9j dXMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm93LAotICAgICAgICAgICAgZmluYWwgaW50 IGNvbHVtbikgeworCSAvKioKKwkgICogUmVuZGVyZXIgZHJhd3MgYmFja2dyb3VuZCBvZiBE T05FIGl0ZW1zIGluIGdyZWVuLgorCSAgKi8KKwkgcHJpdmF0ZSBjbGFzcyBDZWxsUmVuZGVy ZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIgewogCi0gICAgICAgICAgICBz dXBlci5nZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudCh0YWJsZSwgdmFsdWUsIGlzU2Vs ZWN0ZWQsIC8qaGFzRm9jdXMqLyBmYWxzZSwgcm93LCBjb2x1bW4pOworCQkgcHJpdmF0ZSBm aW5hbCBDb2xvciBjb2xfZ3JlZW4gICAgPSBuZXcgQ29sb3IoMHgwMCwgMHg4MCwgMHgwMCk7 CiAKLSAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3RE b3dubG9hZEl0ZW0pbW9kZWwuZ2V0SXRlbUF0KHJvdyk7CisJCSBwdWJsaWMgQ2VsbFJlbmRl cmVyKCkgeworCQkJIHN1cGVyKCk7CisJCSB9CiAKLSAgICAgICAgICAgIC8vIHNldCBiYWNr Z3JvdW5kIG9mIERPTkUgZG93bmxvYWRzIGdyZWVuCi0gICAgICAgICAgICBpZiggaXRlbS5n ZXRTdGF0ZSgpID09IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUgKSB7Ci0gICAgICAg ICAgICAgICAgc2V0QmFja2dyb3VuZChjb2xfZ3JlZW4pOwotICAgICAgICAgICAgfSBlbHNl IHsKLSAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKG1vZGVsVGFibGUuZ2V0VGFibGUo KS5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgfQorCQkgQE92ZXJyaWRlCisJCSBw dWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KAorCQkJCSBm aW5hbCBKVGFibGUgdGFibGUsCisJCQkJIGZpbmFsIE9iamVjdCB2YWx1ZSwKKwkJCQkgZmlu YWwgYm9vbGVhbiBpc1NlbGVjdGVkLAorCQkJCSBmaW5hbCBib29sZWFuIGhhc0ZvY3VzLAor CQkJCSBmaW5hbCBpbnQgcm93LAorCQkJCSBmaW5hbCBpbnQgY29sdW1uKSB7CiAKLSAgICAg ICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJIHN1cGVyLmdldFRh YmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgaXNTZWxlY3RlZCwgLypo YXNGb2N1cyovIGZhbHNlLCByb3csIGNvbHVtbik7CiAKLSAgICBwcml2YXRlIGNsYXNzIFBv cHVwTWVudURvd25sb2FkIGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVudQotICAgIGltcGxl bWVudHMgQWN0aW9uTGlzdGVuZXIsIExhbmd1YWdlTGlzdGVuZXIgeworCQkJIGZpbmFsIEZy b3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pbW9kZWwuZ2V0SXRl bUF0KHJvdyk7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGV0YWlsc0l0 ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVt IGNvcHlLZXlzQW5kTmFtZXNJdGVtID0gbmV3IEpNZW51SXRlbSgpOwotICAgICAgICBwcml2 YXRlIGZpbmFsIEpNZW51SXRlbSBjb3B5RXh0ZW5kZWRJbmZvSXRlbSA9IG5ldyBKTWVudUl0 ZW0oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGlzYWJsZUFsbERvd25s b2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1l bnVJdGVtIGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7 Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGVuYWJsZUFsbERvd25sb2Fkc0l0 ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVt IGVuYWJsZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLSAgICAg ICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gaW52ZXJ0RW5hYmxlZEFsbEl0ZW0gPSBuZXcg Sk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGludmVydEVu YWJsZWRTZWxlY3RlZEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUg ZmluYWwgSk1lbnVJdGVtIHJlbW92ZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVu dUl0ZW0oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gcmVzdGFydFNlbGVj dGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCSAvLyBzZXQgYmFja2dy b3VuZCBvZiBET05FIGRvd25sb2FkcyBncmVlbgorCQkJIGlmKCBpdGVtLmdldFN0YXRlKCkg PT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRE9ORSApIHsKKwkJCQkgc2V0QmFja2dyb3Vu ZChjb2xfZ3JlZW4pOworCQkJIH0gZWxzZSB7CisJCQkJIHNldEJhY2tncm91bmQobW9kZWxU YWJsZS5nZXRUYWJsZSgpLmdldEJhY2tncm91bmQoKSk7CisJCQkgfQogCi0gICAgICAgIHBy aXZhdGUgZmluYWwgSk1lbnVJdGVtIHN0YXJ0U2VsZWN0ZWREb3dubG9hZHNOb3cgPSBuZXcg Sk1lbnVJdGVtKCk7CisJCQkgcmV0dXJuIHRoaXM7CisJCSB9CisJIH0KIAotICAgICAgICBw cml2YXRlIGZpbmFsIEpNZW51SXRlbSB1c2VUaGlzRG93bmxvYWREaXJJdGVtID0gbmV3IEpN ZW51SXRlbSgpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBqdW1wVG9Bc3Nv Y2lhdGVkTWVzc2FnZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkgcHJpdmF0ZSBjbGFzcyBQb3B1 cE1lbnVEb3dubG9hZCBleHRlbmRzIEpTa2lubmFibGVQb3B1cE1lbnUKKwkgaW1wbGVtZW50 cyBBY3Rpb25MaXN0ZW5lciwgTGFuZ3VhZ2VMaXN0ZW5lciB7CiAKLSAgICAgICAgcHJpdmF0 ZSBKTWVudSBjaGFuZ2VQcmlvcml0eU1lbnUgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpN ZW51SXRlbSBwcmlvMEl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBw cmlvMUl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvMkl0ZW0g PSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvM0l0ZW0gPSBudWxsOwot ICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvNEl0ZW0gPSBudWxsOwotICAgICAgICBw cml2YXRlIEpNZW51SXRlbSBwcmlvNUl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpN ZW51SXRlbSBwcmlvNkl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBy ZW1vdmVGcm9tR3FJdGVtID0gbnVsbDsKKwkJIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRl dGFpbHNJdGVtID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0 ZW0gY29weUtleXNBbmROYW1lc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRl IGZpbmFsIEpNZW51SXRlbSBjb3B5RXh0ZW5kZWRJbmZvSXRlbSA9IG5ldyBKTWVudUl0ZW0o KTsKKwkJIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRpc2FibGVBbGxEb3dubG9hZHNJdGVt ID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGlzYWJs ZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUg ZmluYWwgSk1lbnVJdGVtIGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVt KCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBlbmFibGVTZWxlY3RlZERvd25sb2Fk c0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBp bnZlcnRFbmFibGVkQWxsSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUgZmlu YWwgSk1lbnVJdGVtIGludmVydEVuYWJsZWRTZWxlY3RlZEl0ZW0gPSBuZXcgSk1lbnVJdGVt KCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSByZW1vdmVTZWxlY3RlZERvd25sb2Fk c0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBy ZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHNJdGVtID0gbmV3IEpNZW51SXRlbSgpOwogCi0gICAg ICAgIHByaXZhdGUgSk1lbnVJdGVtIHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMg PSBudWxsOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gc3RhcnRTZWxlY3RlZERvd25s b2Fkc05vdyA9IG5ldyBKTWVudUl0ZW0oKTsKIAotICAgICAgICBwdWJsaWMgUG9wdXBNZW51 RG93bmxvYWQoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgaW5pdGlh bGl6ZSgpOwotICAgICAgICB9CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSB1c2VUaGlz RG93bmxvYWREaXJJdGVtID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBK TWVudUl0ZW0ganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2UgPSBuZXcgSk1lbnVJdGVtKCk7CiAK LSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisJCSBwcml2YXRlIEpNZW51 IGNoYW5nZVByaW9yaXR5TWVudSA9IG51bGw7CisJCSBwcml2YXRlIEpNZW51SXRlbSBwcmlv MEl0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVudUl0ZW0gcHJpbzFJdGVtID0gbnVsbDsK KwkJIHByaXZhdGUgSk1lbnVJdGVtIHByaW8ySXRlbSA9IG51bGw7CisJCSBwcml2YXRlIEpN ZW51SXRlbSBwcmlvM0l0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVudUl0ZW0gcHJpbzRJ dGVtID0gbnVsbDsKKwkJIHByaXZhdGUgSk1lbnVJdGVtIHByaW81SXRlbSA9IG51bGw7CisJ CSBwcml2YXRlIEpNZW51SXRlbSBwcmlvNkl0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVu dUl0ZW0gcmVtb3ZlRnJvbUdxSXRlbSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmKCBQZXJz aXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsKLSAgICAgICAgICAg ICAgICBjaGFuZ2VQcmlvcml0eU1lbnUgPSBuZXcgSk1lbnUoKTsKLSAgICAgICAgICAgICAg ICBwcmlvMEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAgcHJpbzFJ dGVtID0gbmV3IEpNZW51SXRlbSgpOwotICAgICAgICAgICAgICAgIHByaW8ySXRlbSA9IG5l dyBKTWVudUl0ZW0oKTsKLSAgICAgICAgICAgICAgICBwcmlvM0l0ZW0gPSBuZXcgSk1lbnVJ dGVtKCk7Ci0gICAgICAgICAgICAgICAgcHJpbzRJdGVtID0gbmV3IEpNZW51SXRlbSgpOwot ICAgICAgICAgICAgICAgIHByaW81SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLSAgICAgICAg ICAgICAgICBwcmlvNkl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAg cmVtb3ZlRnJvbUdxSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUgSk1lbnVJ dGVtIHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMgPSBudWxsOwogCi0gICAgICAg ICAgICAgICAgY2hhbmdlUHJpb3JpdHlNZW51LmFkZChwcmlvMEl0ZW0pOwotICAgICAgICAg ICAgICAgIGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzFJdGVtKTsKLSAgICAgICAgICAg ICAgICBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8ySXRlbSk7Ci0gICAgICAgICAgICAg ICAgY2hhbmdlUHJpb3JpdHlNZW51LmFkZChwcmlvM0l0ZW0pOwotICAgICAgICAgICAgICAg IGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzRJdGVtKTsKLSAgICAgICAgICAgICAgICBj aGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW81SXRlbSk7Ci0gICAgICAgICAgICAgICAgY2hh bmdlUHJpb3JpdHlNZW51LmFkZChwcmlvNkl0ZW0pOworCQkgcHVibGljIFBvcHVwTWVudURv d25sb2FkKCkgeworCQkJIHN1cGVyKCk7CisJCQkgaW5pdGlhbGl6ZSgpOworCQkgfQogCi0g ICAgICAgICAgICAgICAgcHJpbzBJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAg ICAgICAgICAgICAgIHByaW8xSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAg ICAgICAgICAgICBwcmlvMkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAg ICAgICAgICAgcHJpbzNJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAg ICAgICAgIHByaW80SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAg ICAgICBwcmlvNUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAg ICAgcHJpbzZJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAg IHJlbW92ZUZyb21HcUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCSBwcml2YXRl IHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAotICAgICAgICAgICAgICAgIHJldHJpZXZlRGlyZWN0 RXh0ZXJuYWxEb3dubG9hZHMgPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAg cmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fkcy5hZGRBY3Rpb25MaXN0ZW5lcih0aGlz KTsKLSAgICAgICAgICAgIH0KKwkJCSBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lz dGVuY2VFbmFibGVkKCkgKSB7CisJCQkJIGNoYW5nZVByaW9yaXR5TWVudSA9IG5ldyBKTWVu dSgpOworCQkJCSBwcmlvMEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHByaW8xSXRl bSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCQkgcHJpbzJJdGVtID0gbmV3IEpNZW51SXRlbSgp OworCQkJCSBwcmlvM0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHByaW80SXRlbSA9 IG5ldyBKTWVudUl0ZW0oKTsKKwkJCQkgcHJpbzVJdGVtID0gbmV3IEpNZW51SXRlbSgpOwor CQkJCSBwcmlvNkl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHJlbW92ZUZyb21HcUl0 ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CiAKLSAgICAgICAgICAgIHJlZnJlc2hMYW5ndWFnZSgp OworCQkJCSBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8wSXRlbSk7CisJCQkJIGNoYW5n ZVByaW9yaXR5TWVudS5hZGQocHJpbzFJdGVtKTsKKwkJCQkgY2hhbmdlUHJpb3JpdHlNZW51 LmFkZChwcmlvMkl0ZW0pOworCQkJCSBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8zSXRl bSk7CisJCQkJIGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzRJdGVtKTsKKwkJCQkgY2hh bmdlUHJpb3JpdHlNZW51LmFkZChwcmlvNUl0ZW0pOworCQkJCSBjaGFuZ2VQcmlvcml0eU1l bnUuYWRkKHByaW82SXRlbSk7CiAKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBj YW5jZWwgb2YgZG93bmxvYWRzCisJCQkJIHByaW8wSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0 aGlzKTsKKwkJCQkgcHJpbzFJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCSBw cmlvMkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJIHByaW8zSXRlbS5hZGRB Y3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkgcHJpbzRJdGVtLmFkZEFjdGlvbkxpc3RlbmVy KHRoaXMpOworCQkJCSBwcmlvNUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJ IHByaW82SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkgcmVtb3ZlRnJvbUdx SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKIAotICAgICAgICAgICAgY29weUtleXNB bmROYW1lc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBjb3B5 RXh0ZW5kZWRJbmZvSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAg IHJlc3RhcnRTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7 Ci0gICAgICAgICAgICByZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlz dGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBlbmFibGVBbGxEb3dubG9hZHNJdGVtLmFkZEFj dGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgZGlzYWJsZUFsbERvd25sb2Fkc0l0 ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBlbmFibGVTZWxlY3Rl ZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBk aXNhYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwot ICAgICAgICAgICAgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhp cyk7Ci0gICAgICAgICAgICBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtLmFkZEFjdGlvbkxp c3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgZGV0YWlsc0l0ZW0uYWRkQWN0aW9uTGlzdGVu ZXIodGhpcyk7Ci0gICAgICAgICAgICBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93LmFkZEFj dGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgdXNlVGhpc0Rvd25sb2FkRGlySXRl bS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGp1bXBUb0Fzc29jaWF0 ZWRNZXNzYWdlLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9CisJCQkJIHJl dHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMgPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJ IHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMuYWRkQWN0aW9uTGlzdGVuZXIodGhp cyk7CisJCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWZyZXNoTGFuZ3VhZ2UoKSB7 Ci0gICAgICAgICAgICBkZXRhaWxzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygi Q29tbW9uLmRldGFpbHMiKSk7Ci0gICAgICAgICAgICBjb3B5S2V5c0FuZE5hbWVzSXRlbS5z ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5jb3B5 S2V5c1dpdGhGaWxlbmFtZXMiKSk7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5kZWRJbmZvSXRl bS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5j b3B5RXh0ZW5kZWRJbmZvIikpOwotICAgICAgICAgICAgcmVzdGFydFNlbGVjdGVkRG93bmxv YWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVU YWJsZS5wb3B1cG1lbnUucmVzdGFydFNlbGVjdGVkRG93bmxvYWRzIikpOwotICAgICAgICAg ICAgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZW1vdmUucmVtb3ZlU2Vs ZWN0ZWREb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBlbmFibGVBbGxEb3dubG9hZHNJdGVt LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBv cHVwbWVudS5lbmFibGVEb3dubG9hZHMuZW5hYmxlQWxsRG93bmxvYWRzIikpOwotICAgICAg ICAgICAgZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJp bmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LmVuYWJsZURvd25sb2Fkcy5k aXNhYmxlQWxsRG93bmxvYWRzIikpOwotICAgICAgICAgICAgZW5hYmxlU2VsZWN0ZWREb3du bG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmls ZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMuZW5hYmxlU2VsZWN0ZWREb3dubG9h ZHMiKSk7Ci0gICAgICAgICAgICBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRl eHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVu dS5lbmFibGVEb3dubG9hZHMuZGlzYWJsZVNlbGVjdGVkRG93bmxvYWRzIikpOwotICAgICAg ICAgICAgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmco IkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LmVuYWJsZURvd25sb2Fkcy5pbnZl cnRFbmFibGVkU3RhdGVGb3JBbGxEb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBpbnZlcnRF bmFibGVkU2VsZWN0ZWRJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9h ZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMuaW52ZXJ0RW5hYmxl ZFN0YXRlRm9yU2VsZWN0ZWREb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBzdGFydFNlbGVj dGVkRG93bmxvYWRzTm93LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBh bmUuZmlsZVRhYmxlLnBvcHVwbWVudS5zdGFydFNlbGVjdGVkRG93bmxvYWRzTm93IikpOwot ICAgICAgICAgICAgdXNlVGhpc0Rvd25sb2FkRGlySXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdl dFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUudXNlVGhpc0Rvd25s b2FkRGlyIikpOwotICAgICAgICAgICAganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2Uuc2V0VGV4 dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51 Lmp1bXBUb0Fzc29jaWF0ZWRNZXNzYWdlIikpOworCQkJIHJlZnJlc2hMYW5ndWFnZSgpOwog Ci0gICAgICAgICAgICBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VFbmFi bGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlUHJpb3JpdHlNZW51LnNldFRleHQo bGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkuY2hhbmdlUHJpb3JpdHkiKSk7 Ci0gICAgICAgICAgICAgICAgcHJpbzBJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5n KCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHkwIikpOwotICAgICAgICAgICAgICAgIHByaW8x SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9y aXR5MSIpKTsKLSAgICAgICAgICAgICAgICBwcmlvMkl0ZW0uc2V0VGV4dChsYW5ndWFnZS5n ZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTIiKSk7Ci0gICAgICAgICAgICAg ICAgcHJpbzNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3Jp dHkucHJpb3JpdHkzIikpOwotICAgICAgICAgICAgICAgIHByaW80SXRlbS5zZXRUZXh0KGxh bmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9yaXR5NCIpKTsKLSAgICAg ICAgICAgICAgICBwcmlvNUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1v bi5wcmlvcml0eS5wcmlvcml0eTUiKSk7Ci0gICAgICAgICAgICAgICAgcHJpbzZJdGVtLnNl dFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHk2Iikp OwotICAgICAgICAgICAgICAgIHJlbW92ZUZyb21HcUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5n ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LnJlbW92ZUZyb21H bG9iYWxRdWV1ZSIpKTsKKwkJCSAvLyBUT0RPOiBpbXBsZW1lbnQgY2FuY2VsIG9mIGRvd25s b2FkcwogCi0gICAgICAgICAgICAgICAgcmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fk cy5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5w b3B1cG1lbnUucmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2FkcyIpKTsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgfQorCQkJIGNvcHlLZXlzQW5kTmFtZXNJdGVtLmFkZEFjdGlvbkxp c3RlbmVyKHRoaXMpOworCQkJIGNvcHlFeHRlbmRlZEluZm9JdGVtLmFkZEFjdGlvbkxpc3Rl bmVyKHRoaXMpOworCQkJIHJlc3RhcnRTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9u TGlzdGVuZXIodGhpcyk7CisJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFkZEFj dGlvbkxpc3RlbmVyKHRoaXMpOworCQkJIGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0uYWRkQWN0 aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0uYWRkQWN0 aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFk ZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJIGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0 ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0u YWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkSXRl bS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCSBkZXRhaWxzSXRlbS5hZGRBY3Rpb25M aXN0ZW5lcih0aGlzKTsKKwkJCSBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93LmFkZEFjdGlv bkxpc3RlbmVyKHRoaXMpOworCQkJIHVzZVRoaXNEb3dubG9hZERpckl0ZW0uYWRkQWN0aW9u TGlzdGVuZXIodGhpcyk7CisJCQkganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2UuYWRkQWN0aW9u TGlzdGVuZXIodGhpcyk7CisJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVy Zm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldFNv dXJjZSgpID09IGNvcHlLZXlzQW5kTmFtZXNJdGVtKSB7Ci0gICAgICAgICAgICAgICAgQ29w eVRvQ2xpcGJvYXJkLmNvcHlLZXlzQW5kRmlsZW5hbWVzKG1vZGVsVGFibGUuZ2V0U2VsZWN0 ZWRJdGVtcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBj b3B5RXh0ZW5kZWRJbmZvSXRlbSkgewotICAgICAgICAgICAgICAgIENvcHlUb0NsaXBib2Fy ZC5jb3B5RXh0ZW5kZWRJbmZvKG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLSAg ICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXN0YXJ0U2VsZWN0ZWRE b3dubG9hZHNJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmVzdGFydFNlbGVjdGVkRG93bmxv YWRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gdXNlVGhp c0Rvd25sb2FkRGlySXRlbSkgewotICAgICAgICAgICAgICAgIHVzZVRoaXNEb3dubG9hZERp cmVjdG9yeSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGp1 bXBUb0Fzc29jaWF0ZWRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAganVtcFRvQXNzb2Np YXRlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9 PSByZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAgICByZW1v dmVTZWxlY3RlZERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNv dXJjZSgpID09IGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAgICBl bmFibGVBbGxEb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy Y2UoKSA9PSBkaXNhYmxlQWxsRG93bmxvYWRzSXRlbSkgewotICAgICAgICAgICAgICAgIGRp c2FibGVBbGxEb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy Y2UoKSA9PSBlbmFibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAg ICBlbmFibGVTZWxlY3RlZERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChl LmdldFNvdXJjZSgpID09IGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAg ICAgICAgICAgICBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0g ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBpbnZlcnRFbmFibGVkQWxsSXRlbSkgewotICAg ICAgICAgICAgICAgIGludmVydEVuYWJsZWRBbGwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBp ZiAoZS5nZXRTb3VyY2UoKSA9PSBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKSB7Ci0gICAg ICAgICAgICAgICAgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9IGVs c2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZGV0YWlsc0l0ZW0pIHsKLSAgICAgICAgICAgICAg ICBzaG93RGV0YWlscygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp ID09IHByaW8wSXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDApOwot ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHByaW8xSXRlbSkgewot ICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDEpOwotICAgICAgICAgICAgfSBlbHNl IGlmIChlLmdldFNvdXJjZSgpID09IHByaW8ySXRlbSkgewotICAgICAgICAgICAgICAgIGNo YW5nZVByaW9yaXR5KDIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp ID09IHByaW8zSXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDMpOwot ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHByaW80SXRlbSkgewot ICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDQpOwotICAgICAgICAgICAgfSBlbHNl IGlmIChlLmdldFNvdXJjZSgpID09IHByaW81SXRlbSkgewotICAgICAgICAgICAgICAgIGNo YW5nZVByaW9yaXR5KDUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp ID09IHByaW82SXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDYpOwot ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHJlbW92ZUZyb21HcUl0 ZW0pIHsKLSAgICAgICAgICAgICAgICByZW1vdmVTZWxlY3RlZFVwbG9hZHNGcm9tR2xvYmFs UXVldWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXRy aWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0cmll dmVEaXJlY3RFeHRlcm5hbERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChl LmdldFNvdXJjZSgpID09IHN0YXJ0U2VsZWN0ZWREb3dubG9hZHNOb3cgKSB7Ci0gICAgICAg ICAgICAgICAgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpOwotICAgICAgICAgICAgfQot ICAgICAgICB9CisJCSBwcml2YXRlIHZvaWQgcmVmcmVzaExhbmd1YWdlKCkgeworCQkJIGRl dGFpbHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24uZGV0YWlscyIp KTsKKwkJCSBjb3B5S2V5c0FuZE5hbWVzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmlu ZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5jb3B5S2V5c1dpdGhGaWxlbmFtZXMiKSk7CisJ CQkgY29weUV4dGVuZGVkSW5mb0l0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkNv bW1vbi5jb3B5VG9DbGlwQm9hcmQuY29weUV4dGVuZGVkSW5mbyIpKTsKKwkJCSByZXN0YXJ0 U2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3du bG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHMi KSk7CisJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2Uu Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZW1vdmUucmVt b3ZlU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgZW5hYmxlQWxsRG93bmxvYWRzSXRlbS5z ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1 cG1lbnUuZW5hYmxlRG93bmxvYWRzLmVuYWJsZUFsbERvd25sb2FkcyIpKTsKKwkJCSBkaXNh YmxlQWxsRG93bmxvYWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv YWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzLmRpc2FibGVBbGxE b3dubG9hZHMiKSk7CisJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQo bGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5l bmFibGVEb3dubG9hZHMuZW5hYmxlU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgZGlzYWJs ZVNlbGVjdGVkRG93bmxvYWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93 bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzLmRpc2FibGVT ZWxlY3RlZERvd25sb2FkcyIpKTsKKwkJCSBpbnZlcnRFbmFibGVkQWxsSXRlbS5zZXRUZXh0 KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUu ZW5hYmxlRG93bmxvYWRzLmludmVydEVuYWJsZWRTdGF0ZUZvckFsbERvd25sb2FkcyIpKTsK KwkJCSBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMu aW52ZXJ0RW5hYmxlZFN0YXRlRm9yU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgc3RhcnRT ZWxlY3RlZERvd25sb2Fkc05vdy5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv YWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdyIp KTsKKwkJCSB1c2VUaGlzRG93bmxvYWREaXJJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS51c2VUaGlzRG93bmxvYWRE aXIiKSk7CisJCQkganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2Uuc2V0VGV4dChsYW5ndWFnZS5n ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51Lmp1bXBUb0Fzc29j aWF0ZWRNZXNzYWdlIikpOwogCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rl ZFVwbG9hZHNGcm9tR2xvYmFsUXVldWUoKSB7Ci0gICAgICAgICAgICBpZiggRmlsZVRyYW5z ZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsK LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBm aW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3Rl ZEl0ZW1zKCk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVxdWVzdHNUb1Jl bW92ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZmluYWwgTGlz dDxGcm9zdERvd25sb2FkSXRlbT4gaXRlbXNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8RnJv c3REb3dubG9hZEl0ZW0+KCk7Ci0gICAgICAgICAgICBmb3IoZmluYWwgTW9kZWxJdGVtIG1p IDogc2VsZWN0ZWRJdGVtcykgewotICAgICAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93bmxv YWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIG1pOwotICAgICAgICAgICAgICAg IGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIo KS5pc0l0ZW1Jbkdsb2JhbFF1ZXVlKGl0ZW0pICkgewotICAgICAgICAgICAgICAgICAgICBy ZXF1ZXN0c1RvUmVtb3ZlLmFkZCggaXRlbS5nZXRHcUlkZW50aWZpZXIoKSApOwotICAgICAg ICAgICAgICAgICAgICBpdGVtc1RvVXBkYXRlLmFkZChpdGVtKTsKLSAgICAgICAgICAgICAg ICAgICAgaXRlbS5zZXRJbnRlcm5hbFJlbW92ZUV4cGVjdGVkKHRydWUpOwotICAgICAgICAg ICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGVUcmFuc2Zlck1hbmFn ZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpLnJlbW92ZVJlcXVlc3RzKHJlcXVl c3RzVG9SZW1vdmUpOwotICAgICAgICAgICAgLy8gYWZ0ZXIgcmVtb3ZlLCB1cGRhdGUgc3Rh dGUgb2YgcmVtb3ZlZCBpdGVtcwotICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93bmxv YWRJdGVtIGl0ZW0gOiBpdGVtc1RvVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgaXRlbS5z ZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlUSU5HKTsKLSAgICAgICAgICAg ICAgICBpdGVtLnNldEVuYWJsZWQoQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAgICAg aXRlbS5zZXRQcmlvcml0eSgtMSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5maXJlVmFsdWVD aGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCSBpZiggUGVyc2lzdGVu Y2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VFbmFibGVkKCkgKSB7CisJCQkJIGNoYW5nZVByaW9y aXR5TWVudS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LmNo YW5nZVByaW9yaXR5IikpOworCQkJCSBwcmlvMEl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRT dHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTAiKSk7CisJCQkJIHByaW8xSXRlbS5z ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9yaXR5MSIp KTsKKwkJCQkgcHJpbzJJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24u cHJpb3JpdHkucHJpb3JpdHkyIikpOworCQkJCSBwcmlvM0l0ZW0uc2V0VGV4dChsYW5ndWFn ZS5nZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTMiKSk7CisJCQkJIHByaW80 SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9y aXR5NCIpKTsKKwkJCQkgcHJpbzVJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJD b21tb24ucHJpb3JpdHkucHJpb3JpdHk1IikpOworCQkJCSBwcmlvNkl0ZW0uc2V0VGV4dChs YW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTYiKSk7CisJCQkJ IHJlbW92ZUZyb21HcUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2Fk UGFuZS5maWxlVGFibGUucG9wdXBtZW51LnJlbW92ZUZyb21HbG9iYWxRdWV1ZSIpKTsKIAot ICAgICAgICBwcml2YXRlIHZvaWQgcmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fkcygp IHsKLSAgICAgICAgICAgIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJz aXN0ZW5jZU1hbmFnZXIoKSA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHJldHVybjsK LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVk SXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKLSAgICAgICAgICAgIGZv cihmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0ZW1zKSB7Ci0gICAgICAgICAgICAg ICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkg bWk7Ci0gICAgICAgICAgICAgICAgaWYoIGl0ZW0uaXNFeHRlcm5hbCgpICYmIGl0ZW0uaXNE aXJlY3QoKSAmJiBpdGVtLmdldFN0YXRlKCkgPT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVf RE9ORSApIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBleHBlY3RlZEZpbGVT aXplID0gaXRlbS5nZXRGaWxlU2l6ZSgpOyAvLyBzZXQgZnJvbSBnbG9iYWwgcXVldWUKLSAg ICAgICAgICAgICAgICAgICAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lz dGVuY2VNYW5hZ2VyKCkubWF5YmVFbnF1ZXVlRGlyZWN0R2V0KGl0ZW0sIGV4cGVjdGVkRmls ZVNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQor CQkJCSByZXRyaWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzLnNldFRleHQobGFuZ3VhZ2Uu Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZXRyaWV2ZURp cmVjdEV4dGVybmFsRG93bmxvYWRzIikpOworCQkJIH0KKwkJIH0KIAotICAgICAgICBwcml2 YXRlIHZvaWQgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpIHsKLSAgICAgICAgICAgIGZp bmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVk SXRlbXMoKTsKKwkJIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25F dmVudCBlKSB7CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gY29weUtleXNBbmROYW1lc0l0 ZW0pIHsKKwkJCQkgQ29weVRvQ2xpcGJvYXJkLmNvcHlLZXlzQW5kRmlsZW5hbWVzKG1vZGVs VGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKKwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNl KCkgPT0gY29weUV4dGVuZGVkSW5mb0l0ZW0pIHsKKwkJCQkgQ29weVRvQ2xpcGJvYXJkLmNv cHlFeHRlbmRlZEluZm8obW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCkpOworCQkJIH0g ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHNJdGVt KSB7CisJCQkJIHJlc3RhcnRTZWxlY3RlZERvd25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAo ZS5nZXRTb3VyY2UoKSA9PSB1c2VUaGlzRG93bmxvYWREaXJJdGVtKSB7CisJCQkJIHVzZVRo aXNEb3dubG9hZERpcmVjdG9yeSgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9 PSBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSkgeworCQkJCSBqdW1wVG9Bc3NvY2lhdGVkTWVz c2FnZSgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZW1vdmVTZWxlY3Rl ZERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJ CSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZW5hYmxlQWxsRG93bmxvYWRzSXRlbSkg eworCQkJCSBlbmFibGVBbGxEb3dubG9hZHMoKTsKKwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291 cmNlKCkgPT0gZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgZGlzYWJsZUFsbERv d25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBlbmFibGVTZWxl Y3RlZERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsK KwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZGlzYWJsZVNlbGVjdGVkRG93bmxv YWRzSXRlbSkgeworCQkJCSBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJCSB9IGVs c2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gaW52ZXJ0RW5hYmxlZEFsbEl0ZW0pIHsKKwkJCQkg aW52ZXJ0RW5hYmxlZEFsbCgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBp bnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKSB7CisJCQkJIGludmVydEVuYWJsZWRTZWxlY3Rl ZCgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkZXRhaWxzSXRlbSkgewor CQkJCSBzaG93RGV0YWlscygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBw cmlvMEl0ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoMCk7CisJCQkgfSBlbHNlIGlmIChl LmdldFNvdXJjZSgpID09IHByaW8xSXRlbSkgeworCQkJCSBjaGFuZ2VQcmlvcml0eSgxKTsK KwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gcHJpbzJJdGVtKSB7CisJCQkJIGNo YW5nZVByaW9yaXR5KDIpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBwcmlv M0l0ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoMyk7CisJCQkgfSBlbHNlIGlmIChlLmdl dFNvdXJjZSgpID09IHByaW80SXRlbSkgeworCQkJCSBjaGFuZ2VQcmlvcml0eSg0KTsKKwkJ CSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gcHJpbzVJdGVtKSB7CisJCQkJIGNoYW5n ZVByaW9yaXR5KDUpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBwcmlvNkl0 ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoNik7CisJCQkgfSBlbHNlIGlmIChlLmdldFNv dXJjZSgpID09IHJlbW92ZUZyb21HcUl0ZW0pIHsKKwkJCQkgcmVtb3ZlU2VsZWN0ZWRVcGxv YWRzRnJvbUdsb2JhbFF1ZXVlKCk7CisJCQkgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09 IHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMpIHsKKwkJCQkgcmV0cmlldmVEaXJl Y3RFeHRlcm5hbERvd25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9 PSBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93ICkgeworCQkJCSBzdGFydFNlbGVjdGVkRG93 bmxvYWRzTm93KCk7CisJCQkgfQorCQkgfQogCi0gICAgICAgICAgICBmaW5hbCBMaXN0PEZy b3N0RG93bmxvYWRJdGVtPiBpdGVtc1RvU3RhcnQgPSBuZXcgTGlua2VkTGlzdDxGcm9zdERv d25sb2FkSXRlbT4oKTsKLSAgICAgICAgICAgIGZvciggZmluYWwgTW9kZWxJdGVtIG1pIDog c2VsZWN0ZWRJdGVtcyApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2Fk SXRlbSBpID0gKEZyb3N0RG93bmxvYWRJdGVtKW1pOwotICAgICAgICAgICAgICAgIGlmKCBp LmlzRXh0ZXJuYWwoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBpLmdldFN0YXRlKCkgIT0gRnJv c3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyApIHsKLSAgICAgICAgICAgICAgICAgICAg Y29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBpLmdl dEtleSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpdGVtc1RvU3RhcnQuYWRkKGkpOwot ICAgICAgICAgICAgfQorCQkgcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGVkVXBsb2Fkc0Zy b21HbG9iYWxRdWV1ZSgpIHsKKwkJCSBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCku Z2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsKKwkJCQkgcmV0dXJuOworCQkJ IH0KKwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5n ZXRTZWxlY3RlZEl0ZW1zKCk7CisJCQkgZmluYWwgTGlzdDxTdHJpbmc+IHJlcXVlc3RzVG9S ZW1vdmUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCSBmaW5hbCBMaXN0PEZyb3N0 RG93bmxvYWRJdGVtPiBpdGVtc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxGcm9zdERvd25s b2FkSXRlbT4oKTsKKwkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVt cykgeworCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxv YWRJdGVtKSBtaTsKKwkJCQkgaWYoIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBl cnNpc3RlbmNlTWFuYWdlcigpLmlzSXRlbUluR2xvYmFsUXVldWUoaXRlbSkgKSB7CisJCQkJ CSByZXF1ZXN0c1RvUmVtb3ZlLmFkZCggaXRlbS5nZXRHcUlkZW50aWZpZXIoKSApOworCQkJ CQkgaXRlbXNUb1VwZGF0ZS5hZGQoaXRlbSk7CisJCQkJCSBpdGVtLnNldEludGVybmFsUmVt b3ZlRXhwZWN0ZWQodHJ1ZSk7CisJCQkJIH0KKwkJCSB9CisJCQkgRmlsZVRyYW5zZmVyTWFu YWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkucmVtb3ZlUmVxdWVzdHMocmVx dWVzdHNUb1JlbW92ZSk7CisJCQkgLy8gYWZ0ZXIgcmVtb3ZlLCB1cGRhdGUgc3RhdGUgb2Yg cmVtb3ZlZCBpdGVtcworCQkJIGZvcihmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtIDog aXRlbXNUb1VwZGF0ZSkgeworCQkJCSBpdGVtLnNldFN0YXRlKEZyb3N0RG93bmxvYWRJdGVt LlNUQVRFX1dBSVRJTkcpOworCQkJCSBpdGVtLnNldEVuYWJsZWQoQm9vbGVhbi5GQUxTRSk7 CisJCQkJIGl0ZW0uc2V0UHJpb3JpdHkoLTEpOworCQkJCSBpdGVtLmZpcmVWYWx1ZUNoYW5n ZWQoKTsKKwkJCSB9CisJCSB9CiAKLSAgICAgICAgICAgIGZvcihmaW5hbCBGcm9zdERvd25s b2FkSXRlbSBkbEl0ZW0gOiBpdGVtc1RvU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBkbEl0 ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5h Z2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5zdGFydERvd25sb2FkKGRsSXRlbSk7 Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJIHByaXZhdGUgdm9pZCByZXRyaWV2ZURp cmVjdEV4dGVybmFsRG93bmxvYWRzKCkgeworCQkJIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2Vy Lmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSA9PSBudWxsICkgeworCQkJCSByZXR1 cm47CisJCQkgfQorCQkJIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2Rl bFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKKwkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1p IDogc2VsZWN0ZWRJdGVtcykgeworCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVt ID0gKEZyb3N0RG93bmxvYWRJdGVtKSBtaTsKKwkJCQkgaWYoIGl0ZW0uaXNFeHRlcm5hbCgp ICYmIGl0ZW0uaXNEaXJlY3QoKSAmJiBpdGVtLmdldFN0YXRlKCkgPT0gRnJvc3REb3dubG9h ZEl0ZW0uU1RBVEVfRE9ORSApIHsKKwkJCQkJIGZpbmFsIGxvbmcgZXhwZWN0ZWRGaWxlU2l6 ZSA9IGl0ZW0uZ2V0RmlsZVNpemUoKTsgLy8gc2V0IGZyb20gZ2xvYmFsIHF1ZXVlCisJCQkJ CSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5t YXliZUVucXVldWVEaXJlY3RHZXQoaXRlbSwgZXhwZWN0ZWRGaWxlU2l6ZSk7CisJCQkJIH0K KwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVByaW9yaXR5KGZp bmFsIGludCBwcmlvKSB7Ci0gICAgICAgICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5p bnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAg ICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBNb2RlbEl0 ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0g ICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1h bmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKHNlbGVjdGVkSXRlbXMsIHByaW8pOwotICAg ICAgICB9CisJCSBwcml2YXRlIHZvaWQgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpIHsK KwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT ZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNob3dEZXRhaWxzKCkg ewotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVs VGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRl bXMubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0 RG93bmxvYWRJdGVtKSBzZWxlY3RlZEl0ZW1zWzBdOwotICAgICAgICAgICAgaWYoICFpdGVt LmlzU2hhcmVkRmlsZSgpICkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgICAgIG5ldyBGaWxlTGlzdEZpbGVEZXRhaWxzRGlhbG9nKE1haW5G cmFtZS5nZXRJbnN0YW5jZSgpKS5zdGFydERpYWxvZyhpdGVtLmdldEZpbGVMaXN0RmlsZU9i amVjdCgpKTsKLSAgICAgICAgfQorCQkJIGZpbmFsIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+ IGl0ZW1zVG9TdGFydCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxvYWRJdGVtPigpOwor CQkJIGZvciggZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVtcyApIHsKKwkJCQkg ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSA9IChGcm9zdERvd25sb2FkSXRlbSltaTsKKwkJ CQkgaWYoIGkuaXNFeHRlcm5hbCgpICkgeworCQkJCQkgY29udGludWU7CisJCQkJIH0KKwkJ CQkgaWYoIGkuZ2V0U3RhdGUoKSAhPSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlUSU5H ICkgeworCQkJCQkgY29udGludWU7CisJCQkJIH0KKwkJCQkgaWYoIGkuZ2V0S2V5KCkgPT0g bnVsbCApIHsKKwkJCQkJIGNvbnRpbnVlOworCQkJCSB9CisJCQkJIGl0ZW1zVG9TdGFydC5h ZGQoaSk7CisJCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkU2Vs ZWN0ZWQoKSB7Ci0gICAgICAgICAgICBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1z ID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0gICAgICAgICAgICBtb2RlbC5z ZXRJdGVtc0VuYWJsZWQobnVsbCwgc2VsZWN0ZWRJdGVtcyk7Ci0gICAgICAgIH0KKwkJCSBm b3IoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtIDogaXRlbXNUb1N0YXJ0KSB7CisJ CQkJIGRsSXRlbS5zZXRFbmFibGVkKHRydWUpOworCQkJCSBGaWxlVHJhbnNmZXJNYW5hZ2Vy Lmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5zdGFydERvd25sb2FkKGRsSXRlbSk7CisJ CQkgfQorCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkQWxsKCkg ewotICAgICAgICAgICAgbW9kZWwuc2V0QWxsSXRlbXNFbmFibGVkKG51bGwpOwotICAgICAg ICB9CisJCSBwcml2YXRlIHZvaWQgY2hhbmdlUHJpb3JpdHkoZmluYWwgaW50IHByaW8pIHsK KwkJCSBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5h Z2VyKCkgPT0gbnVsbCApIHsKKwkJCQkgcmV0dXJuOworCQkJIH0KKwkJCSBmaW5hbCBNb2Rl bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7 CisJCQkgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2Vy KCkuY2hhbmdlSXRlbVByaW9yaXRlcyhzZWxlY3RlZEl0ZW1zLCBwcmlvKTsKKwkJIH0KIAot ICAgICAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVNlbGVjdGVkRG93bmxvYWRzKCkgewotICAg ICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUu Z2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgbW9kZWwuc2V0SXRlbXNFbmFibGVk KEJvb2xlYW4uRkFMU0UsIHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9CisJCSBwcml2YXRl IHZvaWQgc2hvd0RldGFpbHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJ dGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIGlmIChzZWxlY3Rl ZEl0ZW1zLmxlbmd0aCAhPSAxKSB7CisJCQkJIHJldHVybjsKKwkJCSB9CisJCQkgZmluYWwg RnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJ dGVtc1swXTsKKwkJCSBpZiggIWl0ZW0uaXNTaGFyZWRGaWxlKCkgKSB7CisJCQkJIHJldHVy bjsKKwkJCSB9CisJCQkgbmV3IEZpbGVMaXN0RmlsZURldGFpbHNEaWFsb2coTWFpbkZyYW1l LmdldEluc3RhbmNlKCkpLnN0YXJ0RGlhbG9nKGl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0 KCkpOworCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbmFibGVTZWxlY3RlZERvd25s b2FkcygpIHsKLSAgICAgICAgICAgIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMg PSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKLSAgICAgICAgICAgIG1vZGVsLnNl dEl0ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUsIHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9 CisJCSBwcml2YXRlIHZvaWQgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkKCkgeworCQkJIGZpbmFs IE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRl bXMoKTsKKwkJCSBtb2RlbC5zZXRJdGVtc0VuYWJsZWQobnVsbCwgc2VsZWN0ZWRJdGVtcyk7 CisJCSB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVBbGxEb3dubG9hZHMoKSB7 Ci0gICAgICAgICAgICBtb2RlbC5zZXRBbGxJdGVtc0VuYWJsZWQoQm9vbGVhbi5GQUxTRSk7 Ci0gICAgICAgIH0KKwkJIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkQWxsKCkgeworCQkJ IG1vZGVsLnNldEFsbEl0ZW1zRW5hYmxlZChudWxsKTsKKwkJIH0KIAotICAgICAgICBwcml2 YXRlIHZvaWQgZW5hYmxlQWxsRG93bmxvYWRzKCkgewotICAgICAgICAgICAgbW9kZWwuc2V0 QWxsSXRlbXNFbmFibGVkKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KKwkJIHByaXZhdGUg dm9pZCBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVt W10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJ IG1vZGVsLnNldEl0ZW1zRW5hYmxlZChCb29sZWFuLkZBTFNFLCBzZWxlY3RlZEl0ZW1zKTsK KwkJIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgcmVzdGFydFNlbGVjdGVkRG93bmxvYWRz KCkgewotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1v ZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgbW9kZWwucmVzdGFy dEl0ZW1zKHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9CisJCSBwcml2YXRlIHZvaWQgZW5h YmxlU2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0 ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIG1vZGVsLnNl dEl0ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUsIHNlbGVjdGVkSXRlbXMpOworCQkgfQogCi0g ICAgICAgIHByaXZhdGUgdm9pZCB1c2VUaGlzRG93bmxvYWREaXJlY3RvcnkoKSB7Ci0gICAg ICAgIAlmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT ZWxlY3RlZEl0ZW1zKCk7Ci0gICAgICAgIAlpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAw KSB7Ci0gICAgICAgIAkJZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERv d25sb2FkSXRlbSlzZWxlY3RlZEl0ZW1zWzBdOworCQkgcHJpdmF0ZSB2b2lkIGRpc2FibGVB bGxEb3dubG9hZHMoKSB7CisJCQkgbW9kZWwuc2V0QWxsSXRlbXNFbmFibGVkKEJvb2xlYW4u RkFMU0UpOworCQkgfQogCi0gICAgICAgIAkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4 dChpdGVtLmdldERvd25sb2FkRGlyKCkpOwotICAgICAgICAJfQotICAgICAgICB9CisJCSBw cml2YXRlIHZvaWQgZW5hYmxlQWxsRG93bmxvYWRzKCkgeworCQkJIG1vZGVsLnNldEFsbEl0 ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUpOworCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9p ZCBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSgpIHsKLSAgICAgICAgICAgIGZpbmFsIE1vZGVs SXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsK LSAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAg ICAgIAlmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxvYWRJdGVt KXNlbGVjdGVkSXRlbXNbMF07Ci0JCQkJZmluYWwgU3RyaW5nIGJvYXJkTmFtZSA9IGl0ZW0u Z2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOwotCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlSWQg PSBpdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKTsKKwkJIHByaXZhdGUgdm9pZCByZXN0 YXJ0U2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0 ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIG1vZGVsLnJl c3RhcnRJdGVtcyhzZWxlY3RlZEl0ZW1zKTsKKwkJIH0KIAotCQkJCWlmIChib2FyZE5hbWUg IT0gbnVsbCAmJiBtZXNzYWdlSWQgIT0gbnVsbCkgewotCQkJCQlmaW5hbCBCb2FyZCBib2Fy ZCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2FnZVRhYigpLmdldFRv ZlRyZWVNb2RlbCgpLmdldEJvYXJkQnlOYW1lKGJvYXJkTmFtZSk7Ci0JCQkJCWZpbmFsIFRv ZlRyZWUgdCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2FnZVRhYigp LmdldFRvZlRyZWUoKTsKKwkJIHByaXZhdGUgdm9pZCB1c2VUaGlzRG93bmxvYWREaXJlY3Rv cnkoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFi bGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+ IDApIHsKKwkJCQkgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25s b2FkSXRlbSlzZWxlY3RlZEl0ZW1zWzBdOwogCi0JCQkJCWlmIChib2FyZCAhPSBudWxsICYm IHQgIT0gbnVsbCkgewotCQkJCQkJdC5jbGVhclNlbGVjdGlvbigpOwotCQkJCQkJTWFpbkZy YW1lLmdldEluc3RhbmNlKCkuZ2V0RnJvc3RNZXNzYWdlVGFiKCkuZm9yY2VTZWxlY3RNZXNz YWdlSWQobWVzc2FnZUlkKTsKLQkJCQkJCXQuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBh dGgoYm9hcmQuZ2V0UGF0aCgpKSk7Ci0JCQkJCQlNYWluRnJhbWUuZ2V0SW5zdGFuY2UoKS5z ZWxlY3RUYWJiZWRQYW5lVGFiKCJNYWluRnJhbWUudGFiYmVkUGFuZS5uZXdzIik7Ci0JCQkJ CX0KLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KKwkJCQkgZG93bmxvYWREaXJUZXh0RmllbGQu c2V0VGV4dChpdGVtLmdldERvd25sb2FkRGlyKCkpOworCQkJIH0KKwkJIH0KIAotICAgICAg ICBwdWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFuZ3VhZ2VFdmVudCBldmVu dCkgewotICAgICAgICAgICAgcmVmcmVzaExhbmd1YWdlKCk7Ci0gICAgICAgIH0KKwkJIHBy aXZhdGUgdm9pZCBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSgpIHsKKwkJCSBmaW5hbCBNb2Rl bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7 CisJCQkgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkgeworCQkJCSBmaW5hbCBGcm9z dERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxvYWRJdGVtKXNlbGVjdGVkSXRlbXNb MF07CisJCQkJIGZpbmFsIFN0cmluZyBib2FyZE5hbWUgPSBpdGVtLmdldEFzc29jaWF0ZWRC b2FyZE5hbWUoKTsKKwkJCQkgZmluYWwgU3RyaW5nIG1lc3NhZ2VJZCA9IGl0ZW0uZ2V0QXNz b2NpYXRlZE1lc3NhZ2VJZCgpOwogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJs aWMgdm9pZCBzaG93KGZpbmFsIENvbXBvbmVudCBpbnZva2VyLCBmaW5hbCBpbnQgeCwgZmlu YWwgaW50IHkpIHsKLSAgICAgICAgICAgIHJlbW92ZUFsbCgpOworCQkJCSBpZiAoYm9hcmRO YW1lICE9IG51bGwgJiYgbWVzc2FnZUlkICE9IG51bGwpIHsKKwkJCQkJIGZpbmFsIEJvYXJk IGJvYXJkID0gTWFpbkZyYW1lLmdldEluc3RhbmNlKCkuZ2V0RnJvc3RNZXNzYWdlVGFiKCku Z2V0VG9mVHJlZU1vZGVsKCkuZ2V0Qm9hcmRCeU5hbWUoYm9hcmROYW1lKTsKKwkJCQkJIGZp bmFsIFRvZlRyZWUgdCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2Fn ZVRhYigpLmdldFRvZlRyZWUoKTsKIAotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10g c2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJCQkg aWYgKGJvYXJkICE9IG51bGwgJiYgdCAhPSBudWxsKSB7CisJCQkJCQkgdC5jbGVhclNlbGVj dGlvbigpOworCQkJCQkJIE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2Fn ZVRhYigpLmZvcmNlU2VsZWN0TWVzc2FnZUlkKG1lc3NhZ2VJZCk7CisJCQkJCQkgdC5zZXRT ZWxlY3Rpb25QYXRoKG5ldyBUcmVlUGF0aChib2FyZC5nZXRQYXRoKCkpKTsKKwkJCQkJCSBN YWluRnJhbWUuZ2V0SW5zdGFuY2UoKS5zZWxlY3RUYWJiZWRQYW5lVGFiKCJNYWluRnJhbWUu dGFiYmVkUGFuZS5uZXdzIik7CisJCQkJCSB9CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAg ICAgICAgICAgIGlmKCBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSAwICkgewotICAgICAgICAg ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKwkJIHB1YmxpYyB2b2lkIGxhbmd1YWdl Q2hhbmdlZChmaW5hbCBMYW5ndWFnZUV2ZW50IGV2ZW50KSB7CisJCQkgcmVmcmVzaExhbmd1 YWdlKCk7CisJCSB9CiAKLSAgICAgICAgICAgIGFkZChjb3B5S2V5c0FuZE5hbWVzSXRlbSk7 Ci0gICAgICAgICAgICBhZGQoY29weUV4dGVuZGVkSW5mb0l0ZW0pOwotICAgICAgICAgICAg YWRkU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICBhZGQoc3RhcnRTZWxlY3RlZERvd25sb2Fk c05vdyk7Ci0gICAgICAgICAgICBhZGQocmVzdGFydFNlbGVjdGVkRG93bmxvYWRzSXRlbSk7 Ci0gICAgICAgICAgICBhZGRTZXBhcmF0b3IoKTsKKwkJIEBPdmVycmlkZQorCQkgcHVibGlj IHZvaWQgc2hvdyhmaW5hbCBDb21wb25lbnQgaW52b2tlciwgZmluYWwgaW50IHgsIGZpbmFs IGludCB5KSB7CisJCQkgcmVtb3ZlQWxsKCk7CiAKLSAgICAgICAgICAgIGlmKCBQZXJzaXN0 ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAg ICBhZGQoY2hhbmdlUHJpb3JpdHlNZW51KTsKLSAgICAgICAgICAgICAgICBhZGRTZXBhcmF0 b3IoKTsKLSAgICAgICAgICAgIH0KKwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0 ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgICAgIGZp bmFsIEpNZW51IGVuYWJsZWRTdWJNZW51ID0gbmV3IEpNZW51KGxhbmd1YWdlLmdldFN0cmlu ZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzIikg KyAiLi4uIik7Ci0gICAgICAgICAgICBlbmFibGVkU3ViTWVudS5hZGQoZW5hYmxlU2VsZWN0 ZWREb3dubG9hZHNJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRTdWJNZW51LmFkZChkaXNh YmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRTdWJNZW51 LmFkZChpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRT dWJNZW51LmFkZFNlcGFyYXRvcigpOworCQkJIGlmKCBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9 PSAwICkgeworCQkJCSByZXR1cm47CisJCQkgfQogCi0gICAgICAgICAgICBlbmFibGVkU3Vi TWVudS5hZGQoZW5hYmxlQWxsRG93bmxvYWRzSXRlbSk7Ci0gICAgICAgICAgICBlbmFibGVk U3ViTWVudS5hZGQoZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0pOwotICAgICAgICAgICAgZW5h YmxlZFN1Yk1lbnUuYWRkKGludmVydEVuYWJsZWRBbGxJdGVtKTsKLSAgICAgICAgICAgIGFk ZChlbmFibGVkU3ViTWVudSk7CisJCQkgYWRkKGNvcHlLZXlzQW5kTmFtZXNJdGVtKTsKKwkJ CSBhZGQoY29weUV4dGVuZGVkSW5mb0l0ZW0pOworCQkJIGFkZFNlcGFyYXRvcigpOworCQkJ IGFkZChzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93KTsKKwkJCSBhZGQocmVzdGFydFNlbGVj dGVkRG93bmxvYWRzSXRlbSk7CisJCQkgYWRkU2VwYXJhdG9yKCk7CiAKLSAgICAgICAgICAg IC8vIHdlIG9ubHkgZmluZCBleHRlcm5hbCBpdGVtcyBpZiBwZXJzaXN0ZW5jZSBpcyBlbmFi bGVkCi0gICAgICAgICAgICBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VF bmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGZpbmFsIE1vZGVsSXRlbSBtaSA6 IHNlbGVjdGVkSXRlbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3du bG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgbWk7Ci0gICAgICAgICAgICAg ICAgICAgIGlmKCBpdGVtLmlzRXh0ZXJuYWwoKSAmJiBpdGVtLmlzRGlyZWN0KCkgJiYgaXRl bS5nZXRTdGF0ZSgpID09IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUgKSB7Ci0gICAg ICAgICAgICAgICAgICAgICAgICBhZGQocmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fk cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAg ICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFk ZChyZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pOwotICAgICAgICAgICAgaWYoICBGaWxl VHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSAhPSBudWxs ICYmIHNlbGVjdGVkSXRlbXMgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQg b25seSBpZiB0aGVyZSBhcmUgcmVtb3ZhYmxlIGl0ZW1zIHNlbGVjdGVkCi0gICAgICAgICAg ICAgICAgZm9yKGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMpIHsKLSAgICAg ICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERv d25sb2FkSXRlbSkgbWk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAgRmlsZVRyYW5zZmVy TWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkuaXNJdGVtSW5HbG9iYWxR dWV1ZShpdGVtKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZChyZW1vdmVGcm9t R3FJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg ICAgaWYoIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEgKSB7Ci0gICAgICAgICAgICAgICAg ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2Vs ZWN0ZWRJdGVtc1swXTsKLSAgICAgICAgICAgICAgICBpZiggaXRlbS5pc1NoYXJlZEZpbGUo KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkU2VwYXJhdG9yKCk7Ci0gICAgICAgICAg ICAgICAgICAgIGFkZChkZXRhaWxzSXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg ICAgICAgICAgIGFkZFNlcGFyYXRvcigpOwotCQkJCWFkZCh1c2VUaGlzRG93bmxvYWREaXJJ dGVtKTsKLQkJCQlpZiAoaXRlbS5nZXRBc3NvY2lhdGVkTWVzc2FnZUlkKCkgIT0gbnVsbCkg ewotCQkJCQlhZGRTZXBhcmF0b3IoKTsKLQkJCQkJYWRkKGp1bXBUb0Fzc29jaWF0ZWRNZXNz YWdlKTsKLQkJCQl9Ci0gICAgICAgICAgICB9CisJCQkgaWYoIFBlcnNpc3RlbmNlTWFuYWdl ci5pc1BlcnNpc3RlbmNlRW5hYmxlZCgpICkgeworCQkJCSBhZGQoY2hhbmdlUHJpb3JpdHlN ZW51KTsKKwkJCQkgYWRkU2VwYXJhdG9yKCk7CisJCQkgfQogCi0gICAgICAgICAgICBzdXBl ci5zaG93KGludm9rZXIsIHgsIHkpOwotICAgICAgICB9Ci0gICAgfQorCQkJIGZpbmFsIEpN ZW51IGVuYWJsZWRTdWJNZW51ID0gbmV3IEpNZW51KGxhbmd1YWdlLmdldFN0cmluZygiRG93 bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzIikgKyAiLi4u Iik7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGVuYWJsZVNlbGVjdGVkRG93bmxvYWRzSXRl bSk7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0 ZW0pOworCQkJIGVuYWJsZWRTdWJNZW51LmFkZChpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVt KTsKKwkJCSBlbmFibGVkU3ViTWVudS5hZGRTZXBhcmF0b3IoKTsKIAotICAgIHByaXZhdGUg Y2xhc3MgTGlzdGVuZXIKLSAgICAgICAgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIKLSAgICAgICAg aW1wbGVtZW50cyBMYW5ndWFnZUxpc3RlbmVyLCBBY3Rpb25MaXN0ZW5lciwgS2V5TGlzdGVu ZXIsIE1vdXNlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIEl0ZW1MaXN0ZW5l ciwgRm9jdXNMaXN0ZW5lciwgTWVudUxpc3RlbmVyIHsKKwkJCSBlbmFibGVkU3ViTWVudS5h ZGQoZW5hYmxlQWxsRG93bmxvYWRzSXRlbSk7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGRp c2FibGVBbGxEb3dubG9hZHNJdGVtKTsKKwkJCSBlbmFibGVkU3ViTWVudS5hZGQoaW52ZXJ0 RW5hYmxlZEFsbEl0ZW0pOworCQkJIGFkZChlbmFibGVkU3ViTWVudSk7CiAKLSAgICAgICAg cHVibGljIExpc3RlbmVyKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQor CQkJIC8vIHdlIG9ubHkgZmluZCBleHRlcm5hbCBpdGVtcyBpZiBwZXJzaXN0ZW5jZSBpcyBl bmFibGVkCisJCQkgaWYoIFBlcnNpc3RlbmNlTWFuYWdlci5pc1BlcnNpc3RlbmNlRW5hYmxl ZCgpICkgeworCQkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVtcykg eworCQkJCQkgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2Fk SXRlbSkgbWk7CisJCQkJCSBpZiggaXRlbS5pc0V4dGVybmFsKCkgJiYgaXRlbS5pc0RpcmVj dCgpICYmIGl0ZW0uZ2V0U3RhdGUoKSA9PSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05F ICkgeworCQkJCQkJIGFkZChyZXRyaWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzKTsKKwkJ CQkJCSBicmVhazsKKwkJCQkJIH0KKwkJCQkgfQorCQkJIH0KKwkJCSBhZGQocmVtb3ZlU2Vs ZWN0ZWREb3dubG9hZHNJdGVtKTsKKwkJCSBpZiggIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5z dCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpICE9IG51bGwgJiYgc2VsZWN0ZWRJdGVtcyAh PSBudWxsICkgeworCQkJCSAvLyBhZGQgb25seSBpZiB0aGVyZSBhcmUgcmVtb3ZhYmxlIGl0 ZW1zIHNlbGVjdGVkCisJCQkJIGZvcihmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0 ZW1zKSB7CisJCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93 bmxvYWRJdGVtKSBtaTsKKwkJCQkJIGlmKCAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCku Z2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkuaXNJdGVtSW5HbG9iYWxRdWV1ZShpdGVtKSApIHsK KwkJCQkJCSBhZGQocmVtb3ZlRnJvbUdxSXRlbSk7CisJCQkJCQkgYnJlYWs7CisJCQkJCSB9 CisJCQkJIH0KKwkJCSB9CisJCQkgaWYoIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEgKSB7 CisJCQkJIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0 ZW0pIHNlbGVjdGVkSXRlbXNbMF07CisJCQkJIGlmKCBpdGVtLmlzU2hhcmVkRmlsZSgpICkg eworCQkJCQkgYWRkU2VwYXJhdG9yKCk7CisJCQkJCSBhZGQoZGV0YWlsc0l0ZW0pOworCQkJ CSB9CisJCQkJIGFkZFNlcGFyYXRvcigpOworCQkJCSBhZGQodXNlVGhpc0Rvd25sb2FkRGly SXRlbSk7CisJCQkJIGlmIChpdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKSAhPSBudWxs KSB7CisJCQkJCSBhZGRTZXBhcmF0b3IoKTsKKwkJCQkJIGFkZChqdW1wVG9Bc3NvY2lhdGVk TWVzc2FnZSk7CisJCQkJIH0KKwkJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgbGFuZ3Vh Z2VDaGFuZ2VkKGZpbmFsIExhbmd1YWdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHJl ZnJlc2hMYW5ndWFnZSgpOwotICAgICAgICB9CisJCQkgc3VwZXIuc2hvdyhpbnZva2VyLCB4 LCB5KTsKKwkJIH0KKwkgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1l ZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2Uo KSA9PSBkb3dubG9hZERpclNlbGVjdEJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25s b2FkRGlyU2VsZWN0QnV0dG9uX2FjdGlvblBlcmZvcm1lZChlKTsKLSAgICAgICAgICAgIH0K LSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkRGlyQ3JlYXRlQnV0 dG9uKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWREaXJDcmVhdGVCdXR0b25fYWN0aW9u UGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUuZ2V0U291 cmNlKCkgPT0gZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbikgewotICAgICAgICAgICAgICAg IGRvd25sb2FkUHJlZml4QXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAg ICAgICAgfQotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJB cHBseUJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25sb2FkRGlyQXBwbHlCdXR0b25f YWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUu Z2V0U291cmNlKCkgPT0gZG93bmxvYWRUZXh0RmllbGQpIHsKLSAgICAgICAgICAgICAgICBk b3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJmb3JtZWQoZSk7Ci0gICAgICAgICAgICB9Ci0g ICAgICAgICAgICBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkUGFzdGVCdXR0 b24pIHsKLSAgICAgICAgICAgICAgICBkb3dubG9hZFBhc3RlQnV0dG9uUHJlc3NlZChlKTsK LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0g ZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25sb2FkQWN0 aXZhdGVCdXR0b25QcmVzc2VkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxz ZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZFBhdXNlQnV0dG9uKSB7Ci0gICAgICAg ICAgICAgICAgZG93bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQoZSk7Ci0gICAgICAgICAgICB9 IGVsc2UgewotICAgICAgICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZG93bmxvYWREaXJS ZWNlbnRNZW51LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIAkJZmluYWwg Sk1lbnVJdGVtIGl0ZW0gPSBkb3dubG9hZERpclJlY2VudE1lbnUuZ2V0SXRlbShpKTsKLSAg ICAgICAgICAgIAkJaWYgKGUuZ2V0U291cmNlKCkgPT0gaXRlbSkgewotICAgICAgICAgICAg CQkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7Ci0gICAg ICAgICAgICAJCX0KLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkgcHJpdmF0 ZSBjbGFzcyBMaXN0ZW5lcgorCSBleHRlbmRzIE1vdXNlQWRhcHRlcgorCSBpbXBsZW1lbnRz IExhbmd1YWdlTGlzdGVuZXIsIEFjdGlvbkxpc3RlbmVyLCBLZXlMaXN0ZW5lciwgTW91c2VM aXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgSXRlbUxpc3RlbmVyLCBGb2N1c0xp c3RlbmVyLCBNZW51TGlzdGVuZXIgewogCi0gICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNz ZWQoZmluYWwgS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkg PT0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRU YWJsZV9rZXlQcmVzc2VkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCSBwdWJs aWMgTGlzdGVuZXIoKSB7CisJCQkgc3VwZXIoKTsKKwkJIH0KIAotICAgICAgICBwdWJsaWMg dm9pZCBrZXlSZWxlYXNlZChmaW5hbCBLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAo ZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZERpclRleHRGaWVsZCkgewotICAgICAgICAgICAg ICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkX2tleVJlbGVhc2VkKGUpOwotICAgICAgICAgICAg fQotICAgICAgICB9CisJCSBwdWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFu Z3VhZ2VFdmVudCBldmVudCkgeworCQkJIHJlZnJlc2hMYW5ndWFnZSgpOworCQkgfQogCi0g ICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKGZpbmFsIEtleUV2ZW50IGUpIHsKLSAgICAg ICAgfQorCQkgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50 IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZERpclNlbGVjdEJ1dHRv bikgeworCQkJCSBkb3dubG9hZERpclNlbGVjdEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7 CisJCQkgfQorCQkJIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkRGlyQ3JlYXRlQnV0 dG9uKSB7CisJCQkJIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uX2FjdGlvblBlcmZvcm1lZChl KTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRQcmVmaXhBcHBs eUJ1dHRvbikgeworCQkJCSBkb3dubG9hZFByZWZpeEFwcGx5QnV0dG9uX2FjdGlvblBlcmZv cm1lZChlKTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJB cHBseUJ1dHRvbikgeworCQkJCSBkb3dubG9hZERpckFwcGx5QnV0dG9uX2FjdGlvblBlcmZv cm1lZChlKTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRUZXh0 RmllbGQpIHsKKwkJCQkgZG93bmxvYWRUZXh0RmllbGRfYWN0aW9uUGVyZm9ybWVkKGUpOwor CQkJIH0KKwkJCSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkUGFzdGVCdXR0 b24pIHsKKwkJCQkgZG93bmxvYWRQYXN0ZUJ1dHRvblByZXNzZWQoZSk7CisJCQkgfQorCQkJ IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbikgewor CQkJCSBkb3dubG9hZEFjdGl2YXRlQnV0dG9uUHJlc3NlZChlKTsKKwkJCSB9CisJCQkgZWxz ZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZFBhdXNlQnV0dG9uKSB7CisJCQkJIGRv d25sb2FkUGF1c2VCdXR0b25QcmVzc2VkKGUpOworCQkJIH0gZWxzZSB7CisJCQkJIGZvciAo aW50IGkgPSAwOyBpIDwgZG93bmxvYWREaXJSZWNlbnRNZW51LmdldEl0ZW1Db3VudCgpOyBp KyspIHsKKwkJCQkJIGZpbmFsIEpNZW51SXRlbSBpdGVtID0gZG93bmxvYWREaXJSZWNlbnRN ZW51LmdldEl0ZW0oaSk7CisJCQkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBpdGVtKSB7CisJ CQkJCQkgZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7CisJ CQkJCSB9CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgZm9j dXNHYWluZWQoZmluYWwgRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgIH0KKwkJIHB1YmxpYyB2 b2lkIGtleVByZXNzZWQoZmluYWwgS2V5RXZlbnQgZSkgeworCQkJIGlmIChlLmdldFNvdXJj ZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkgeworCQkJCSBkb3dubG9hZFRhYmxlX2tl eVByZXNzZWQoZSk7CisJCQkgfQorCQkgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGZvY3Vz TG9zdChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJj ZSgpID09IGRvd25sb2FkRGlyVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxv YWREaXJUZXh0RmllbGRfZm9jdXNMb3N0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9 CisJCSBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChmaW5hbCBLZXlFdmVudCBlKSB7CisJCQkg aWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJUZXh0RmllbGQpIHsKKwkJCQkgZG93 bmxvYWREaXJUZXh0RmllbGRfa2V5UmVsZWFzZWQoZSk7CisJCQkgfQorCQkgfQogCi0gICAg ICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoZmluYWwg TW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0g MikgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUu Z2V0VGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmaWxlIGZyb20g ZG93bmxvYWQgdGFibGUuIElzIHRoaXMgYSBnb29kIGlkZWE/Ci0gICAgICAgICAgICAgICAg ICAgIGRvd25sb2FkVGFibGVEb3VibGVDbGljayhlKTsKLSAgICAgICAgICAgICAgICB9Ci0g ICAgICAgICAgICB9IGVsc2UgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgewotICAgICAgICAg ICAgICAgIGlmICgoZS5nZXRTb3VyY2UoKSA9PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkpCi0g ICAgICAgICAgICAgICAgICAgIHx8IChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0 U2Nyb2xsUGFuZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzaG93RG93bmxvYWRUYWJs ZVBvcHVwTWVudShlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg ICAgIH0KKwkJIHB1YmxpYyB2b2lkIGtleVR5cGVkKGZpbmFsIEtleUV2ZW50IGUpIHsKKwkJ IH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxl YXNlZChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmICgoZS5nZXRDbGlj a0NvdW50KCkgPT0gMSkgJiYgKGUuaXNQb3B1cFRyaWdnZXIoKSkpIHsKKwkJIHB1YmxpYyB2 b2lkIGZvY3VzR2FpbmVkKGZpbmFsIEZvY3VzRXZlbnQgZSkgeworCQkgfQogCi0gICAgICAg ICAgICAgICAgaWYgKChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkK LSAgICAgICAgICAgICAgICAgICAgfHwgKGUuZ2V0U291cmNlKCkgPT0gbW9kZWxUYWJsZS5n ZXRTY3JvbGxQYW5lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEb3dubG9hZFRh YmxlUG9wdXBNZW51KGUpOwotICAgICAgICAgICAgICAgIH0KKwkJIHB1YmxpYyB2b2lkIGZv Y3VzTG9zdChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9 PSBkb3dubG9hZERpclRleHRGaWVsZCkgeworCQkJCSBkb3dubG9hZERpclRleHRGaWVsZF9m b2N1c0xvc3QoZSk7CisJCQkgfQorCQkgfQogCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0K KwkJIEBPdmVycmlkZQorCQkgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKGZpbmFsIE1vdXNl RXZlbnQgZSkgeworCQkJIGlmIChlLmdldENsaWNrQ291bnQoKSA9PSAyKSB7CisJCQkJIGlm IChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkgeworCQkJCQkgLy8g U3RhcnQgZmlsZSBmcm9tIGRvd25sb2FkIHRhYmxlLiBJcyB0aGlzIGEgZ29vZCBpZGVhPwor CQkJCQkJCSBkb3dubG9hZFRhYmxlRG91YmxlQ2xpY2soZSk7CisJCQkJIH0KKwkJCSB9IGVs c2UgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgeworCQkJCSBpZiAoKGUuZ2V0U291cmNlKCkg PT0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpKQorCQkJCQkJIHx8IChlLmdldFNvdXJjZSgpID09 IG1vZGVsVGFibGUuZ2V0U2Nyb2xsUGFuZSgpKSkgeworCQkJCQkgc2hvd0Rvd25sb2FkVGFi bGVQb3B1cE1lbnUoZSk7CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHVibGlj IHZvaWQgcHJvcGVydHlDaGFuZ2UoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsK LSAgICAgICAgICAgIGlmIChldnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNldHRpbmdz Q2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBmb250Q2hh bmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV2dC5nZXRQcm9wZXJ0 eU5hbWUoKS5lcXVhbHMoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9TSVpFKSkgewot ICAgICAgICAgICAgICAgIGZvbnRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg ICAgICBpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXR0aW5nc0NsYXNzLkZJ TEVfTElTVF9GT05UX1NUWUxFKSkgewotICAgICAgICAgICAgICAgIGZvbnRDaGFuZ2VkKCk7 Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJIEBPdmVycmlkZQorCQkgcHVibGljIHZv aWQgbW91c2VSZWxlYXNlZChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJCSBpZiAoKGUuZ2V0 Q2xpY2tDb3VudCgpID09IDEpICYmIChlLmlzUG9wdXBUcmlnZ2VyKCkpKSB7CiAKLSAgICAg ICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChmaW5hbCBJdGVtRXZlbnQgZSkgewot ICAgICAgICAgICAgaWYoIHJlbW92ZUZpbmlzaGVkRG93bmxvYWRzQ2hlY2tCb3guaXNTZWxl Y3RlZCgpICkgewotICAgICAgICAgICAgICAgIENvcmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1 ZShTZXR0aW5nc0NsYXNzLkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCwgdHJ1ZSk7Ci0gICAg ICAgICAgICAgICAgbW9kZWwucmVtb3ZlRmluaXNoZWREb3dubG9hZHMoKTsKLSAgICAgICAg ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdzLnNldFZh bHVlKFNldHRpbmdzQ2xhc3MuRE9XTkxPQURfUkVNT1ZFX0ZJTklTSEVELCBmYWxzZSk7Ci0g ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJ dGVtcy5pc1NlbGVjdGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRp bmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuR1FfU0hPV19FWFRFUk5BTF9JVEVNU19ET1dO TE9BRCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENv cmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJO QUxfSVRFTVNfRE9XTkxPQUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZW1v dmVFeHRlcm5hbERvd25sb2FkcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJ IGlmICgoZS5nZXRTb3VyY2UoKSA9PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkpCisJCQkJCQkg fHwgKGUuZ2V0U291cmNlKCkgPT0gbW9kZWxUYWJsZS5nZXRTY3JvbGxQYW5lKCkpKSB7CisJ CQkJCSBzaG93RG93bmxvYWRUYWJsZVBvcHVwTWVudShlKTsKKwkJCQkgfQogCi0gICAgCXB1 YmxpYyB2b2lkIG1lbnVDYW5jZWxlZChNZW51RXZlbnQgZSkgewotICAgIAl9CisJCQkgfQor CQkgfQogCi0gICAgCXB1YmxpYyB2b2lkIG1lbnVEZXNlbGVjdGVkKE1lbnVFdmVudCBlKSB7 Ci0gICAgCX0KKwkJIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGZpbmFsIFByb3BlcnR5 Q2hhbmdlRXZlbnQgZXZ0KSB7CisJCQkgaWYgKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVh bHMoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FKSkgeworCQkJCSBmb250Q2hh bmdlZCgpOworCQkJIH0KKwkJCSBpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhT ZXR0aW5nc0NsYXNzLkZJTEVfTElTVF9GT05UX1NJWkUpKSB7CisJCQkJIGZvbnRDaGFuZ2Vk KCk7CisJCQkgfQorCQkJIGlmIChldnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNldHRp bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU1RZTEUpKSB7CisJCQkJIGZvbnRDaGFuZ2VkKCk7 CisJCQkgfQorCQkgfQogCi0gICAgCXB1YmxpYyB2b2lkIG1lbnVTZWxlY3RlZChNZW51RXZl bnQgZSkgewotICAgIAkJaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJSZWNlbnRN ZW51KSB7Ci0gICAgCQkJSk1lbnVJdGVtIGl0ZW07CisJCSBwdWJsaWMgdm9pZCBpdGVtU3Rh dGVDaGFuZ2VkKGZpbmFsIEl0ZW1FdmVudCBlKSB7CisJCQkgaWYoIHJlbW92ZUZpbmlzaGVk RG93bmxvYWRzQ2hlY2tCb3guaXNTZWxlY3RlZCgpICkgeworCQkJCSBDb3JlLmZyb3N0U2V0 dGluZ3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1PVkVfRklOSVNIRUQs IHRydWUpOworCQkJCSBtb2RlbC5yZW1vdmVGaW5pc2hlZERvd25sb2FkcygpOworCQkJIH0g ZWxzZSB7CisJCQkJIENvcmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNz LkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCwgZmFsc2UpOworCQkJIH0KKwkJCSBpZiggc2hv d0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcy5pc1NlbGVjdGVkKCkgKSB7CisJCQkJIENvcmUu ZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJOQUxf SVRFTVNfRE9XTkxPQUQsIHRydWUpOworCQkJIH0gZWxzZSB7CisJCQkJIENvcmUuZnJvc3RT ZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJOQUxfSVRFTVNf RE9XTkxPQUQsIGZhbHNlKTsKKwkJCQkgbW9kZWwucmVtb3ZlRXh0ZXJuYWxEb3dubG9hZHMo KTsKKwkJCSB9CisJCSB9CiAKLSAgICAgICAgICAgCQlkb3dubG9hZERpclJlY2VudE1lbnUu cmVtb3ZlQWxsKCk7CisJCSBwdWJsaWMgdm9pZCBtZW51Q2FuY2VsZWQoTWVudUV2ZW50IGUp IHsKKwkJIH0KIAotICAgICAgICAgICAJCWl0ZW0gPSBuZXcgSk1lbnVJdGVtKENvcmUuZnJv c3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkRJUl9ET1dOTE9BRCkpOwotICAg ICAgICAgICAJCWRvd25sb2FkRGlyUmVjZW50TWVudS5hZGQoaXRlbSk7Ci0gICAgICAgICAg IAkJaXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgCQkKLSAgICAg ICAgICAgCQlkb3dubG9hZERpclJlY2VudE1lbnUuYWRkU2VwYXJhdG9yKCk7Ci0gICAgICAg ICAgIAkJZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IGRpcnMgPSBGaWxlVHJhbnNmZXJNYW5h Z2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5nZXRSZWNlbnREb3dubG9hZERpcnMo KTsKLSAgICAgICAgICAgCQlmaW5hbCBMaXN0SXRlcmF0b3IgaXRlciA9IGRpcnMubGlzdEl0 ZXJhdG9yKGRpcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgCQl3aGlsZSAoaXRlci5oYXNQcmV2 aW91cygpKSB7Ci0gICAgICAgICAgIAkJICAgIGZpbmFsIFN0cmluZyBkaXIgPSAoU3RyaW5n KWl0ZXIucHJldmlvdXMoKTsKKwkJIHB1YmxpYyB2b2lkIG1lbnVEZXNlbGVjdGVkKE1lbnVF dmVudCBlKSB7CisJCSB9CiAKLQkJCQkJaXRlbSA9IG5ldyBKTWVudUl0ZW0oZGlyKTsKLQkJ CQkJZG93bmxvYWREaXJSZWNlbnRNZW51LmFkZChpdGVtKTsKLQkJCQkJaXRlbS5hZGRBY3Rp b25MaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICB9CisJCSBwdWJsaWMg dm9pZCBtZW51U2VsZWN0ZWQoTWVudUV2ZW50IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2Uo KSA9PSBkb3dubG9hZERpclJlY2VudE1lbnUpIHsKKwkJCQkgSk1lbnVJdGVtIGl0ZW07CisK KwkJCQkgZG93bmxvYWREaXJSZWNlbnRNZW51LnJlbW92ZUFsbCgpOworCisJCQkJIGl0ZW0g PSBuZXcgSk1lbnVJdGVtKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0Ns YXNzLkRJUl9ET1dOTE9BRCkpOworCQkJCSBkb3dubG9hZERpclJlY2VudE1lbnUuYWRkKGl0 ZW0pOworCQkJCSBpdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCisJCQkJIGRvd25s b2FkRGlyUmVjZW50TWVudS5hZGRTZXBhcmF0b3IoKTsKKwkJCQkgZmluYWwgTGlua2VkTGlz dDxTdHJpbmc+IGRpcnMgPSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9h ZE1hbmFnZXIoKS5nZXRSZWNlbnREb3dubG9hZERpcnMoKTsKKwkJCQkgZmluYWwgTGlzdEl0 ZXJhdG9yPFN0cmluZz4gaXRlciA9IGRpcnMubGlzdEl0ZXJhdG9yKGRpcnMuc2l6ZSgpKTsK KwkJCQkgd2hpbGUgKGl0ZXIuaGFzUHJldmlvdXMoKSkgeworCQkJCQkgZmluYWwgU3RyaW5n IGRpciA9IChTdHJpbmcpaXRlci5wcmV2aW91cygpOworCisJCQkJCSBpdGVtID0gbmV3IEpN ZW51SXRlbShkaXIpOworCQkJCQkgZG93bmxvYWREaXJSZWNlbnRNZW51LmFkZChpdGVtKTsK KwkJCQkJIGl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJIH0KKwkJCSB9CisJ CSB9CisJIH0KIH0KSW5kZXg6IHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRzRGlh bG9nLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvZ3VpL0FkZE5ld0Rv d25sb2Fkc0RpYWxvZy5qYXZhCShyZXZpc2lvbiAzMTk3KQ0KKysrIHNvdXJjZS9mcm9zdC9n dWkvQWRkTmV3RG93bmxvYWRzRGlhbG9nLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0xODUs NiArMTg1LDIyIEBADQogCXByaXZhdGUgdm9pZCBpbml0UG9wdXBNZW51KCkgewogCQl0YWJs ZVBvcHVwTWVudSA9IG5ldyBKU2tpbm5hYmxlUG9wdXBNZW51KCk7CiAKKwkJLy8gUmVuYW1l IGZpbGUKKwkJZmluYWwgSk1lbnVJdGVtIHJlbmFtZUZpbGUgPSBuZXcgSk1lbnVJdGVtKGxh bmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5yZW5hbWVG aWxlIikpOworCQlyZW5hbWVGaWxlLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2YS5hd3Qu ZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3Jt ZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJCQlyZW5hbWVGaWxlX2Fj dGlvblBlcmZvcm1lZChhY3Rpb25FdmVudCk7CisJCQl9CisJCX0pOworCQkKKwkJLy8gcHJl Zml4IEZpbGVuYW1lCisJCWZpbmFsIEpNZW51SXRlbSBwcmVmaXhGaWxlbmFtZSA9IG5ldyBK TWVudUl0ZW0obGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0 dG9uLnByZWZpeEZpbGVuYW1lIikpOworCQlwcmVmaXhGaWxlbmFtZS5hZGRBY3Rpb25MaXN0 ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGlj IHZvaWQgYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7 CisJCQkJcHJlZml4RmlsZW5hbWVfYWN0aW9uUGVyZm9ybWVkKGFjdGlvbkV2ZW50KTsKKwkJ CX0KKwkJfSk7CisKIAkJLy8gQ2hhbmdlIERvd25sb2FkIERpcmVjdG9yeQogCQlmaW5hbCBK TWVudUl0ZW0gY2hhbmdlRG93bmxvYWREaXIgPSBuZXcgSk1lbnVJdGVtKGxhbmd1YWdlLmdl dFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5jaGFuZ2VEb3dubG9hZERp ciIpKTsKIAkJY2hhbmdlRG93bmxvYWREaXIuYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZh LmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKQEAgLTE5Miw2ICsyMDgsNyBAQA0KIAkJ CQljaGFuZ2VEb3dubG9hZERpcl9hY3Rpb25QZXJmb3JtZWQoYWN0aW9uRXZlbnQpOwogCQkJ fQogCQl9KTsKKwkJCiAKIAkJLy8gUmVtb3ZlIGl0ZW0gZnJvbSBsaXN0CiAJCWZpbmFsIEpN ZW51SXRlbSByZW1vdmVEb3dubG9hZCA9IG5ldyBKTWVudUl0ZW0obGFuZ3VhZ2UuZ2V0U3Ry aW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLnJlbW92ZURvd25sb2FkIikpOwpA QCAtMjE4LDYgKzIzNSw5IEBADQogCQl9CiAKIAkJLy8gQ29tcG9zZSBwb3B1cCBtZW51CisJ CXRhYmxlUG9wdXBNZW51LmFkZChyZW5hbWVGaWxlKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRk KHByZWZpeEZpbGVuYW1lKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRkU2VwYXJhdG9yKCk7CiAJ CXRhYmxlUG9wdXBNZW51LmFkZChjaGFuZ2VEb3dubG9hZERpcik7CiAJCXRhYmxlUG9wdXBN ZW51LmFkZFNlcGFyYXRvcigpOwogCQl0YWJsZVBvcHVwTWVudS5hZGQocmVtb3ZlRG93bmxv YWQpOwpAQCAtMjUxLDcgKzI3MSw3MiBAQA0KIAkJfQogCQlhZGROZXdEb3dubG9hZHNUYWJs ZS5jbGVhclNlbGVjdGlvbigpOwogCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVuYW1lRmlsZV9h Y3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJZmlu YWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2VsZWN0 ZWRSb3dzKCk7CiAKKwkJaWYoIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwICkgeworCQkJCisJ CQlmb3IoIGZpbmFsIGludCByb3dJbmRleCA6IHNlbGVjdGVkUm93cyApIHsKKwkJCQlpZigg cm93SW5kZXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0Um93Q291bnQoKSApIHsKKwkJ CQkJY29udGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCQkJCQorCQkJCS8vIGFkZCB0aGUg Ym9hcmQocykgdG8gYm9hcmQgdHJlZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGFibGUKKwkJCQlm aW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRz VGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0luZGV4 KTsKKwkJCQlTdHJpbmcgbmV3TmFtZSA9IGFza0Zvck5ld25hbWUocm93LmdldERvd25sb2Fk SXRlbSgpLmdldFVucHJlZml4ZWRGaWxlbmFtZSgpKTsKKwkJCQlpZiggbmV3TmFtZSAhPSBu dWxsICkgeworCQkJCQlyb3cuZ2V0RG93bmxvYWRJdGVtKCkuc2V0RmlsZU5hbWUobmV3TmFt ZSk7CisJCQkJfQorCQkJCXJvdy51cGRhdGVFeGlzdHNDaGVjaygpOworCQkJfQorCQkJYWRk TmV3RG93bmxvYWRzVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKKwkJfQorCX0KKwkKKwlwcml2 YXRlIFN0cmluZyBhc2tGb3JOZXduYW1lKGZpbmFsIFN0cmluZyBvbGROYW1lKSB7CisJCXJl dHVybiAoU3RyaW5nKSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCisJCQkJdGhpcywK KwkJCQlsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5yZW5hbWVG aWxlRGlhbG9nLmRpYWxvZ0JvZHkiKSwKKwkJCQlsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5l d0Rvd25sb2Fkc0RpYWxvZy5yZW5hbWVGaWxlRGlhbG9nLmRpYWxvZ1RpdGxlIiksCisJCQkJ Sk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSwKKwkJCQludWxsLAorCQkJCW51bGwsCisJ CQkJb2xkTmFtZQorCQkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcHJlZml4RmlsZW5hbWVf YWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJCWZp bmFsIGludFtdIHNlbGVjdGVkUm93cyA9IGFkZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFNlbGVj dGVkUm93cygpOworCisJCWlmKCBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCApIHsKKwkJCQor CQkJZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworCQkJCisJCQlmb3Io IGZpbmFsIGludCByb3dJbmRleCA6IHNlbGVjdGVkUm93cyApIHsKKwkJCQlpZiggcm93SW5k ZXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0Um93Q291bnQoKSApIHsKKwkJCQkJY29u dGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCQkJCQorCQkJCS8vIGFkZCB0aGUgYm9hcmQo cykgdG8gYm9hcmQgdHJlZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGFibGUKKwkJCQlmaW5hbCBB ZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRzVGFibGVN ZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0luZGV4KTsKKwkJ CQlyb3cuZ2V0RG93bmxvYWRJdGVtKCkuc2V0RmlsZW5hbWVQcmVmaXgocHJlZml4KTsKKwkJ CQlyb3cudXBkYXRlRXhpc3RzQ2hlY2soKTsKKwkJCX0KKwkJCWFkZE5ld0Rvd25sb2Fkc1Rh YmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisJCisJCisJcHJpdmF0ZSBmaW5hbCBT dHJpbmcgYXNrRm9yUHJlZml4KCkgeworCQlyZXR1cm4gKFN0cmluZykgSk9wdGlvblBhbmUu c2hvd0lucHV0RGlhbG9nKAorCQkJCXRoaXMsCisJCQkJbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJB ZGROZXdEb3dubG9hZHNEaWFsb2cucHJlZml4RmlsZW5hbWVEaWFsb2cuZGlhbG9nQm9keSIp LAorCQkJCWxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLnByZWZp eEZpbGVuYW1lRGlhbG9nLmRpYWxvZ1RpdGxlIiksCisJCQkJSk9wdGlvblBhbmUuUVVFU1RJ T05fTUVTU0FHRQorCQkpOworCX0KKwogCXByaXZhdGUgdm9pZCBjaGFuZ2VEb3dubG9hZERp cl9hY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKIAkJ ZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2Vs ZWN0ZWRSb3dzKCk7CiAKQEAgLTI4NCw3ICszNjksNyBAQA0KIAkJCWFkZE5ld0Rvd25sb2Fk c1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CiAJCX0KIAl9Ci0KKwkKIAlwcml2YXRlIHZvaWQg cmVtb3ZlRG93bmxvYWRfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsK IAkJZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0 U2VsZWN0ZWRSb3dzKCk7CiAKSW5kZXg6IHNvdXJjZS9mcm9zdC9tZXNzYWdpbmcvZnJvc3Qv Z3VpL01lc3NhZ2VUZXh0UGFuZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zy b3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQYW5lLmphdmEJKHJldmlzaW9u IDMxOTcpDQorKysgc291cmNlL2Zyb3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRl eHRQYW5lLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC01MTIsNyArNTEyLDcgQEANCiAKICAg ICAgICAgS25vd25Cb2FyZHNNYW5hZ2VyLmFkZE5ld0tub3duQm9hcmRzKGFkZEJvYXJkcyk7 CiAgICAgfQotCisgICAgCiAgICAgLyoqCiAgICAgICogQWRkcyBhbGwgYm9hcmRzIGZyb20g dGhlIGF0dGFjaGVkQm9hcmRzVGFibGUgdG8gYm9hcmQgbGlzdC4KICAgICAgKiBJZiB0YXJn ZXRGb2xkZXIgaXMgbnVsbCB0aGUgYm9hcmRzIGFyZSBhZGRlZCB0byB0aGUgcm9vdCBmb2xk ZXIuCkBAIC01OTksNyArNTk5LDkgQEANCiAgICAgICAgIH0KICAgICAgICAgcG9wdXBNZW51 VG9mVGV4dC5zaG93KGUuZ2V0Q29tcG9uZW50KCksIGUuZ2V0WCgpLCBlLmdldFkoKSk7CiAg ICAgfQotCisgICAgCisgICAgCisgICAKICAgICBwcml2YXRlIGNsYXNzIFBvcHVwTWVudUF0 dGFjaG1lbnRCb2FyZAogICAgIGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVudQogICAgIGlt cGxlbWVudHMgQWN0aW9uTGlzdGVuZXIsIExhbmd1YWdlTGlzdGVuZXIgewpAQCAtODI4LDgg KzgzMCw4IEBADQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGlja2VkS2V5KGZpbmFsIFN0 cmluZyBzKSB7CiAgICAgICAgICAgICBjbGlja2VkS2V5ID0gczsKICAgICAgICAgfQotICAg ICAgICBwdWJsaWMgdm9pZCBzZXRBbGxLZXlzKGZpbmFsIExpc3Q8U3RyaW5nPiBsKSB7Ci0g ICAgICAgICAgICBhbGxLZXlzID0gbDsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWxsS2V5 cyhmaW5hbCBMaXN0PFN0cmluZz4gbGlzdEFsbEtleXMpIHsKKyAgICAgICAgICAgIGFsbEtl eXMgPSBsaXN0QWxsS2V5czsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFj dGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CkBAIC05MjQsOCArOTI2LDYg QEANCiAgICAgICAgICAgICAJCWNvbnRpbnVlOwogICAgICAgICAgICAgCX0KICAgICAgICAg ICAgIAkKLQotICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0g a2V5LnN1YnN0cmluZyhrZXkubGFzdEluZGV4T2YoIi8iKSsxKTsKICAgICAgICAgICAgICAg ICAvLyBtYXliZSBjb252ZXJ0IGh0bWwgY29kZXMgKGUuZy4gJTJjIC0+ICwgKQogICAgICAg ICAgICAgICAgIGlmKCBuYW1lLmluZGV4T2YoIiUiKSA+IDAgKSB7CkBAIC05OTgsNDcgKzk5 OCwxNiBAQA0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGFza0Zv clByZWZpeCgpIHsKLSAgICAJIHJldHVybiBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2co Ci0gICAgCQl0aGlzLAotICAgIAkJbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFuZS5t ZXNzYWdlVGV4dC5kb3dubG9hZFByZWZpeERpYWxvZy5ib2R5IiksCi0gICAgCQlsYW5ndWFn ZS5nZXRTdHJpbmcoIk1lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LmRvd25sb2FkUHJlZml4RGlh bG9nLnRpdGxlIiksCi0gICAgCQlKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFCi0JCSk7 Ci0gICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb3dzZUl0ZW1fYWN0aW9uUGVyZm9ybWVk KGZpbmFsIFN0cmluZyBrZXlzKSB7Ci0gICAgICAgIERvd25sb2FkTWFuYWdlciBkbE1hbmFn ZXIgPSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKTsK LQkJZmluYWwgSkZpbGVDaG9vc2VyIGZjID0gbmV3IEpGaWxlQ2hvb3NlcihDb3JlLmZyb3N0 U2V0dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ESVJfTEFTVF9VU0VEKSk7Ci0JCWZj LnNldERpYWxvZ1RpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMu ZmlsZWNob29zZXIudGl0bGUiKSk7Ci0JCWZjLnNldEZpbGVIaWRpbmdFbmFibGVkKHRydWUp OwotCQlmYy5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNf T05MWSk7Ci0JCWZjLnNldE11bHRpU2VsZWN0aW9uRW5hYmxlZChmYWxzZSk7CisgICAgcHJp dmF0ZSBjbGFzcyBQb3B1cE1lbnVUb2ZUZXh0IGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVu dSBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyLCBMYW5ndWFnZUxpc3RlbmVyIHsKIAotCQlm aW5hbCBpbnQgcmV0dXJuVmFsID0gZmMuc2hvd09wZW5EaWFsb2codGhpcyk7Ci0JCWlmIChy ZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0JCQlmaW5hbCBT dHJpbmcgZmlsZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0 b3IiKTsKLQkJCWZpbmFsIEZpbGUgZmlsZSA9IGZjLmdldFNlbGVjdGVkRmlsZSgpOwotCQkJ ZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworCQlwcml2YXRlIHN0YXRp YyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotCQkJQ29yZS5mcm9zdFNl dHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0xBU1RfVVNFRCwgZmlsZS5nZXRQ YXJlbnQoKSk7Ci0JCQlkbE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoZmlsZS5nZXRQ YXRoKCkgKyBmaWxlU2VwYXJhdG9yKTsKLQkJCWRsTWFuYWdlci5hZGRLZXlzKGtleXMsIGZp bGUuZ2V0UGF0aCgpICsgZmlsZVNlcGFyYXRvciwgcHJlZml4KTsKLQkJfQotICAgIH0KKwkJ cHJpdmF0ZSBmaW5hbCBKVGV4dENvbXBvbmVudCBzb3VyY2VUZXh0Q29tcG9uZW50OwogCi0g ICAgcHJpdmF0ZSBjbGFzcyBQb3B1cE1lbnVUb2ZUZXh0Ci0gICAgZXh0ZW5kcyBKU2tpbm5h YmxlUG9wdXBNZW51Ci0gICAgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciwgTGFuZ3VhZ2VM aXN0ZW5lciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKVGV4dENvbXBvbmVudCBzb3Vy Y2VUZXh0Q29tcG9uZW50OwotCiAgICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGNv cHlJdGVtID0gbmV3IEpNZW51SXRlbSgpOwogICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51 SXRlbSBzYXZlTWVzc2FnZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZh dGUgZmluYWwgSk1lbnUgZG93bmxvYWRLZXlzSXRlbSA9IG5ldyBKTWVudSgpOwotICAgICAg ICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBkZWZhdWx0RGxEaXJJdGVtID0gbmV3IEpNZW51 SXRlbSgpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBicm93c2VJdGVtID0g bmV3IEpNZW51SXRlbSgpOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSByZWNlbnREbERp ckl0ZW1zW107CisgICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRvd25sb2FkS2V5 cyA9IG5ldyBKTWVudUl0ZW0oKTsKIAogICAgICAgICBwdWJsaWMgUG9wdXBNZW51VG9mVGV4 dChmaW5hbCBKVGV4dENvbXBvbmVudCBzb3VyY2VUZXh0Q29tcG9uZW50KSB7CiAgICAgICAg ICAgICBzdXBlcigpOwpAQCAtMTA0NywyOSArMTAxNiwyNCBAQA0KICAgICAgICAgfQogCiAg ICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBl KSB7Ci0JICAgICAgICBEb3dubG9hZE1hbmFnZXIgZGxNYW5hZ2VyID0gRmlsZVRyYW5zZmVy TWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCk7Ci0KICAgICAgICAgICAgIGlm IChlLmdldFNvdXJjZSgpID09IHNhdmVNZXNzYWdlSXRlbSkgewogICAgICAgICAgICAgICAg IHNhdmVNZXNzYWdlQnV0dG9uX2FjdGlvblBlcmZvcm1lZCgpOwogICAgICAgICAgICAgfSBl bHNlIGlmIChlLmdldFNvdXJjZSgpID09IGNvcHlJdGVtKSB7CiAgICAgICAgICAgICAgICAg Ly8gY29weSBzZWxlY3RlZCB0ZXh0CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRl eHQgPSBzb3VyY2VUZXh0Q29tcG9uZW50LmdldFNlbGVjdGVkVGV4dCgpOwogICAgICAgICAg ICAgICAgIENvcHlUb0NsaXBib2FyZC5jb3B5VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgIH0g ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkZWZhdWx0RGxEaXJJdGVtKSB7Ci0gICAgICAg ICAgICAJZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworICAgICAgICAg ICAgICAgIAorICAgICAgICAgICAgfSBpZihlLmdldFNvdXJjZSgpID09IGRvd25sb2FkS2V5 cyApIHsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlMaXN0PEZyb3N0RG93bmxvYWRJ dGVtPiBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBEb3dubG9hZE1hbmFnZXIucGFyc2VLZXlz KHNvdXJjZVRleHRDb21wb25lbnQuZ2V0U2VsZWN0ZWRUZXh0KCkpOwogCi0gICAgICAgICAg ICAJZGxNYW5hZ2VyLmFkZEtleXMoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRl eHQoKSwgbnVsbCwgcHJlZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy Y2UoKSA9PSBicm93c2VJdGVtKSB7Ci0gICAgICAgICAgICAJYnJvd3NlSXRlbV9hY3Rpb25Q ZXJmb3JtZWQoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRleHQoKSk7Ci0JCQl9 IGVsc2UgewotICAgICAgICAgICAgCWZvciAoZmluYWwgSk1lbnVJdGVtIGl0ZW0gOiByZWNl bnREbERpckl0ZW1zKSB7Ci0gICAgICAgICAgICAJCWlmIChlLmdldFNvdXJjZSgpID09IGl0 ZW0pIHsKLQkJCQkJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBhc2tGb3JQcmVmaXgoKTsKKyAg ICAgICAgICAgIAlmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93bmxvYWRz RGlhbG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZygKKyAgICAgICAgICAgIAkJCU1h aW5GcmFtZS5nZXRJbnN0YW5jZSgpLCBmcm9zdERvd25sb2FkSXRlbUxpc3QpOworICAgICAg ICAgICAgCWZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IGFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5z dGFydERpYWxvZyhmcm9zdERvd25sb2FkSXRlbUxpc3QpOwogCi0gICAgICAgICAgICAJCQlk bE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoaXRlbS5nZXRUZXh0KCkpOwotICAgICAg ICAgICAgCQkJZGxNYW5hZ2VyLmFkZEtleXMoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxl Y3RlZFRleHQoKSwgaXRlbS5nZXRUZXh0KCksIHByZWZpeCk7Ci0gICAgICAgICAgICAJCQli cmVhazsKLSAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCURvd25sb2FkTW9kZWwgZG93 bmxvYWRNb2RlbCA9IEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldERvd25sb2FkTWFu YWdlcigpLmdldE1vZGVsKCk7CisgICAgICAgICAgICAJZm9yKGZpbmFsIEZyb3N0RG93bmxv YWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkgewor ICAgICAgICAgICAgCQlkb3dubG9hZE1vZGVsLmFkZERvd25sb2FkSXRlbShmcm9zdERvd25s b2FkSXRlbSk7CiAgICAgICAgICAgICAJfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBA IC0xMDc5LDUwICsxMDQzLDE5IEBADQogCiAgICAgICAgICAgICBjb3B5SXRlbS5hZGRBY3Rp b25MaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgIHNhdmVNZXNzYWdlSXRlbS5hZGRBY3Rp b25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAJCWRlZmF1bHREbERpckl0ZW0uYWRkQWN0aW9u TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgCQlicm93c2VJdGVtLmFkZEFjdGlvbkxpc3RlbmVy KHRoaXMpOworICAgICAgICAgICAgZG93bmxvYWRLZXlzLmFkZEFjdGlvbkxpc3RlbmVyKHRo aXMpOwogCiAgICAgICAgICAgICBhZGQoY29weUl0ZW0pOwogICAgICAgICAgICAgYWRkU2Vw YXJhdG9yKCk7CiAgICAgICAgICAgICBhZGQoc2F2ZU1lc3NhZ2VJdGVtKTsKICAgICAgICAg ICAgIGFkZFNlcGFyYXRvcigpOwotICAgICAgICAgICAgYWRkKGRvd25sb2FkS2V5c0l0ZW0p OworICAgICAgICAgICAgYWRkKGRvd25sb2FkS2V5cyk7CiAgICAgICAgIH0KIAotICAgICAg ICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEb3dubG9hZEtleXMoKSB7Ci0gICAgICAgIAlmaW5h bCBMaW5rZWRMaXN0PFN0cmluZz4gZGlycyA9IEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgp LmdldERvd25sb2FkTWFuYWdlcigpLmdldFJlY2VudERvd25sb2FkRGlycygpOwotICAgICAg ICAJaW50IGkgPSAwOwotCi0gICAgICAgIAlkb3dubG9hZEtleXNJdGVtLnJlbW92ZUFsbCgp OwotICAgICAgICAJZG93bmxvYWRLZXlzSXRlbS5hZGQoZGVmYXVsdERsRGlySXRlbSk7Ci0g ICAgICAgIAlkZWZhdWx0RGxEaXJJdGVtLnNldFRleHQoQ29yZS5mcm9zdFNldHRpbmdzLmdl dFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0RPV05MT0FEKSk7Ci0KLSAgICAgICAgCWlmIChk aXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgCQlkb3dubG9hZEtleXNJdGVtLmFkZFNlcGFy YXRvcigpOwotCi0JICAgICAgICAJcmVjZW50RGxEaXJJdGVtcyA9IG5ldyBKTWVudUl0ZW1b ZGlycy5zaXplKCldOwotCi0gICAgICAgIAkgICAgZmluYWwgTGlzdEl0ZXJhdG9yIGl0ZXIg PSBkaXJzLmxpc3RJdGVyYXRvcihkaXJzLnNpemUoKSk7Ci0JICAgICAgICAJd2hpbGUgKGl0 ZXIuaGFzUHJldmlvdXMoKSkgewotCSAgICAgICAgCSAgICBmaW5hbCBTdHJpbmcgZGlyID0g KFN0cmluZylpdGVyLnByZXZpb3VzKCk7Ci0KLQkgICAgICAgIAkJcmVjZW50RGxEaXJJdGVt c1tpXSA9IG5ldyBKTWVudUl0ZW0oKTsKLQkgICAgICAgIAkJcmVjZW50RGxEaXJJdGVtc1tp XS5zZXRUZXh0KGRpcik7Ci0JICAgICAgICAJCXJlY2VudERsRGlySXRlbXNbaV0uYWRkQWN0 aW9uTGlzdGVuZXIodGhpcyk7Ci0JICAgICAgICAJCWRvd25sb2FkS2V5c0l0ZW0uYWRkKHJl Y2VudERsRGlySXRlbXNbaV0pOwotCSAgICAgICAgCQlpKys7Ci0JCQkJfQotCQkJfQotCi0g ICAgICAgCQlkb3dubG9hZEtleXNJdGVtLmFkZFNlcGFyYXRvcigpOwotICAgICAgIAkJZG93 bmxvYWRLZXlzSXRlbS5hZGQoYnJvd3NlSXRlbSk7Ci0gICAgICAgIH0KLQogICAgICAgICBw dWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFuZ3VhZ2VFdmVudCBldmVudCkg ewogICAgICAgICAgICAgY29weUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk1l c3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LnBvcHVwbWVudS5jb3B5IikpOwogICAgICAgICAgICAg c2F2ZU1lc3NhZ2VJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFu ZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuc2F2ZU1lc3NhZ2VUb0Rpc2siKSk7Ci0gICAgICAg ICAgICBkb3dubG9hZEtleXNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNz YWdlUGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuZG93bmxvYWRLZXlzVG8iKSk7Ci0gICAg ICAgICAgICBicm93c2VJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdl UGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuYnJvd3NlIikpOworICAgICAgICAgICAgZG93 bmxvYWRLZXlzLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFuZS5tZXNz YWdlVGV4dC5wb3B1cG1lbnUuZG93bmxvYWRLZXlzIikpOwogICAgICAgICB9CiAKICAgICAg ICAgQE92ZXJyaWRlCkBAIC0xMTMwLDExICsxMDYzLDEwIEBADQogICAgICAgICAgICAgaWYg KChzZWxlY3RlZE1lc3NhZ2UgIT0gbnVsbCkgJiYgKHNlbGVjdGVkTWVzc2FnZS5nZXRDb250 ZW50KCkgIT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc291cmNlVGV4dENvbXBv bmVudC5nZXRTZWxlY3RlZFRleHQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAg IGNvcHlJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvd25s b2FkS2V5c0l0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcG9w dWxhdGVEb3dubG9hZEtleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRLZXlz LnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg ICAgICAgICAgICAgY29weUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAg ICAgICAgIGRvd25sb2FkS2V5c0l0ZW0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAg ICAgICAgICAgIGRvd25sb2FkS2V5cy5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICAgc3VwZXIuc2hvdyhpbnZva2VyLCB4LCB5KTsKICAg ICAgICAgICAgIH0KQEAgLTExNDUsNyArMTA3Nyw3IEBADQogICAgICAgICByZXR1cm4gRmls ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCkuZ2V0TW9kZWwo KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBwcm90ZWN0ZWQg dm9pZCBjbG9zZSgpIHsKICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdzLnJlbW92ZVByb3Bl cnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5NRVNTQUdFX0JPRFlfRk9OVF9OQU1F LCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdz LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5NRVNTQUdFX0JP RFlfRk9OVF9TSVpFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKICAgICAgICAgQ29yZS5m cm9zdFNldHRpbmdzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFz cy5NRVNTQUdFX0JPRFlfRk9OVF9TVFlMRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Cklu ZGV4OiBzb3VyY2UvaTE4bi9sYW5ncmVzLnByb3BlcnRpZXMNCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t LSBzb3VyY2UvaTE4bi9sYW5ncmVzLnByb3BlcnRpZXMJKHJldmlzaW9uIDMxOTcpDQorKysg c291cmNlL2kxOG4vbGFuZ3Jlcy5wcm9wZXJ0aWVzCSh3b3JraW5nIGNvcHkpDQpAQCAtOCw4 ICs4LDE0IEBADQogQWJvdXRCb3gudGV4dC53aW5kb3dzSW5zdGFsbGVyPVdpbmRvd3MgSW5z dGFsbGVyOgogQWJvdXRCb3gudGl0bGU9QWJvdXQKIEFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50 aXRsZT1BZGQgbmV3IEZpbGVzIHRvIGRvd25sb2FkIGxpc3QKK0FkZE5ld0Rvd25sb2Fkc0Rp YWxvZy5idXR0b24ucmVuYW1lRmlsZT1SZW5hbWUgZmlsZQorQWRkTmV3RG93bmxvYWRzRGlh bG9nLmJ1dHRvbi5wcmVmaXhGaWxlbmFtZT1BZGQgcHJlZml4IHRvIGZpbGVuYW1lCiBBZGRO ZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLmNoYW5nZURvd25sb2FkRGlyPUNoYW5nZSBkb3du bG9hZCB0YXJnZXQgZGlyZWN0b3J5CiBBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLnJl bW92ZURvd25sb2FkPVJlbW92ZQorQWRkTmV3RG93bmxvYWRzRGlhbG9nLnJlbmFtZUZpbGVE aWFsb2cuZGlhbG9nVGl0bGU9UmVuYW1lIGZpbGUKK0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5y ZW5hbWVGaWxlRGlhbG9nLmRpYWxvZ0JvZHk9RW50ZXIgbmV3IGZpbGVuYW1lCitBZGROZXdE b3dubG9hZHNEaWFsb2cucHJlZml4RmlsZW5hbWVEaWFsb2cuZGlhbG9nVGl0bGU9UHJlZml4 IGZpbGUKK0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5wcmVmaXhGaWxlbmFtZURpYWxvZy5kaWFs b2dCb2R5PUVudGVyIHByZWZpeCBmb3IgZmlsZW5hbWUKIEFkZE5ld0Rvd25sb2Fkc0RpYWxv Zy5jaGFuZ2VEaXJEaWFsb2cudGl0bGU9Q2hhbmdlIHRhcmdldCBkaXJlY3RvcnkKIEFkZE5l d0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5uYW1lPU5hbWUKIEFkZE5ld0Rvd25sb2Fkc0RpYWxv Zy50YWJsZS5rZXk9S2V5CkBAIC00OTIsMTAgKzQ5OCwxMSBAQA0KIE1lc3NhZ2VQYW5lLm1l c3NhZ2VUZXh0LnBvcHVwbWVudS5jb3B5PUNvcHkKIE1lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0 LnBvcHVwbWVudS5zYXZlTWVzc2FnZVRvRGlzaz1TYXZlIG1lc3NhZ2UgdG8gZGlzawogTWVz c2FnZVBhbmUubWVzc2FnZVRleHQuc2F2ZURpYWxvZy50aXRsZT1TYXZlIG1lc3NhZ2UgdG8g ZGlzawotTWVzc2FnZVBhbmUubWVzc2FnZVRleHQuZG93bmxvYWRQcmVmaXhEaWFsb2cudGl0 bGU9RmlsZW5hbWUgcHJlZml4Ci1NZXNzYWdlUGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUu ZG93bmxvYWRLZXlzVG89RG93bmxvYWQga2V5cyB0by4uLgotTWVzc2FnZVBhbmUubWVzc2Fn ZVRleHQucG9wdXBtZW51LmJyb3dzZT1Ccm93c2UuLi4KLU1lc3NhZ2VQYW5lLm1lc3NhZ2VU ZXh0LmRvd25sb2FkUHJlZml4RGlhbG9nLmJvZHk9RW50ZXIgdGV4dCB0byBwcmVmaXggZmls ZW5hbWVzIHdpdGgsIG9yIGxlYXZlIGVtcHR5IGZvciBubyBwcmVmaXgKK01lc3NhZ2VQYW5l Lm1lc3NhZ2VUZXh0LnBvcHVwbWVudS5kb3dubG9hZEtleXM9RG93bmxvYWQgc2VsZWN0ZWQg a2V5cworI01lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LmRvd25sb2FkUHJlZml4RGlhbG9nLnRp dGxlPUZpbGVuYW1lIHByZWZpeAorI01lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LnBvcHVwbWVu dS5kb3dubG9hZEtleXNUbz1Eb3dubG9hZCBrZXlzIHRvLi4uCisjTWVzc2FnZVBhbmUubWVz c2FnZVRleHQucG9wdXBtZW51LmJyb3dzZT1Ccm93c2UuLi4KKyNNZXNzYWdlUGFuZS5tZXNz YWdlVGV4dC5kb3dubG9hZFByZWZpeERpYWxvZy5ib2R5PUVudGVyIHRleHQgdG8gcHJlZml4 IGZpbGVuYW1lcyB3aXRoLCBvciBsZWF2ZSBlbXB0eSBmb3Igbm8gcHJlZml4CiBNZXNzYWdl UGFuZS5taXNzaW5nQm9hcmRFcnJvci50ZXh0PUNhbid0IHJlcGx5LCB0aGUgdGFyZ2V0IGJv YXJkICcnezB9JycgaXMgbm90IGluIHlvdXIgYm9hcmRsaXN0LgogTWVzc2FnZVBhbmUubWlz c2luZ0JvYXJkRXJyb3IudGl0bGU9RXJyb3IKIE1lc3NhZ2VQYW5lLm1pc3NpbmdMb2NhbElk ZW50aXR5RXJyb3IudGV4dD1DYW4ndCByZXBseSBlbmNyeXB0ZWQsIHlvdXIgaWRlbnRpdHkg Jyd7MH0nJyB0aGF0IHJlY2VpdmVkIHRoZSBvcmlnaW5hbCBtZXNzYWdlIGlzIG1pc3Npbmch Cg== --------------070101010302050001010502 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------------ Lotusphere 2011 Register now for Lotusphere 2011 and learn how to connect the dots, take your collaborative environment to the next level, and enter the era of Social Business. http://p.sf.net/sfu/lotusphere-d2d --------------070101010302050001010502 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Jtcfrost-devl mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jtcfrost-devl --------------070101010302050001010502--