ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS51aS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvdWkvY29udGVudGFzc2lzdC9Sb29tUHJvcG9zYWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLnVpL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvY29yZS91aS9jb250ZW50YXNzaXN0L1Jvb21Qcm9wb3NhbFByb3ZpZGVyLmphdmEKaW5kZXggZWEyMzljYS4uYmEzNWZjYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLnVpL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvY29yZS91aS9jb250ZW50YXNzaXN0L1Jvb21Qcm9wb3NhbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLnVpL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvY29yZS91aS9jb250ZW50YXNzaXN0L1Jvb21Qcm9wb3NhbFByb3ZpZGVyLmphdmEKQEAgLTI2LDE0ICsyNiwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uQWN0b3JJbnN0YW5jZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5BY3RvclJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkRhdGFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkxheWVyQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLk9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLlJlZlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5SZWZTQVBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUmVsYXlTQVBvaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUm9vbUFubm90YXRpb25UYXJnZXRFbnVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUm9vbVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5TUFA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5TdGFuZGFyZE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLnV0aWwuUm9vbUhlbHBlcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7CkBAIC00MSw5ICszNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuUnVsZUNhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUVPYmplY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdENvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yOwogCkBAIC0xMjMsOSArMTE3LDYgQEAKIAlASW5qZWN0CiAJcHJvdGVjdGVkIFJvb21OYW1lUHJvdmlkZXIgcm9vbU5hbWVQcm92aWRlcjsKIAkKLQlASW5qZWN0Ci0JcHJvdGVjdGVkIElRdWFsaWZpZWROYW1lUHJvdmlkZXIgZnFuUHJvdmlkZXI7Ci0JCiAJcHJvdGVjdGVkIEZ1bmN0aW9uPElFT2JqZWN0RGVzY3JpcHRpb24sIElDb21wbGV0aW9uUHJvcG9zYWw+IGdldFByb3Bvc2FsRmFjdG9yeShTdHJpbmcgcnVsZU5hbWUsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRlbnRBc3Npc3RDb250ZXh0KSB7CiAJCWlmIChjb250ZW50QXNzaXN0Q29udGV4dCE9bnVsbCAmJiBjb250ZW50QXNzaXN0Q29udGV4dC5nZXRDdXJyZW50TW9kZWwoKS5lQ2xhc3MoKT09Um9vbVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdG9yUmVmKCkpCiAJCQlyZXR1cm4gbmV3IEZpbHRlcmVkUHJvcG9zYWxDcmVhdG9yKG5ldyBBY3RvclJlZkZpbHRlcigpLCBjb250ZW50QXNzaXN0Q29udGV4dCwgcnVsZU5hbWUpOwpAQCAtMjI4LDM3ICsyMTksNiBAQAogCQlyZXR1cm4gcmVmczsKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUxheWVyQ29ubmVjdGlvbl9UbyhFT2JqZWN0IG1vZGVsLAotCQkJQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7Ci0JCXN1cGVyLmNvbXBsZXRlTGF5ZXJDb25uZWN0aW9uX1RvKG1vZGVsLCBhc3NpZ25tZW50LCBjb250ZXh0LCBhY2NlcHRvcik7Ci0JCQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBMYXllckNvbm5lY3Rpb24pIHsKLQkJCUxheWVyQ29ubmVjdGlvbiBsYyA9IChMYXllckNvbm5lY3Rpb24pIG1vZGVsOwotCQkJaWYgKGxjLmdldEZyb20oKSBpbnN0YW5jZW9mIFJlZlNBUG9pbnQpIHsKLQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYgKGxjLmdldEZyb20oKSBpbnN0YW5jZW9mIFJlbGF5U0FQb2ludCkgewotCQkJCVNQUCBzcHAgPSAoKFJlbGF5U0FQb2ludClsYy5nZXRGcm9tKCkpLmdldFJlbGF5KCk7Ci0JCQkJTGlzdDxBY3RvckNsYXNzPiBjbGFzc2VzID0gcm9vbUhlbHBlcnMuZ2V0Q2xhc3NIaWVyYXJjaHkoKEFjdG9yQ2xhc3MpIHNwcC5lQ29udGFpbmVyKCkpOwotCQkJCWZvciAoQWN0b3JDbGFzcyBhYyA6IGNsYXNzZXMpIHsKLQkJCQkJZm9yIChBY3RvclJlZiBhciA6IGFjLmdldEFjdG9yUmVmcygpKSB7Ci0JCQkJCQlTdHlsZWRTdHJpbmcgZGlzcGxheVN0cmluZyA9IGdldFN0eWxlZERpc3BsYXlTdHJpbmcoYXIsIGZxblByb3ZpZGVyLmFwcGx5KGFyKS50b1N0cmluZygpLCBhci5nZXROYW1lKCkpOwotCQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCByZXN1bHQgPSBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoYXIuZ2V0TmFtZSgpLCBkaXNwbGF5U3RyaW5nLCBnZXRJbWFnZShhciksIGdldFByaW9yaXR5SGVscGVyKCkuZ2V0RGVmYXVsdFByaW9yaXR5KCksCi0JCQkJCQkJCWNvbnRleHQuZ2V0UHJlZml4KCksIGNvbnRleHQpOwotCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJCQkJCSgoQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHQpLnNldFByb3Bvc2FsQ29udGV4dFJlc291cmNlKGNvbnRleHQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJKChDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdCkuc2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhhcik7Ci0JCQkJCQkJKChDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdCkuc2V0SG92ZXIoZ2V0SG92ZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY2NlcHRvci5hY2NlcHQocmVzdWx0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKIC8vCXB1YmxpYyB2b2lkIGNvbXBsZXRlQWN0b3JSZWZfVHlwZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgewogLy8JCXN1cGVyLmNvbXBsZXRlQWN0b3JSZWZfVHlwZSgKIC8vCQkJICAgIG1vZGVsLCAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvbmFtaW5nL1Jvb21GcmFnbWVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL25hbWluZy9Sb29tRnJhZ21lbnRQcm92aWRlci5qYXZhCmluZGV4IGMwNGQ4ZDQuLmQ3NzJiMGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvbmFtaW5nL1Jvb21GcmFnbWVudFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvY29yZS9uYW1pbmcvUm9vbUZyYWdtZW50UHJvdmlkZXIuamF2YQpAQCAtMTA5LDI1ICsxMDksMTYgQEAKIAkJcHJpdmF0ZSBTdHJpbmcgY2FzZVNBUG9pbnRTaG9ydChTQVBvaW50IHNhcHQpIHsKIAkJCWlmIChzYXB0PT1udWxsKQogCQkJCXJldHVybiAibnVsbCI7Ci0JCQlpZiAoc2FwdCBpbnN0YW5jZW9mIFJlZlNBUG9pbnQpIHsKLQkJCQlpZiAoKChSZWZTQVBvaW50KSBzYXB0KS5nZXRSZWYoKT09bnVsbCkKLQkJCQkJcmV0dXJuICI8bm90X3Jlc29sdmVkPiI7CisJCQlpZiAoc2FwdCBpbnN0YW5jZW9mIFJlZlNBUG9pbnQpCiAJCQkJcmV0dXJuICgoUmVmU0FQb2ludCkgc2FwdCkuZ2V0UmVmKCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoc2FwdCBpbnN0YW5jZW9mIFJlbGF5U0FQb2ludCkgewotCQkJCWlmICgoKFJlbGF5U0FQb2ludCkgc2FwdCkuZ2V0UmVsYXkoKT09bnVsbCkKLQkJCQkJcmV0dXJuICI8bm90X3Jlc29sdmVkPiI7CisJCQllbHNlIGlmIChzYXB0IGluc3RhbmNlb2YgUmVsYXlTQVBvaW50KQogCQkJCXJldHVybiAoKFJlbGF5U0FQb2ludCkgc2FwdCkuZ2V0UmVsYXkoKS5nZXROYW1lKCk7Ci0JCQl9CiAKIAkJCWFzc2VydChmYWxzZSk6ICJ1bmV4cGVjdGQgc3ViIHR5cGUiOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAogCQlwcml2YXRlIFN0cmluZyBjYXNlU1BQb2ludFNob3J0KFNQUG9pbnQgc3BwdCkgewotCQkJaWYgKHNwcHQ9PW51bGwgfHwgc3BwdC5nZXRSZWYoKT09bnVsbCB8fCBzcHB0LmdldFNlcnZpY2UoKT09bnVsbCkgewotCQkJCXJldHVybiAiPG5vdF9yZXNvbHZlZD4iOwotCQkJfQogCQkJcmV0dXJuIHNwcHQuZ2V0UmVmKCkuZ2V0TmFtZSgpK0VQX1NFUCtzcHB0LmdldFNlcnZpY2UoKS5nZXROYW1lKCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL3Njb3BpbmcvUm9vbVNjb3BlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvc2NvcGluZy9Sb29tU2NvcGVQcm92aWRlci5qYXZhCmluZGV4IDk3MmU1OGEuLjExZmNhZDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvc2NvcGluZy9Sb29tU2NvcGVQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvc2NvcGluZy9Sb29tU2NvcGVQcm92aWRlci5qYXZhCkBAIC00MTUsNyArNDE1LDcgQEAKIAkgKiBAcGFyYW0gcmVmCiAJICogQHJldHVybiBhIGxpc3Qgb2Ygc2NvcGVzCiAJICovCi0JcHVibGljIElTY29wZSBzY29wZV9TUFBvaW50X3JlZihTUFBvaW50IHB0LCBFUmVmZXJlbmNlIHJlZikgeworCXB1YmxpYyBJU2NvcGUgc2NvcGVfU1BQb2ludF9hY3RvclJlZihTUFBvaW50IHB0LCBFUmVmZXJlbmNlIHJlZikgewogCQlmaW5hbCBMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IHNjb3BlcyA9IG5ldyBBcnJheUxpc3Q8SUVPYmplY3REZXNjcmlwdGlvbj4oKTsKIAogCQlBY3RvckNvbnRhaW5lckNsYXNzIGFjYyA9IGdldEFjdG9yQ29udGFpbmVyQ2xhc3MocHQpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvY29yZS92YWxpZGF0aW9uL1Jvb21KYXZhVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL3ZhbGlkYXRpb24vUm9vbUphdmFWYWxpZGF0b3IuamF2YQppbmRleCBjODJhMWM0Li41OTQ1ZTIzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL3ZhbGlkYXRpb24vUm9vbUphdmFWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL3ZhbGlkYXRpb24vUm9vbUphdmFWYWxpZGF0b3IuamF2YQpAQCAtMjIyLDYgKzIyMiw3IEBACiAJCQlpZiAoYXIuZ2V0TXVsdGlwbGljaXR5KCk+MSkgewogCQkJCWZvciAoUG9ydCBwIDogYWMuZ2V0SW50ZXJmYWNlUG9ydHMoKSkgewogCQkJCQlpZiAocC5nZXRNdWx0aXBsaWNpdHkoKTwwKSB7CisJCQkJCQlpbnQgaWR4ID0gKChBY3RvckNvbnRhaW5lckNsYXNzKWFyLmVDb250YWluZXIoKSkuZ2V0QWN0b3JSZWZzKCkuaW5kZXhPZihhcik7CiAJCQkJCQllcnJvcigicmVwbGljYXRlZCBhY3RvciBtdXN0IG5vdCBoYXZlIHJlcGxpY2F0ZWQgcG9ydCB3aXRoIGFyYml0cmFyeSBtdWx0aXBsaWNpdHkiLCBudWxsKTsKIAkJCQkJfQogCQkJCX0KQEAgLTIzMSw3ICsyMzIsNyBAQAogCiAJQENoZWNrCiAJcHVibGljIHZvaWQgY2hlY2tMYXllckNvbm5lY3Rpb250YXJnZXQoTGF5ZXJDb25uZWN0aW9uIGxjKSB7Ci0JCWlmIChsYyE9bnVsbCAmJiBsYy5nZXRUbygpIT1udWxsICYmIGxjLmdldFRvKCkuZ2V0UmVmKCkgaW5zdGFuY2VvZiBBY3RvclJlZikKKwkJaWYgKGxjLmdldFRvKCkuZ2V0UmVmKCkgaW5zdGFuY2VvZiBBY3RvclJlZikKIAkJCWlmICgoKEFjdG9yUmVmKWxjLmdldFRvKCkuZ2V0UmVmKCkpLmdldE11bHRpcGxpY2l0eSgpPjEpCiAJCQkJZXJyb3IoImxheWVyIGNvbm5lY3Rpb24gbXVzdCBub3QgY29ubmVjdCB0byByZXBsaWNhdGVkIGFjdG9yIiwgbnVsbCk7CiAJfQpAQCAtNDI0LDcgKzQyNSw3IEBACiAJcHVibGljIHZvaWQgY2hlY2tTZXJ2aWNlQ29tcGF0aWJpbGl0eShMYXllckNvbm5lY3Rpb24gY29ubikgewogCQlSZXN1bHQgcmVzdWx0ID0gdmFsaWRhdGlvblV0aWwuaXNWYWxpZChjb25uKTsKIAkJaWYgKCFyZXN1bHQuaXNPaygpKQotCQkJZXJyb3IocmVzdWx0LmdldE1zZygpLCByZXN1bHQuZ2V0U291cmNlKCksIHJlc3VsdC5nZXRGZWF0dXJlKCkpOworCQkJZXJyb3IocmVzdWx0LmdldE1zZygpLCBSb29tUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF5ZXJDb25uZWN0aW9uX0Zyb20oKSk7CiAJfQogCiAJQENoZWNrCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20vc3JjL29yZy9lY2xpcHNlL2V0cmljZS9jb3JlL3ZhbGlkYXRpb24vVmFsaWRhdGlvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVXRpbC5qYXZhCmluZGV4IDFjYjY5YjUuLmExNGMxNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2NvcmUvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVXRpbC5qYXZhCkBAIC00MSw3ICs0MSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5SZWZlcmVuY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUmVsYXlTQVBvaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUm9vbU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUm9vbVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5TUFA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5TUFBvaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU2VydmljZUltcGxlbWVudGF0aW9uOwpAQCAtNDkxLDE4ICs0OTAsMTAgQEAKIAl9CiAJCiAJcHVibGljIFJlc3VsdCBpc1ZhbGlkKExheWVyQ29ubmVjdGlvbiBsYykgewotCQlpZiAobGMuZ2V0RnJvbSgpIGluc3RhbmNlb2YgUmVsYXlTQVBvaW50KSB7Ci0JCQlpZiAoKChSZWxheVNBUG9pbnQpbGMuZ2V0RnJvbSgpKSE9bnVsbCAmJiBsYy5nZXRUbygpIT1udWxsICYmIGxjLmdldFRvKCkuZ2V0U2VydmljZSgpIT1udWxsKQotCQkJCXJldHVybiBpc0Nvbm5lY3RhYmxlKGxjLCAoKFJlbGF5U0FQb2ludClsYy5nZXRGcm9tKCkpLmdldFJlbGF5KCksIG51bGwsIGxjLmdldFRvKCkuZ2V0U2VydmljZSgpLCBsYy5nZXRUbygpLmdldFJlZigpLCAoU3RydWN0dXJlQ2xhc3MpbGMuZUNvbnRhaW5lcigpLCBsYyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFJlc3VsdC5lcnJvcigiaW5jb21wbGV0ZSBsYXllciBjb25uZWN0aW9uIik7Ci0JCX0KLQkJZWxzZSBpZiAobGMuZ2V0RnJvbSgpIGluc3RhbmNlb2YgUmVmU0FQb2ludCkgewotCQkJaWYgKCgoUmVmU0FQb2ludClsYy5nZXRGcm9tKCkpIT1udWxsICYmICgoUmVmU0FQb2ludClsYy5nZXRGcm9tKCkpLmdldFJlZigpIT1udWxsICYmIGxjLmdldFRvKCkhPW51bGwgJiYgbGMuZ2V0VG8oKS5nZXRTZXJ2aWNlKCkhPW51bGwgJiYgbGMuZ2V0VG8oKS5nZXRSZWYoKSE9bnVsbCkKLQkJCQlyZXR1cm4gaXNDb25uZWN0YWJsZShsYywgbnVsbCwgKChSZWZTQVBvaW50KWxjLmdldEZyb20oKSkuZ2V0UmVmKCksIGxjLmdldFRvKCkuZ2V0U2VydmljZSgpLCBsYy5nZXRUbygpLmdldFJlZigpLCAoU3RydWN0dXJlQ2xhc3MpbGMuZUNvbnRhaW5lcigpLCBsYyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFJlc3VsdC5lcnJvcigiaW5jb21wbGV0ZSBsYXllciBjb25uZWN0aW9uIik7Ci0JCX0KKwkJaWYgKGxjLmdldEZyb20oKSBpbnN0YW5jZW9mIFJlbGF5U0FQb2ludCkKKwkJCXJldHVybiBpc0Nvbm5lY3RhYmxlKCgoUmVsYXlTQVBvaW50KWxjLmdldEZyb20oKSkuZ2V0UmVsYXkoKSwgbnVsbCwgbGMuZ2V0VG8oKS5nZXRTZXJ2aWNlKCksIGxjLmdldFRvKCkuZ2V0UmVmKCksIChTdHJ1Y3R1cmVDbGFzcylsYy5lQ29udGFpbmVyKCksIGxjKTsKKwkJZWxzZSBpZiAobGMuZ2V0RnJvbSgpIGluc3RhbmNlb2YgUmVmU0FQb2ludCkKKwkJCXJldHVybiBpc0Nvbm5lY3RhYmxlKG51bGwsICgoUmVmU0FQb2ludClsYy5nZXRGcm9tKCkpLmdldFJlZigpLCBsYy5nZXRUbygpLmdldFNlcnZpY2UoKSwgbGMuZ2V0VG8oKS5nZXRSZWYoKSwgKFN0cnVjdHVyZUNsYXNzKWxjLmVDb250YWluZXIoKSwgbGMpOwogCQllbHNlIHsKIAkJCWFzc2VydChmYWxzZSk6ICJ1bmV4cGVjdGVkIHN1YiB0eXBlIjsKIAkJCXJldHVybiBSZXN1bHQuZXJyb3IoImludGVybmFsIGVycm9yIik7CkBAIC01MTEsMTAgKzUwMiwxMCBAQAogCQogCXB1YmxpYyBSZXN1bHQgaXNDb25uZWN0YWJsZShTUFAgc3JjLCBBY3RvckNvbnRhaW5lclJlZiBzcmNSZWYsCiAJCQlTUFAgdGd0LCBBY3RvckNvbnRhaW5lclJlZiB0Z3RSZWYsIFN0cnVjdHVyZUNsYXNzIGFjKSB7Ci0JCXJldHVybiBpc0Nvbm5lY3RhYmxlKG51bGwsIHNyYywgc3JjUmVmLCB0Z3QsIHRndFJlZiwgYWMsIG51bGwpOworCQlyZXR1cm4gaXNDb25uZWN0YWJsZShzcmMsIHNyY1JlZiwgdGd0LCB0Z3RSZWYsIGFjLCBudWxsKTsKIAl9CiAJCi0JcHVibGljIFJlc3VsdCBpc0Nvbm5lY3RhYmxlKExheWVyQ29ubmVjdGlvbiBsYywgU1BQIHNyYywgQWN0b3JDb250YWluZXJSZWYgc3JjUmVmLAorCXB1YmxpYyBSZXN1bHQgaXNDb25uZWN0YWJsZShTUFAgc3JjLCBBY3RvckNvbnRhaW5lclJlZiBzcmNSZWYsCiAJCQlTUFAgZHN0LCBBY3RvckNvbnRhaW5lclJlZiBkc3RSZWYsIFN0cnVjdHVyZUNsYXNzIHNjLCBMYXllckNvbm5lY3Rpb24gZXhjbHVkZSkgewogCiAJCWlmIChzYz09bnVsbCkgewpAQCAtNTIyLDEzICs1MTMsMTMgQEAKIAkJfQogCQkKIAkJaWYgKChzcmM9PW51bGwgJiYgc3JjUmVmPT1udWxsKSB8fCAoc3JjIT1udWxsICYmIHNyY1JlZiE9bnVsbCkpCi0JCQlyZXR1cm4gUmVzdWx0LmVycm9yKCJzb3VyY2UgY2FuIGJlIGFuIG93biBTUFAgX29yXyBhIHJlZiIsIGxjLCBSb29tUGFja2FnZS5MaXRlcmFscy5MQVlFUl9DT05ORUNUSU9OX19GUk9NKTsKKwkJCXJldHVybiBSZXN1bHQuZXJyb3IoInNvdXJjZSBjYW4gYmUgYW4gb3duIFNQUCBfb3JfIGEgcmVmIik7CiAJCQogCQlpZiAoZHN0PT1udWxsIHx8IGRzdFJlZj09bnVsbCkKLQkJCXJldHVybiBSZXN1bHQuZXJyb3IoImRlc3RpbmF0aW9uIG11c3QgYmUgYW4gU1BQIG9uIGEgcmVmIiwgbGMsIFJvb21QYWNrYWdlLkxpdGVyYWxzLkxBWUVSX0NPTk5FQ1RJT05fX1RPKTsKKwkJCXJldHVybiBSZXN1bHQuZXJyb3IoImRlc3RpbmF0aW9uIG11c3QgYmUgYW4gU1BQIG9uIGEgcmVmIik7CiAKIAkJaWYgKHNyYyE9bnVsbCAmJiBpc0Nvbm5lY3RlZFNyYyhzcmMsIHNjLCBleGNsdWRlKSkKLQkJCXJldHVybiBSZXN1bHQuZXJyb3IoInNvdXJjZSBTUFAgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLCBsYywgUm9vbVBhY2thZ2UuTGl0ZXJhbHMuTEFZRVJfQ09OTkVDVElPTl9fRlJPTSk7CisJCQlyZXR1cm4gUmVzdWx0LmVycm9yKCJzb3VyY2UgU1BQIGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAJCQogCQkvLyB0aGUgZGVzdGluYXRpb24gbWF5IGJlIGNvbm5lY3RlZCBzZXZlcmFsIHRpbWVzLCBzbyBkb24ndCBjaGVjayB0aGlzCiAJCS8vCQlpZiAoaXNDb25uZWN0ZWREc3QoZHN0LCBkc3RSZWYsIHNjLCBleGNsdWRlKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9BY3RvckNsYXNzR2VuLnh0ZW5kIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL0FjdG9yQ2xhc3NHZW4ueHRlbmQKaW5kZXggODI1MWZjZS4uZTEyMjgwOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL0FjdG9yQ2xhc3NHZW4ueHRlbmQKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL0FjdG9yQ2xhc3NHZW4ueHRlbmQKQEAgLTE2LDcgKzE2LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b24KIGltcG9ydCBqYXZhLnV0aWwuTWFwCiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZnNtLmZTTS5Db21wb25lbnRDb21tdW5pY2F0aW9uVHlwZQotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmJ1aWxkZXIuR2VubW9kZWxDb25zdGFudHMKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uRXhwYW5kZWRBY3RvckNsYXNzCiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLlJvb3QKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uV2lyZWRBY3RvckNsYXNzCkBAIC03Myw2ICs3Miw3IEBACiAJCSNpbmNsdWRlICJjb21tb24vZXREYXRhdHlwZXNDcHAuaHBwIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9JUlRPYmplY3QuaCIKIAkJI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvUG9ydEJhc2UuaCIKKwkJI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9BZGRyZXNzLmgiCkBAIC05Miw2ICs5Miw5IEBACiAJCatFTFNFuwogCQkJI2luY2x1ZGUgIqthYy5hY3RvckJhc2UucGF0aLurYWMuYWN0b3JCYXNlLm5hbWW7LmgiCiAJCatFTkRJRrsKKwkJq0ZPUiBhciA6IGFjLmFjdG9yUmVmc7sKKwkJCSNpbmNsdWRlICKrYXIudHlwZS5hY3RvckluY2x1ZGVQYXRouyIKKwkJq0VOREZPUrsKIAogCQmrYWMudXNlckNvZGUxLnVzZXJDb2RluwogCkBAIC0xMDgsNiArMTExLDE1IEBACiAJCQkJCatlcC5nZXRQb3J0Q2xhc3NOYW1luyCrZXAubmFtZbs7CiAJCQkJq0VOREZPUrsKIAorCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN1YiBhY3RvcnMKKwkJCQmrRk9SIHN1YiA6IGFjLmFjdG9yUmVmc7sKKwkJCQkJq0lGIHN1Yi5tdWx0aXBsaWNpdHkgPiAxuworCQkJCQkJUmVwbGljYXRlZKtzdWIudHlwZS5pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZbsgq3N1Yi5uYW1luzsKKwkJCQkJq0VMU0W7CisJCQkJCQmrc3ViLnR5cGUuaW1wbGVtZW50YXRpb25DbGFzc05hbWW7IKtzdWIubmFtZbs7CisJCQkJCatFTkRJRrsKKwkJCQmrRU5ERk9SuworCiAJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2FwcwogCQkJCatGT1Igc2FwIDogYWMuc2VydmljZUFjY2Vzc1BvaW50c7sKIAkJCQkJq3NhcC5nZXRQb3J0Q2xhc3NOYW1luyCrc2FwLm5hbWW7OwpAQCAtMTI4LDYgKzE0MCwxMCBAQAogCQkJcHVibGljOgogCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0cnVjdGlvbgogCQkJCathYy5uYW1luyhldFJ1bnRpbWU6OklSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisJCQkJdm9pZCBpbml0aWFsaXplKHZvaWQpOworCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQkJdm9pZCBzZXRQcm9iZXNBY3RpdmUoYm9vbCByZWN1cnNpdmUsIGJvb2wgYWN0aXZlKTsKKwkJCQmrRU5ESUa7CiAKIKurqwlUT0RPOiBjaGVjayB3aGV0aGVyIGF0dHJpYnV0ZSBzZXR0ZXJzL2dldHRlcnMgYXJlIG5lY2Vzc2FyeSBhdCBhbGwsIGlmIHllcyBvd24gY3BwIGltcGxlbWVudGF0aW9uIGlzIG5lZWRlZCBmb3IgKixbXSwmIHZhcmlhYmxlcwogq6urCQkJCathdHRyaWJ1dGVTZXR0ZXJzR2V0dGVyc0ltcGxlbWVudGF0aW9uKGFjLmF0dHJpYnV0ZXMsIGFjLm5hbWUpuwpAQCAtMTYyLDYgKzE3OCwxNyBAQAogCiAJCX07CiAKKwkJY2xhc3MgUmVwbGljYXRlZKtjbHNuYW1luyA6IHB1YmxpYyBSZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2UgeworCQlwdWJsaWM6CisJCQlSZXBsaWNhdGVkq2Nsc25hbWW7KElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgorCQkJCVJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZShwYXJlbnQsIG5hbWUpIHt9CisJCQkKKwkJcHJvdGVjdGVkOgorCQkJQWN0b3JDbGFzc0Jhc2UqIGNyZWF0ZUFjdG9yKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworCQkJCXJldHVybiBuZXcgq2Nsc25hbWW7KHBhcmVudCwgbmFtZSk7CisJCQl9CisJCX07CisKIAkJq2FjLmdlbmVyYXRlTmFtZXNwYWNlRW5kuwogCiAJCatnZW5lcmF0ZUluY2x1ZGVHdWFyZEVuZChhYywgJycpuwpAQCAtMTc2LDYgKzIwMyw4IEBACiAJCWluaXRMaXN0ICs9ICcnJ6thYy5hY3RvckJhc2U/Lm5hbWUgPzogJ0FjdG9yQ2xhc3NCYXNlJ7socGFyZW50LCBuYW1lKScnJwogCSAgICAvLyBvd24gcG9ydHMKIAkgICAgaW5pdExpc3QgKz0gYWMuZW5kUG9ydHMubWFwWycnJ6tuYW1luyh0aGlzLCAiq25hbWW7IiwgSUZJVEVNX6tuYW1luyknJyddCisJICAgIC8vIG93biBzdWIgYWN0b3JzCisJICAgIGluaXRMaXN0ICs9IGFjLmFjdG9yUmVmcy5tYXBbJycnq25hbWW7KHRoaXMsICKrbmFtZbsiKScnJ10KIAkJLy8gb3duIHNhcHMKIAkJaW5pdExpc3QgKz0gYWMuc2VydmljZUFjY2Vzc1BvaW50cy5tYXBbJycnq25hbWW7KHRoaXMsICKrbmFtZbsiLCBJRklURU1fq25hbWW7KScnJ10KIAkJLy8gb3duIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCkBAIC0yMDUsMTAgKzIzNCw4IEBACiAKIAkJI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvUlRPYmplY3QuaCIKIAkJI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvUlRTZXJ2aWNlcy5oIgotCi0JCatGT1IgYXIgOiBhYy5hY3RvclJlZnO7Ci0JCQkjaW5jbHVkZSAiq2FyLnR5cGUuYWN0b3JJbmNsdWRlUGF0aLsiCi0JCatFTkRGT1K7CisJCSNpbmNsdWRlICJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaCIKKwkJI2luY2x1ZGUgImNvbW1vbi9kZWJ1Z2dpbmcvTVNDRnVuY3Rpb25PYmplY3QuaCIKIAogCQl1c2luZyBuYW1lc3BhY2UgZXRSdW50aW1lOwogCkBAIC0yMTcsNiArMjQ0LDEwIEBACiAJCatjbHNuYW1luzo6q2Nsc25hbWW7KGV0UnVudGltZTo6SVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQogCQkJCathYy5nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3S7CiAJCXsKKwkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQlNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksICJDb25zdHJ1Y3RvciIpOworCQkJq0VORElGuworCQkJCiAJCQmrSUYgYWMuaGFzTm9uRW1wdHlTdGF0ZU1hY2hpbmW7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzX251bWJlck9mU3RhdGVzOyBpKyspIHsKIAkJCQkJaGlzdG9yeVtpXSA9IE5PX1NUQVRFOwpAQCAtMjI3LDIwICsyNTgsMzQgQEAKIAkJCS8vIHN1YiBhY3RvcnMKIAkJCatGT1Igc3ViIDogYWMuYWN0b3JSZWZzuwogCQkJCatJRiBzdWIubXVsdGlwbGljaXR5PjG7Ci0JCQkJCWZvciAoaW50IGk9MDsgaTyrc3ViLm11bHRpcGxpY2l0ebs7ICsraSkgewotCQkJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuwotCQkJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFjdG9yQ3JlYXRlKCp0aGlzLCAiq3N1Yi5uYW1lu6tHZW5tb2RlbENvbnN0YW50czo6SU5ERVhfU0VQuyIraSk7Ci0JCQkJCQmrRU5ESUa7Ci0JCQkJCQluZXcgq3N1Yi50eXBlLmltcGxlbWVudGF0aW9uQ2xhc3NOYW1luyh0aGlzLCAiq3N1Yi5uYW1lu6tHZW5tb2RlbENvbnN0YW50czo6SU5ERVhfU0VQuyIraSk7Ci0JCQkJCX0KLQkJCQmrRUxTRbsKLQkJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuwotCQkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsICKrc3ViLm5hbWW7Iik7Ci0JCQkJCatFTkRJRrsKLQkJCQkJbmV3IKtzdWIudHlwZS5pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZbsodGhpcywgIqtzdWIubmFtZbsiKTsKKwkJCQkJq3N1Yi5uYW1luy5jcmVhdGVTdWJBY3RvcnMoq3N1Yi5tdWx0aXBsaWNpdHm7KTsKIAkJCQmrRU5ESUa7CiAJCQmrRU5ERk9SuwogCisJCQmraW5pdEhlbHBlci5nZW5FeHRyYUluaXRpYWxpemVycyhhYy5hdHRyaWJ1dGVzKbsKKwkJCathYy51c2VyU3RydWN0b3JCb2R5KHRydWUpuworCQl9CisJCQorCQl2b2lkIKthYy5uYW1luzo6aW5pdGlhbGl6ZSgpIHsKKwkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQlNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksICJpbml0aWFsaXplKCkiKTsKKwkJCQmrRk9SIHN1YiA6IGFjLmFjdG9yUmVmc7sKKwkJCQkJq0lGIHN1Yi5tdWx0aXBsaWNpdHkgPiAxuworCQkJCQkJZm9yIChpbnQgaT0wOyBpPKtzdWIubXVsdGlwbGljaXR5uzsgKytpKSB7CisJCQkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsIKtzdWIubmFtZbsuZ2V0U3ViQWN0b3IoaSktPmdldE5hbWUoKSk7CisJCQkJCQl9CisJCQkJCatFTFNFuworCQkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsICKrc3ViLm5hbWW7Iik7CisJCQkJCatFTkRJRrsKKwkJCQmrRU5ERk9SuworCQkJq0VORElGuworCQkJCisJCQlBY3RvckNsYXNzQmFzZTo6aW5pdGlhbGl6ZSgpOworCQkJCisJCQmrRk9SIHN1YiA6IGFjLmFjdG9yUmVmc7sKKwkJCQmrc3ViLm5hbWW7LmluaXRpYWxpemUoKTsKKwkJCatFTkRGT1K7CisJCQkKIAkJCS8vIHdpcmluZwogCQkJq0ZPUiB3aXJlOiB3aXJlZC53aXJlc7sKIAkJCQmraWYgKHdpcmUuZGF0YURyaXZlbikgIkRhdGFQb3J0QmFzZSIgZWxzZSAiSW50ZXJmYWNlSXRlbUJhc2Uiuzo6Y29ubmVjdCh0aGlzLCAiq3dpcmUucGF0aDEuam9pbignLycpuyIsICKrd2lyZS5wYXRoMi5qb2luKCcvJym7Iik7CkBAIC0yNTAsMTIgKzI5NSw0MyBAQAogCQkJCS8vIGFjdGl2YXRlIHBvbGxpbmcgZm9yIGRhdGEtZHJpdmVuIGNvbW11bmljYXRpb24KIAkJCQlSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5nZXRNc2dTdmMoZ2V0VGhyZWFkKCkpLT5hZGRQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKCp0aGlzKTsKIAkJCatFTkRJRrsKLQotCQkJq2luaXRIZWxwZXIuZ2VuRXh0cmFJbml0aWFsaXplcnMoYWMuYXR0cmlidXRlcym7Ci0JCQmrYWMudXNlclN0cnVjdG9yQm9keSh0cnVlKbsKIAkJfQorCQkKKwkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuworCQkJdm9pZCCrYWMubmFtZbs6OnNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpIHsKKwkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZShtX1JUU3lzdGVtUG9ydCk7CisJCQkJq0lGIGFjLmFjdG9yUmVmcy5zaXplID4gMLsKKwkJCQkJaWYocmVjdXJzaXZlKSB7CisJCQkJCQmrRk9SIHN1YiA6IGFjLmFjdG9yUmVmc7sKKwkJCQkJCQmrc3ViLm5hbWW7LnNldFByb2Jlc0FjdGl2ZShyZWN1cnNpdmUsIGFjdGl2ZSk7CisJCQkJCQmrRU5ERk9SuworCQkJCQl9CisJCQkJq0VORElGuworCQkJCatGT1IgZXAgOiBhYy5lbmRQb3J0c7sKKwkJCQkJq0lGICFlcC5kYXRhRHJpdmVuuworCQkJCQkJq0lGIGVwLnJlcGxpY2F0ZWS7CisJCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IKtlcC5uYW1luy5nZXROSW50ZXJmYWNlSXRlbXMoKTsgaSsrKQorCQkJCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSgqKKtlcC5uYW1luy5nZXRJbnRlcmZhY2VJdGVtKGkpKSk7CisJCQkJCQmrRUxTRbsKKwkJCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSirZXAubmFtZbspOworCQkJCQkJq0VORElGuworCQkJCQmrRU5ESUa7CisJCQkJq0VOREZPUrsKKwkJCQmrRk9SIHNhcCA6IGFjLnNlcnZpY2VBY2Nlc3NQb2ludHO7CisJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKKtzYXAubmFtZbspOworCQkJCatFTkRGT1K7CisJCQkJq0ZPUiBzcHAgOiBhYy5zZXJ2aWNlUHJvdmlzaW9uUG9pbnRzuworCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgq3NwcC5uYW1luy5nZXROSW50ZXJmYWNlSXRlbXMoKTsgaSsrKQorCQkJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCooq3NwcC5uYW1luy5nZXRJbnRlcmZhY2VJdGVtKGkpKSk7CisJCQkJq0VOREZPUrsKKwkJCX0KKwkJq0VORElGuwogCiAJCXZvaWQgq2FjLm5hbWW7OjpkZXN0cm95KCl7CisJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CisJCQkJTVNDRnVuY3Rpb25PYmplY3QgbXNjRnVuY3Rpb25PYmplY3QoZ2V0SW5zdGFuY2VQYXRoTmFtZSgpLCAiZGVzdHJveSgpIik7CisJCQmrRU5ESUa7CisJCQkKIAkJCathYy51c2VyU3RydWN0b3JCb2R5KGZhbHNlKbsKIAkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKIAkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckRlc3Ryb3koKnRoaXMpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4ueHRlbmQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi54dGVuZAppbmRleCBlYjA3MWFkLi4yNjM1MjUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi54dGVuZAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi54dGVuZApAQCAtMTYsMTQgKzE2LDEzIEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb24KIGltcG9ydCBqYXZhLnV0aWwuTWFwCitpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuY29tbW9uLmNvbnZlcnRlci5UaW1lQ29udmVydGVyCiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZXRtYXAudXRpbC5FVE1hcFV0aWwKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5ldHBoeXMuZVRQaHlzLkV4ZWNNb2RlCiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZXRwaHlzLmVUUGh5cy5QaHlzaWNhbFRocmVhZAotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmJ1aWxkZXIuR2VubW9kZWxDb25zdGFudHMKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uUm9vdAogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5TdWJTeXN0ZW1JbnN0YW5jZQogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5XaXJlZFN1YlN5c3RlbUNsYXNzCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZnNtLmZzbWdlbi5JRGlhZ25vc3RpY2lhbgogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU3ViU3lzdGVtQ2xhc3MKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC5NYWluCiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5mc20uYmFzZS5GaWxlU3lzdGVtSGVscGVycwpAQCAtMzIsNyArMzEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZ2VuZXJpYy5Sb29tRXh0ZW5zaW9ucwogCiBpbXBvcnQgc3RhdGljIGV4dGVuc2lvbiBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmZzbS5iYXNlLkluZGV4ZWQuKgotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmNvbW1vbi5jb252ZXJ0ZXIuVGltZUNvbnZlcnRlcgogCiBAU2luZ2xldG9uCiBjbGFzcyBOb2RlR2VuIHsKQEAgLTQxLDkgKzM5LDkgQEAKIAlASW5qZWN0IGV4dGVuc2lvbiBSb29tRXh0ZW5zaW9ucwogCUBJbmplY3QgZXh0ZW5zaW9uIFByb2NlZHVyZUhlbHBlcnMKIAlASW5qZWN0IGV4dGVuc2lvbiBGaWxlU3lzdGVtSGVscGVycwotCisJCiAJQEluamVjdCBJR2VuZXJhdG9yRmlsZUlvIGZpbGVJTwotCUBJbmplY3QgSURpYWdub3N0aWNpYW4gZGlhZ25vc3RpY2lhbgorCUBJbmplY3QgSW5pdGlhbGl6YXRpb24gaW5pdEhlbHBlcgogCiAJZGVmIGRvR2VuZXJhdGUoUm9vdCByb290KSB7CiAJCXZhbCBNYXA8U3ViU3lzdGVtQ2xhc3MsIFdpcmVkU3ViU3lzdGVtQ2xhc3M+IHNzY2Myd2lyZWQgPSBuZXdIYXNoTWFwCkBAIC04Niw2ICs4NCw5IEBACiAJCatnZW5lcmF0ZUluY2x1ZGVHdWFyZEJlZ2luKGNjLCAnJym7CiAKIAkJI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvU3ViU3lzdGVtQ2xhc3NCYXNlLmgiCisJCatGT1IgYWkgOiBjb21wLmFjdG9ySW5zdGFuY2VzuworCQkJI2luY2x1ZGUgIqthaS5hY3RvckNsYXNzLmFjdG9ySW5jbHVkZVBhdGi7IgorCQmrRU5ERk9SuwogCiCrq6sJCatGT1IgbW9kZWwgOiByb290LmdldFJlZmVyZW5jZWRNb2RlbHMoY2Mpuwogq6urCQmrq6sJCQkjaW5jbHVkZSAiq21vZGVsLm5hbWW7LmgiCkBAIC0xMDQsMTEgKzEwNSwyNSBAQAogCQkJCQlzdGF0aWMgY29uc3QgaW50IKt0aHJlYWQudmFsdWUudGhyZWFkSWS7OwogCQkJCatFTkRGT1K7CiAKKwkJCQkvLyBzdWIgYWN0b3JzCisJCQkJq0ZPUiBzdWIgOiBjYy5hY3RvclJlZnO7CisJCQkJCatJRiBzdWIubXVsdGlwbGljaXR5PjG7CisJCQkJCQlSZXBsaWNhdGVkq3N1Yi50eXBlLmltcGxlbWVudGF0aW9uQ2xhc3NOYW1luyCrc3ViLm5hbWW7OworCQkJCQmrRUxTRbsKKwkJCQkJCatzdWIudHlwZS5pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZbsgq3N1Yi5uYW1luzsKKwkJCQkJq0VORElGuworCQkJCatFTkRGT1K7CisKIAkJCQmrY2xzbmFtZbsoSVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKwkJCQl+q2Nsc25hbWW7KCk7CiAKIAkJCQl2aXJ0dWFsIHZvaWQgcmVjZWl2ZUV2ZW50KGV0UnVudGltZTo6SW50ZXJmYWNlSXRlbUJhc2UqIGlmaXRlbSwgaW50IGV2dCwgdm9pZCogZGF0YSk7CiAJCQkJdmlydHVhbCB2b2lkIGluc3RhbnRpYXRlTWVzc2FnZVNlcnZpY2VzKCk7Ci0JCQkJdmlydHVhbCB2b2lkIGluc3RhbnRpYXRlQWN0b3JzKCk7CisJCQkJdmlydHVhbCB2b2lkIG1hcFRocmVhZHModm9pZCk7CisJCQkJdmlydHVhbCB2b2lkIGluaXRpYWxpemUodm9pZCk7CisJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuworCQkJCQl2aXJ0dWFsIHZvaWQgc2V0UHJvYmVzQWN0aXZlKGJvb2wgcmVjdXJzaXZlLCBib29sIGFjdGl2ZSk7CisJCQkJq0VORElGuwogCiAJCQkJdmlydHVhbCB2b2lkIGluaXQoKTsKIApAQCAtMTM0LDYgKzE0OSwxOCBAQAogCQkiVEhSRUFEXyIrdGhyZWFkLm5hbWUudG9VcHBlckNhc2UKIAl9CiAKKwlkZWYgcHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QoU3ViU3lzdGVtQ2xhc3MgY2MpIHsKKwkJdmFsIGV4dGVuc2lvbiBpbml0SGVscGVyID0gaW5pdEhlbHBlcgorCQl2YXIgaW5pdExpc3QgPSA8Q2hhclNlcXVlbmNlPm5ld0FycmF5TGlzdAorCisJCS8vIHN1cGVyIGNsYXNzCisJCWluaXRMaXN0ICs9ICcnJ1N1YlN5c3RlbUNsYXNzQmFzZShwYXJlbnQsIG5hbWUpJycnCisJICAgIC8vIG93biBzdWIgYWN0b3JzCisJICAgIGluaXRMaXN0ICs9IGNjLmFjdG9yUmVmcy5tYXBbJycnq25hbWW7KHRoaXMsICKrbmFtZbsiKScnJ10KKworCQlpbml0TGlzdC5nZW5lcmF0ZUN0b3JJbml0aWFsaXplckxpc3QKKwl9CisKIAlkZWYgZ2VuZXJhdGVTb3VyY2VGaWxlKFJvb3Qgcm9vdCwgU3ViU3lzdGVtSW5zdGFuY2UgY29tcCwgV2lyZWRTdWJTeXN0ZW1DbGFzcyB3aXJlZCwgQ29sbGVjdGlvbjxQaHlzaWNhbFRocmVhZD4gdXNlZFRocmVhZHMpIHsKIAkJdmFsIGNjID0gY29tcC5zdWJTeXN0ZW1DbGFzcwogCQl2YWwgbW9kZWxzID0gcm9vdC5nZXRSZWZlcmVuY2VkTW9kZWxzKGNjKQpAQCAtMTUyLDE2ICsxNzksMTMgQEAKIAkJI2luY2x1ZGUgIqtnZXRDcHBIZWFkZXJGaWxlTmFtZShuciwgY29tcCm7IgogCiAJCSNpbmNsdWRlICJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaCIKKwkJI2luY2x1ZGUgImNvbW1vbi9kZWJ1Z2dpbmcvTVNDRnVuY3Rpb25PYmplY3QuaCIKIAkJI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlci5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9SVFNlcnZpY2VzLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmgiCiAKLQkJq0ZPUiBhaSA6IGNvbXAuYWN0b3JJbnN0YW5jZXO7Ci0JCQkjaW5jbHVkZSAiq2FpLmFjdG9yQ2xhc3MuYWN0b3JJbmNsdWRlUGF0aLsiCi0JCatFTkRGT1K7Ci0KIAkJdXNpbmcgbmFtZXNwYWNlIGV0UnVudGltZTsKIAogCQmrY2MuZ2VuZXJhdGVOYW1lc3BhY2VCZWdpbrsKQEAgLTE3MCw5ICsxOTQsMjMgQEAKIAkJCWNvbnN0IGludCCrY2xzbmFtZbs6Oqt0aHJlYWQudmFsdWUudGhyZWFkSWS7ID0gq3RocmVhZC5pbmRleDC7OwogCQmrRU5ERk9SuwogCi0JCatjbHNuYW1luzo6q2Nsc25hbWW7KElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgotCQkJCVN1YlN5c3RlbUNsYXNzQmFzZShwYXJlbnQsIG5hbWUpCisJCatjbHNuYW1luzo6q2Nsc25hbWW7KElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKwkJCQmrY2MuZ2VuZXJhdGVDb25zdHJ1Y3RvckluaXRhbGl6ZXJMaXN0uwogCQl7CisJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CisJCQkJTVNDRnVuY3Rpb25PYmplY3QgbXNjRnVuY3Rpb25PYmplY3QoZ2V0SW5zdGFuY2VQYXRoTmFtZSgpLCAiQ29uc3RydWN0b3IiKTsKKwkJCatFTkRJRrsKKwkJCatGT1Igc3ViIDogY2MuYWN0b3JSZWZzuworCQkJCatJRiBzdWIubXVsdGlwbGljaXR5PjG7CisJCQkJCatzdWIubmFtZbsuY3JlYXRlU3ViQWN0b3JzKKtzdWIubXVsdGlwbGljaXR5uyk7CisJCQkJq0VORElGuworCQkJq0VOREZPUrsKKwkJfQorCQkKKwkJq2Nsc25hbWW7Ojp+q2Nsc25hbWW7KCkgeworCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuworCQkJCU1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgIkRlc3RydWN0b3IiKTsKKwkJCatFTkRJRrsKIAkJfQogCiAJCXZvaWQgq2Nsc25hbWW7OjpyZWNlaXZlRXZlbnQoSW50ZXJmYWNlSXRlbUJhc2UqIGlmaXRlbSwgaW50IGV2dCwgdm9pZCogZGF0YSl7CkBAIC0xODAsNiArMjE4LDEwIEBACiAKIAkJdm9pZCCrY2xzbmFtZbs6Omluc3RhbnRpYXRlTWVzc2FnZVNlcnZpY2VzKCl7CiAKKwkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQlNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksICJpbnN0YW50aWF0ZU1lc3NhZ2VTZXJ2aWNlcygpIik7CisJCQmrRU5ESUa7CisKIAkJCUlNZXNzYWdlU2VydmljZSogbXNnU2VydmljZTsKIAkJCatGT1IgdGhyZWFkOiB0aHJlYWRzuwogCQkJCXsKQEAgLTE5Nyw4ICsyMzksNyBAQAogCQkJq0VOREZPUrsKIAkJfQogCi0JCXZvaWQgq2Nsc25hbWW7OjppbnN0YW50aWF0ZUFjdG9ycygpewotCisJCXZvaWQgq2Nsc25hbWW7OjptYXBUaHJlYWRzKCkgewogCQkJLy8gdGhyZWFkIG1hcHBpbmdzCiAJCQmrRk9SIGFpIDogY29tcC5hbGxDb250YWluZWRJbnN0YW5jZXO7CiAJCQkJq3ZhbCBtYXBwZWQgPSBFVE1hcFV0aWw6OmdldE1hcHBlZFRocmVhZChhaSm7CkBAIC0yMDYsMzQgKzI0Nyw0NyBAQAogCQkJCQlhZGRQYXRoVG9UaHJlYWQoIqthaS5wYXRouyIsIKttYXBwZWQudGhyZWFkLnRocmVhZElkuyk7CiAJCQkJq0VORElGuwogCQkJq0VOREZPUrsKKwkJfQogCi0JCQkvLyBzdWIgYWN0b3JzCi0JCQmrRk9SIHN1YiA6IGNjLmFjdG9yUmVmc7sKLQkJCQmrSUYgc3ViLm11bHRpcGxpY2l0eT4xuwotCQkJCQlmb3IgKGludCBpPTA7IGk8q3N1Yi5tdWx0aXBsaWNpdHm7OyArK2kpIHsKLQkJCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKLQkJCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgIqtzdWIubmFtZburR2VubW9kZWxDb25zdGFudHM6OklOREVYX1NFULsiK2kpOwotCQkJCQkJq0VORElGuwotCQkJCQkJbmV3IKtzdWIudHlwZS5pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZbsodGhpcywgIqtzdWIubmFtZburR2VubW9kZWxDb25zdGFudHM6OklOREVYX1NFULsiK2kpOwotCQkJCQl9Ci0JCQkJq0VMU0W7Ci0JCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJdm9pZCCrY2xzbmFtZbs6OmluaXRpYWxpemUoKSB7CisJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CisJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5nZXRTeW5jTG9nZ2VyKCkuYWRkVmlzaWJsZUNvbW1lbnQoInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uIik7CisJCQkJTVNDRnVuY3Rpb25PYmplY3QgbXNjRnVuY3Rpb25PYmplY3QoZ2V0SW5zdGFuY2VQYXRoTmFtZSgpLCAiaW5pdGlhbGl6ZSgpIik7CisJCQkJq0ZPUiBzdWIgOiBjYy5hY3RvclJlZnO7CisJCQkJCatJRiBzdWIubXVsdGlwbGljaXR5PjG7CisJCQkJCQlmb3IgKGludCBpPTA7IGk8q3N1Yi5tdWx0aXBsaWNpdHm7OyArK2kpIHsKKwkJCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgq3N1Yi5uYW1luy5nZXRTdWJBY3RvcihpKS0+Z2V0TmFtZSgpKTsKKwkJCQkJCX0KKwkJCQkJq0VMU0W7CiAJCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgIqtzdWIubmFtZbsiKTsKIAkJCQkJq0VORElGuwotCQkJCQluZXcgq3N1Yi50eXBlLmltcGxlbWVudGF0aW9uQ2xhc3NOYW1luyh0aGlzLCAiq3N1Yi5uYW1luyIpOwotCQkJCatFTkRJRrsKLQkJCatFTkRGT1K7Ci0KKwkJCQmrRU5ERk9SuwkJCQorCQkJq0VORElGuworCQkJCiAJCQkvLyB3aXJpbmcKIAkJCatGT1Igd2lyZTogd2lyZWQud2lyZXO7CiAJCQkJq2lmICh3aXJlLmRhdGFEcml2ZW4pICJEYXRhUG9ydEJhc2UiIGVsc2UgIkludGVyZmFjZUl0ZW1CYXNlIrs6OmNvbm5lY3QodGhpcywgIqt3aXJlLnBhdGgxLmpvaW4oJy8nKbsiLCAiq3dpcmUucGF0aDIuam9pbignLycpuyIpOwogCQkJq0VOREZPUrsKKwkJCQorCQkJLy8gY2FsbCBpbml0aWFsaXplIG9mIHN1YiBhY3RvcnMKKwkJCatGT1Igc3ViIDogY2MuYWN0b3JSZWZzuworCQkJCatzdWIubmFtZbsuaW5pdGlhbGl6ZSgpOworCQkJq0VOREZPUrsKIAkJfQorCQkKKwkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuworCQkJdm9pZCCrY2xzbmFtZbs6OnNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpIHsKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbV9SVFN5c3RlbVBvcnQuZ2V0TkludGVyZmFjZUl0ZW1zKCk7IGkrKykKKwkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UoKihtX1JUU3lzdGVtUG9ydC5nZXRJbnRlcmZhY2VJdGVtKGkpKSk7CisJCQkJaWYocmVjdXJzaXZlKSB7CisJCQkJCatGT1Igc3ViIDogY2MuYWN0b3JSZWZzuworCQkJCQkJq3N1Yi5uYW1luy5zZXRQcm9iZXNBY3RpdmUocmVjdXJzaXZlLCBhY3RpdmUpOworCQkJCQmrRU5ERk9SuworCQkJCX0KKwkJCX0KKwkJq0VORElGuwogCiAJCXZvaWQgq2Nsc25hbWW7Ojppbml0KCl7Ci0JCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267Ci0JCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudCgiYmVnaW4gc3ViIHN5c3RlbSBpbml0aWFsaXphdGlvbiIpOwotCQkJq0VORElGuwogCQkJU3ViU3lzdGVtQ2xhc3NCYXNlOjppbml0KCk7CiAJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CiAJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudCgiZG9uZSBzdWIgc3lzdGVtIGluaXRpYWxpemF0aW9uIik7CkBAIC0yNDIsOSArMjk2LDE1IEBACiAJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKIAogCQkJdm9pZCCrY2xzbmFtZbs6OmRlc3Ryb3koKSB7Ci0JCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudCgiYmVnaW4gc3ViIHN5c3RlbSBkZXN0cnVjdGlvbiIpOworCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5nZXRTeW5jTG9nZ2VyKCkuYWRkVmlzaWJsZUNvbW1lbnQoInN0YXJ0aW5nIGRlc3RydWN0aW9uIik7CisJCQkJCU1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgImRlc3Ryb3koKSIpOworCQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFZpc2libGVDb21tZW50KCJiZWdpbiBzdWIgc3lzdGVtIGRlc3RydWN0aW9uIik7CisJCQkJq0VORElGuwogCQkJCVN1YlN5c3RlbUNsYXNzQmFzZTo6ZGVzdHJveSgpOwotCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkVmlzaWJsZUNvbW1lbnQoImRvbmUgc3ViIHN5c3RlbSBkZXN0cnVjdGlvbiIpOworCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudCgiZG9uZSBzdWIgc3lzdGVtIGRlc3RydWN0aW9uIik7CisJCQkJq0VORElGuwogCQkJfQogCQmrRU5ESUa7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLnh0ZW5kIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4ueHRlbmQKaW5kZXggY2E0OGQ1MS4uYjU4OGUyNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4ueHRlbmQKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4ueHRlbmQKQEAgLTYyLDcgKzYyLDYgQEAKIAkJCQljYXNlIENvbW11bmljYXRpb25UeXBlOjpTWU5DSFJPTk9VUzoKIAkJCQkJbG9nZ2VyLmxvZ0Vycm9yKCJzeW5jaHJvbm91cyBwcm90b2NvbHMgbm90IHN1cHBvcnRlZCB5ZXQiLCBwYykKIAkJCX0KLQogCQl9CiAJfQogCkBAIC0yMDAsNiArMTk5LDcgQEAKIAkJI2luY2x1ZGUgIqtwYy5nZXRDcHBIZWFkZXJGaWxlTmFtZbsiCiAKIAkJI2luY2x1ZGUgImNvbW1vbi9kZWJ1Z2dpbmcvRGVidWdnaW5nU2VydmljZS5oIgorCQkjaW5jbHVkZSAiY29tbW9uL2RlYnVnZ2luZy9NU0NGdW5jdGlvbk9iamVjdC5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlci5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9BZGRyZXNzLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2UuaCIKQEAgLTI0NywxOCArMjQ3LDEyIEBACiAJq3BvcnRDbGFzc05hbWW7OjqrcG9ydENsYXNzTmFtZbsoSUludGVyZmFjZUl0ZW1Pd25lciogYWN0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbG9jYWxJZCkKIAkJq3BjbGFzcy5nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QoJzAnKbsKIAl7Ci0JCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKLQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCp0aGlzKTsKLQkJq0VORElGuwogCX0KIAogCatwb3J0Q2xhc3NOYW1luzo6q3BvcnRDbGFzc05hbWW7KElJbnRlcmZhY2VJdGVtT3duZXIqIGFjdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IGxvY2FsSWQsIGludCBpZHgpCiAJCatwY2xhc3MuZ2VuZXJhdGVDb25zdHJ1Y3RvckluaXRhbGl6ZXJMaXN0KCdpZHgnKbsKIAl7CiAJCatJRiBwY2xhc3MgIT0gbnVsbLuraW5pdEhlbHBlci5nZW5FeHRyYUluaXRpYWxpemVycyhwY2xhc3MuYXR0cmlidXRlcym7q0VORElGuwotCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267Ci0JCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSgqdGhpcyk7Ci0JCatFTkRJRrsKIAl9CiAJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuwogCkBAIC0zNzIsOCArMzY2LDEwIEBACiAJCQkJCatGT1IgY29tbWFuZCA6IGhkbHIuZGV0YWlsQ29kZS5saW5lc7sJq2NvbW1hbmS7CiAJCQkJCatFTkRGT1K7CiAJCQkJq0VMU0W7Ci0JCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFzeW5jT3V0KGdldEFkZHJlc3MoKSwgZ2V0UGVlckFkZHJlc3MoKSwKLQkJCQkJCatwb3J0Q2xhc3NOYW1luzo6Z2V0TWVzc2FnZVN0cmluZyircG9ydENsYXNzTmFtZbs6OqtkaXK7X6ttLm5hbWW7KSk7CisJCQkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKKwkJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFzeW5jT3V0KGdldEFkZHJlc3MoKSwgZ2V0UGVlckFkZHJlc3MoKSwKKwkJCQkJCQmrcG9ydENsYXNzTmFtZbs6OmdldE1lc3NhZ2VTdHJpbmcoq3BvcnRDbGFzc05hbWW7OjqrZGlyu1+rbS5uYW1luykpOworCQkJCQmrRU5ESUa7CiAJCQkJCWlmIChnZXRQZWVyQWRkcmVzcygpLmlzVmFsaWQoKSl7CiAJCQkJCQlnZXRQZWVyTXNnUmVjZWl2ZXIoKS0+cmVjZWl2ZSirbWVzc2FnZbspOwogCQkJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vQWN0b3JDbGFzc0dlbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL0FjdG9yQ2xhc3NHZW4uamF2YQppbmRleCAwMzgxMWE4Li40MmM0YTA5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vQWN0b3JDbGFzc0dlbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9BY3RvckNsYXNzR2VuLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5mc20uZlNNLkNvbXBvbmVudENvbW11bmljYXRpb25UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmZzbS5mU00uRGV0YWlsQ29kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5mc20uZlNNLlN0YXRlR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuYnVpbGRlci5HZW5tb2RlbENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uRXhwYW5kZWRBY3RvckNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5Sb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5XaXJlOwpAQCAtMTk0LDYgKzE5Myw4IEBACiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL21vZGVsYmFzZS9Qb3J0QmFzZS5oXCIiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZS5oXCIiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmhcIiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCIjaW5jbHVkZSBcImNvbW1vbi9tb2RlbGJhc2UvU3ViU3lzdGVtQ2xhc3NCYXNlLmhcIiIpOwpAQCAtMjUwLDYgKzI1MSwxNyBAQAogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnMgPSBhYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIGFyIDogX2FjdG9yUmVmcykgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCIiKTsKKyAgICAgICAgICBBY3RvckNsYXNzIF90eXBlID0gYXIuZ2V0VHlwZSgpOworICAgICAgICAgIFN0cmluZyBfYWN0b3JJbmNsdWRlUGF0aCA9IHRoaXMuX2NwcEV4dGVuc2lvbnMuZ2V0QWN0b3JJbmNsdWRlUGF0aChfdHlwZSk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9hY3RvckluY2x1ZGVQYXRoLCAiIik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIERldGFpbENvZGUgX3VzZXJDb2RlMSA9IGFjLmdldFVzZXJDb2RlMSgpOwogICAgICAgQ2hhclNlcXVlbmNlIF91c2VyQ29kZSA9IHRoaXMuX3Byb2NlZHVyZUhlbHBlcnMudXNlckNvZGUoX3VzZXJDb2RlMSk7CkBAIC0yOTIsNiArMzA0LDQxIEBACiAgICAgICB9CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3ViIGFjdG9ycyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgeworICAgICAgICBFTGlzdDxBY3RvclJlZj4gX2FjdG9yUmVmc18xID0gYWMuZ2V0QWN0b3JSZWZzKCk7CisgICAgICAgIGZvcihmaW5hbCBBY3RvclJlZiBzdWIgOiBfYWN0b3JSZWZzXzEpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eSA9IHN1Yi5nZXRNdWx0aXBsaWNpdHkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2dyZWF0ZXJUaGFuID0gKF9tdWx0aXBsaWNpdHkgPiAxKTsKKyAgICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiUmVwbGljYXRlZCIpOworICAgICAgICAgICAgICBBY3RvckNsYXNzIF90eXBlXzEgPSBzdWIuZ2V0VHlwZSgpOworICAgICAgICAgICAgICBTdHJpbmcgX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShfdHlwZV8xKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gc3ViLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzYsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgICAgIEFjdG9yQ2xhc3MgX3R5cGVfMiA9IHN1Yi5nZXRUeXBlKCk7CisgICAgICAgICAgICAgIFN0cmluZyBfaW1wbGVtZW50YXRpb25DbGFzc05hbWVfMSA9IHRoaXMuX2NwcEV4dGVuc2lvbnMuZ2V0SW1wbGVtZW50YXRpb25DbGFzc05hbWUoX3R5cGVfMik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfaW1wbGVtZW50YXRpb25DbGFzc05hbWVfMSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV83ID0gc3ViLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzcsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNhcHMiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIHsKQEAgLTMwMSw4ICszNDgsOCBAQAogICAgICAgICAgIFN0cmluZyBfcG9ydENsYXNzTmFtZV8xID0gdGhpcy5fcm9vbUV4dGVuc2lvbnMuZ2V0UG9ydENsYXNzTmFtZShzYXApOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfcG9ydENsYXNzTmFtZV8xLCAiXHRcdCIpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiICIpOwotICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gc2FwLmdldE5hbWUoKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNiwgIlx0XHQiKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfOCA9IHNhcC5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzgsICJcdFx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgICAgfQpAQCAtMzE5LDggKzM2Niw4IEBACiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9wb3J0Q2xhc3NOYW1lXzIsICJcdFx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgIik7CiAgICAgICAgICAgU1BQIF9zcHAgPSBzdmMuZ2V0U3BwKCk7Ci0gICAgICAgICAgU3RyaW5nIF9uYW1lXzcgPSBfc3BwLmdldE5hbWUoKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNywgIlx0XHQiKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfOSA9IF9zcHAuZ2V0TmFtZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV85LCAiXHRcdCIpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOwogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgIH0KQEAgLTM0Miw4ICszODksOCBAQAogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CiAgICAgICBFTGlzdDxTdGFuZGFyZE9wZXJhdGlvbj4gX29wZXJhdGlvbnMgPSBhYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICBTdHJpbmcgX25hbWVfOCA9IGFjLmdldE5hbWUoKTsKLSAgICAgIENoYXJTZXF1ZW5jZSBfb3BlcmF0aW9uc0RlY2xhcmF0aW9uID0gdGhpcy5fcHJvY2VkdXJlSGVscGVycy5vcGVyYXRpb25zRGVjbGFyYXRpb24oX29wZXJhdGlvbnMsIF9uYW1lXzgpOworICAgICAgU3RyaW5nIF9uYW1lXzEwID0gYWMuZ2V0TmFtZSgpOworICAgICAgQ2hhclNlcXVlbmNlIF9vcGVyYXRpb25zRGVjbGFyYXRpb24gPSB0aGlzLl9wcm9jZWR1cmVIZWxwZXJzLm9wZXJhdGlvbnNEZWNsYXJhdGlvbihfb3BlcmF0aW9ucywgX25hbWVfMTApOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKF9vcGVyYXRpb25zRGVjbGFyYXRpb24sICJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwpAQCAtMzU0LDEwICs0MDEsMjIgQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RydWN0aW9uIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKLSAgICAgIFN0cmluZyBfbmFtZV85ID0gYWMuZ2V0TmFtZSgpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzksICJcdFx0Iik7CisgICAgICBTdHJpbmcgX25hbWVfMTEgPSBhYy5nZXROYW1lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMTEsICJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIihldFJ1bnRpbWU6OklSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIHsKKyAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzID0gTWFpbi5nZXRTZXR0aW5ncygpOworICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uID0gX3NldHRpbmdzLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2b2lkIHNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBvcnQgZ2V0dGVycyIpOwpAQCAtNDc5LDYgKzUzOCwzOCBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9OyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJjbGFzcyBSZXBsaWNhdGVkIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoY2xzbmFtZSwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgOiBwdWJsaWMgUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlIHsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInB1YmxpYzoiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiUmVwbGljYXRlZCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKGNsc25hbWUsICJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIoSVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA6Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZShwYXJlbnQsIG5hbWUpIHt9Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInByb3RlY3RlZDoiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiQWN0b3JDbGFzc0Jhc2UqIGNyZWF0ZUFjdG9yKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBuZXcgIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoY2xzbmFtZSwgIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiKHBhcmVudCwgbmFtZSk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn07Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBTdHJpbmcgX2dlbmVyYXRlTmFtZXNwYWNlRW5kID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZW5lcmF0ZU5hbWVzcGFjZUVuZChhYyk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoX2dlbmVyYXRlTmFtZXNwYWNlRW5kLCAiIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwpAQCAtNTMwLDggKzYyMSwyMyBAQAogICAgICAgfTsKICAgICAgIExpc3Q8U3RyaW5nPiBfbWFwID0gTGlzdEV4dGVuc2lvbnMuPFBvcnQsIFN0cmluZz5tYXAoX2VuZFBvcnRzLCBfZnVuY3Rpb24pOwogICAgICAgSXRlcmFibGVzLjxDaGFyU2VxdWVuY2U+YWRkQWxsKGluaXRMaXN0LCBfbWFwKTsKKyAgICAgIEVMaXN0PEFjdG9yUmVmPiBfYWN0b3JSZWZzID0gYWMuZ2V0QWN0b3JSZWZzKCk7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8QWN0b3JSZWYsIFN0cmluZz4gX2Z1bmN0aW9uXzEgPSBuZXcgRnVuY3Rpb24xPEFjdG9yUmVmLCBTdHJpbmc+KCkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KGZpbmFsIEFjdG9yUmVmIGl0KSB7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgU3RyaW5nIF9uYW1lID0gaXQuZ2V0TmFtZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKHRoaXMsIFwiIik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBpdC5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEsICIiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiKSIpOworICAgICAgICAgIHJldHVybiBfYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgICB9OworICAgICAgTGlzdDxTdHJpbmc+IF9tYXBfMSA9IExpc3RFeHRlbnNpb25zLjxBY3RvclJlZiwgU3RyaW5nPm1hcChfYWN0b3JSZWZzLCBfZnVuY3Rpb25fMSk7CisgICAgICBJdGVyYWJsZXMuPENoYXJTZXF1ZW5jZT5hZGRBbGwoaW5pdExpc3QsIF9tYXBfMSk7CiAgICAgICBFTGlzdDxTQVA+IF9zZXJ2aWNlQWNjZXNzUG9pbnRzID0gYWMuZ2V0U2VydmljZUFjY2Vzc1BvaW50cygpOwotICAgICAgZmluYWwgRnVuY3Rpb24xPFNBUCwgU3RyaW5nPiBfZnVuY3Rpb25fMSA9IG5ldyBGdW5jdGlvbjE8U0FQLCBTdHJpbmc+KCkgeworICAgICAgZmluYWwgRnVuY3Rpb24xPFNBUCwgU3RyaW5nPiBfZnVuY3Rpb25fMiA9IG5ldyBGdW5jdGlvbjE8U0FQLCBTdHJpbmc+KCkgewogICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KGZpbmFsIFNBUCBpdCkgewogICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwogICAgICAgICAgIFN0cmluZyBfbmFtZSA9IGl0LmdldE5hbWUoKTsKQEAgLTU0NiwxMCArNjUyLDEwIEBACiAgICAgICAgICAgcmV0dXJuIF9idWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgIH07Ci0gICAgICBMaXN0PFN0cmluZz4gX21hcF8xID0gTGlzdEV4dGVuc2lvbnMuPFNBUCwgU3RyaW5nPm1hcChfc2VydmljZUFjY2Vzc1BvaW50cywgX2Z1bmN0aW9uXzEpOwotICAgICAgSXRlcmFibGVzLjxDaGFyU2VxdWVuY2U+YWRkQWxsKGluaXRMaXN0LCBfbWFwXzEpOworICAgICAgTGlzdDxTdHJpbmc+IF9tYXBfMiA9IExpc3RFeHRlbnNpb25zLjxTQVAsIFN0cmluZz5tYXAoX3NlcnZpY2VBY2Nlc3NQb2ludHMsIF9mdW5jdGlvbl8yKTsKKyAgICAgIEl0ZXJhYmxlcy48Q2hhclNlcXVlbmNlPmFkZEFsbChpbml0TGlzdCwgX21hcF8yKTsKICAgICAgIEVMaXN0PFNlcnZpY2VJbXBsZW1lbnRhdGlvbj4gX3NlcnZpY2VJbXBsZW1lbnRhdGlvbnMgPSBhYy5nZXRTZXJ2aWNlSW1wbGVtZW50YXRpb25zKCk7Ci0gICAgICBmaW5hbCBGdW5jdGlvbjE8U2VydmljZUltcGxlbWVudGF0aW9uLCBTdHJpbmc+IF9mdW5jdGlvbl8yID0gbmV3IEZ1bmN0aW9uMTxTZXJ2aWNlSW1wbGVtZW50YXRpb24sIFN0cmluZz4oKSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8U2VydmljZUltcGxlbWVudGF0aW9uLCBTdHJpbmc+IF9mdW5jdGlvbl8zID0gbmV3IEZ1bmN0aW9uMTxTZXJ2aWNlSW1wbGVtZW50YXRpb24sIFN0cmluZz4oKSB7CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoZmluYWwgU2VydmljZUltcGxlbWVudGF0aW9uIGl0KSB7CiAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CiAgICAgICAgICAgU1BQIF9zcHAgPSBpdC5nZXRTcHAoKTsKQEAgLTU2NywxMCArNjczLDEwIEBACiAgICAgICAgICAgcmV0dXJuIF9idWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgIH07Ci0gICAgICBMaXN0PFN0cmluZz4gX21hcF8yID0gTGlzdEV4dGVuc2lvbnMuPFNlcnZpY2VJbXBsZW1lbnRhdGlvbiwgU3RyaW5nPm1hcChfc2VydmljZUltcGxlbWVudGF0aW9ucywgX2Z1bmN0aW9uXzIpOwotICAgICAgSXRlcmFibGVzLjxDaGFyU2VxdWVuY2U+YWRkQWxsKGluaXRMaXN0LCBfbWFwXzIpOworICAgICAgTGlzdDxTdHJpbmc+IF9tYXBfMyA9IExpc3RFeHRlbnNpb25zLjxTZXJ2aWNlSW1wbGVtZW50YXRpb24sIFN0cmluZz5tYXAoX3NlcnZpY2VJbXBsZW1lbnRhdGlvbnMsIF9mdW5jdGlvbl8zKTsKKyAgICAgIEl0ZXJhYmxlcy48Q2hhclNlcXVlbmNlPmFkZEFsbChpbml0TGlzdCwgX21hcF8zKTsKICAgICAgIEVMaXN0PEF0dHJpYnV0ZT4gX2F0dHJpYnV0ZXMgPSBhYy5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmaW5hbCBGdW5jdGlvbjE8QXR0cmlidXRlLCBTdHJpbmc+IF9mdW5jdGlvbl8zID0gbmV3IEZ1bmN0aW9uMTxBdHRyaWJ1dGUsIFN0cmluZz4oKSB7CisgICAgICBmaW5hbCBGdW5jdGlvbjE8QXR0cmlidXRlLCBTdHJpbmc+IF9mdW5jdGlvbl80ID0gbmV3IEZ1bmN0aW9uMTxBdHRyaWJ1dGUsIFN0cmluZz4oKSB7CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoZmluYWwgQXR0cmlidXRlIGl0KSB7CiAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CiAgICAgICAgICAgU3RyaW5nIF9uYW1lID0gaXQuZ2V0TmFtZSgpOwpAQCAtNTgyLDggKzY4OCw4IEBACiAgICAgICAgICAgcmV0dXJuIF9idWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgIH07Ci0gICAgICBMaXN0PFN0cmluZz4gX21hcF8zID0gTGlzdEV4dGVuc2lvbnMuPEF0dHJpYnV0ZSwgU3RyaW5nPm1hcChfYXR0cmlidXRlcywgX2Z1bmN0aW9uXzMpOwotICAgICAgSXRlcmFibGVzLjxDaGFyU2VxdWVuY2U+YWRkQWxsKGluaXRMaXN0LCBfbWFwXzMpOworICAgICAgTGlzdDxTdHJpbmc+IF9tYXBfNCA9IExpc3RFeHRlbnNpb25zLjxBdHRyaWJ1dGUsIFN0cmluZz5tYXAoX2F0dHJpYnV0ZXMsIF9mdW5jdGlvbl80KTsKKyAgICAgIEl0ZXJhYmxlcy48Q2hhclNlcXVlbmNlPmFkZEFsbChpbml0TGlzdCwgX21hcF80KTsKICAgICAgIF94YmxvY2tleHByZXNzaW9uID0gaW5pdEhlbHBlci5nZW5lcmF0ZUN0b3JJbml0aWFsaXplckxpc3QoaW5pdExpc3QpOwogICAgIH0KICAgICByZXR1cm4gX3hibG9ja2V4cHJlc3Npb247CkBAIC02NDQsMTggKzc1MCwxMCBAQAogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCIjaW5jbHVkZSBcImNvbW1vbi9tZXNzYWdpbmcvUlRTZXJ2aWNlcy5oXCIiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaFwiIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICB7Ci0gICAgICAgIEVMaXN0PEFjdG9yUmVmPiBfYWN0b3JSZWZzID0gYWMuZ2V0QWN0b3JSZWZzKCk7Ci0gICAgICAgIGZvcihmaW5hbCBBY3RvclJlZiBhciA6IF9hY3RvclJlZnMpIHsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiIik7Ci0gICAgICAgICAgQWN0b3JDbGFzcyBfdHlwZSA9IGFyLmdldFR5cGUoKTsKLSAgICAgICAgICBTdHJpbmcgX2FjdG9ySW5jbHVkZVBhdGggPSB0aGlzLl9jcHBFeHRlbnNpb25zLmdldEFjdG9ySW5jbHVkZVBhdGgoX3R5cGUpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfYWN0b3JJbmNsdWRlUGF0aCwgIiIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL2RlYnVnZ2luZy9NU0NGdW5jdGlvbk9iamVjdC5oXCIiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgidXNpbmcgbmFtZXNwYWNlIGV0UnVudGltZTsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKQEAgLTY3Niw2ICs3NzQsMTcgQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZCgieyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3MgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24gPSBfc2V0dGluZ3MuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24pIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksIFwiQ29uc3RydWN0b3JcIik7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CiAgICAgICAgIGJvb2xlYW4gX2hhc05vbkVtcHR5U3RhdGVNYWNoaW5lID0gdGhpcy5fcm9vbUhlbHBlcnMuaGFzTm9uRW1wdHlTdGF0ZU1hY2hpbmUoYWMpOwogICAgICAgICBpZiAoX2hhc05vbkVtcHR5U3RhdGVNYWNoaW5lKSB7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwpAQCAtNzAxLDY5ICs4MTAsMTkgQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gc3ViIGFjdG9ycyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewotICAgICAgICBFTGlzdDxBY3RvclJlZj4gX2FjdG9yUmVmc18xID0gYWMuZ2V0QWN0b3JSZWZzKCk7Ci0gICAgICAgIGZvcihmaW5hbCBBY3RvclJlZiBzdWIgOiBfYWN0b3JSZWZzXzEpIHsKKyAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnMgPSBhYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1YiA6IF9hY3RvclJlZnMpIHsKICAgICAgICAgICB7CiAgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eSA9IHN1Yi5nZXRNdWx0aXBsaWNpdHkoKTsKICAgICAgICAgICAgIGJvb2xlYW4gX2dyZWF0ZXJUaGFuID0gKF9tdWx0aXBsaWNpdHkgPiAxKTsKICAgICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImZvciAoaW50IGk9MDsgaTwiKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzQgPSBzdWIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNCwgIlx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmNyZWF0ZVN1YkFjdG9ycygiKTsKICAgICAgICAgICAgICAgaW50IF9tdWx0aXBsaWNpdHlfMSA9IHN1Yi5nZXRNdWx0aXBsaWNpdHkoKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tdWx0aXBsaWNpdHlfMSwgIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyArK2kpIHsiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5ncyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uID0gX3NldHRpbmdzLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsIFwiIik7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNCA9IHN1Yi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNCwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChHZW5tb2RlbENvbnN0YW50cy5JTkRFWF9TRVAsICJcdFx0Iik7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiK2kpOyIpOwotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgibmV3ICIpOwotICAgICAgICAgICAgICBBY3RvckNsYXNzIF90eXBlXzEgPSBzdWIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShfdHlwZV8xKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIodGhpcywgXCIiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzUgPSBzdWIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNSwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKEdlbm1vZGVsQ29uc3RhbnRzLklOREVYX1NFUCwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIitpKTsiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5nc18xID0gTWFpbi5nZXRTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSA9IF9zZXR0aW5nc18xLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSkgewotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgXCIiKTsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gc3ViLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV82LCAiXHQiKTsKLSAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIpOyIpOwotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIm5ldyAiKTsKLSAgICAgICAgICAgICAgQWN0b3JDbGFzcyBfdHlwZV8yID0gc3ViLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZV8xID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShfdHlwZV8yKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZV8xLCAiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIodGhpcywgXCIiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzcgPSBzdWIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNywgIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIpOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIik7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtNzcxLDYgKzgzMCw4NSBAQAogICAgICAgfQogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgRUxpc3Q8QXR0cmlidXRlPiBfYXR0cmlidXRlcyA9IGFjLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgIENoYXJTZXF1ZW5jZSBfZ2VuRXh0cmFJbml0aWFsaXplcnMgPSB0aGlzLmluaXRIZWxwZXIuZ2VuRXh0cmFJbml0aWFsaXplcnMoX2F0dHJpYnV0ZXMpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9nZW5FeHRyYUluaXRpYWxpemVycywgIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgU3RyaW5nIF91c2VyU3RydWN0b3JCb2R5ID0gdGhpcy5fcHJvY2VkdXJlSGVscGVycy51c2VyU3RydWN0b3JCb2R5KGFjLCB0cnVlKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfdXNlclN0cnVjdG9yQm9keSwgIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CisgICAgICBTdHJpbmcgX25hbWVfNSA9IGFjLmdldE5hbWUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV81LCAiIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6aW5pdGlhbGl6ZSgpIHsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICB7CisgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5nc18xID0gTWFpbi5nZXRTZXR0aW5ncygpOworICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzEgPSBfc2V0dGluZ3NfMS5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8xKSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiTVNDRnVuY3Rpb25PYmplY3QgbXNjRnVuY3Rpb25PYmplY3QoZ2V0SW5zdGFuY2VQYXRoTmFtZSgpLCBcImluaXRpYWxpemUoKVwiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgeworICAgICAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfMSA9IGFjLmdldEFjdG9yUmVmcygpOworICAgICAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1Yl8xIDogX2FjdG9yUmVmc18xKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eV8yID0gc3ViXzEuZ2V0TXVsdGlwbGljaXR5KCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW5fMSA9IChfbXVsdGlwbGljaXR5XzIgPiAxKTsKKyAgICAgICAgICAgICAgICBpZiAoX2dyZWF0ZXJUaGFuXzEpIHsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZm9yIChpbnQgaT0wOyBpPCIpOworICAgICAgICAgICAgICAgICAgaW50IF9tdWx0aXBsaWNpdHlfMyA9IHN1Yl8xLmdldE11bHRpcGxpY2l0eSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tdWx0aXBsaWNpdHlfMywgIlx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsgKytpKSB7Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgIik7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNiA9IHN1Yl8xLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV82LCAiXHRcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZ2V0U3ViQWN0b3IoaSktPmdldE5hbWUoKSk7Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsIFwiIik7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNyA9IHN1Yl8xLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV83LCAiXHQiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIpOyIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiQWN0b3JDbGFzc0Jhc2U6OmluaXRpYWxpemUoKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIHsKKyAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfMiA9IGFjLmdldEFjdG9yUmVmcygpOworICAgICAgICBmb3IoZmluYWwgQWN0b3JSZWYgc3ViXzIgOiBfYWN0b3JSZWZzXzIpIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzggPSBzdWJfMi5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzgsICJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmluaXRpYWxpemUoKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIHdpcmluZyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewpAQCAtODE4LDMyICs5NTYsMTM5IEBACiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICBFTGlzdDxBdHRyaWJ1dGU+IF9hdHRyaWJ1dGVzID0gYWMuZ2V0QXR0cmlidXRlcygpOwotICAgICAgQ2hhclNlcXVlbmNlIF9nZW5FeHRyYUluaXRpYWxpemVycyA9IHRoaXMuaW5pdEhlbHBlci5nZW5FeHRyYUluaXRpYWxpemVycyhfYXR0cmlidXRlcyk7Ci0gICAgICBfYnVpbGRlci5hcHBlbmQoX2dlbkV4dHJhSW5pdGlhbGl6ZXJzLCAiXHQiKTsKLSAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7Ci0gICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICBTdHJpbmcgX3VzZXJTdHJ1Y3RvckJvZHkgPSB0aGlzLl9wcm9jZWR1cmVIZWxwZXJzLnVzZXJTdHJ1Y3RvckJvZHkoYWMsIHRydWUpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKF91c2VyU3RydWN0b3JCb2R5LCAiXHQiKTsKLSAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIHsKKyAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzIgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMiA9IF9zZXR0aW5nc18yLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzIpIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzkgPSBhYy5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzksICIiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6c2V0UHJvYmVzQWN0aXZlKGJvb2wgcmVjdXJzaXZlLCBib29sIGFjdGl2ZSkgeyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UobV9SVFN5c3RlbVBvcnQpOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBFTGlzdDxBY3RvclJlZj4gX2FjdG9yUmVmc18zID0gYWMuZ2V0QWN0b3JSZWZzKCk7CisgICAgICAgICAgICBpbnQgX3NpemUgPSBfYWN0b3JSZWZzXzMuc2l6ZSgpOworICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW5fMiA9IChfc2l6ZSA+IDApOworICAgICAgICAgICAgaWYgKF9ncmVhdGVyVGhhbl8yKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZihyZWN1cnNpdmUpIHsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfNCA9IGFjLmdldEFjdG9yUmVmcygpOworICAgICAgICAgICAgICAgIGZvcihmaW5hbCBBY3RvclJlZiBzdWJfMyA6IF9hY3RvclJlZnNfNCkgeworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEwID0gc3ViXzMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEwLCAiXHRcdCIpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuc2V0UHJvYmVzQWN0aXZlKHJlY3Vyc2l2ZSwgYWN0aXZlKTsiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgeworICAgICAgICAgICAgTGlzdDxQb3J0PiBfZW5kUG9ydHMgPSB0aGlzLl9yb29tSGVscGVycy5nZXRFbmRQb3J0cyhhYyk7CisgICAgICAgICAgICBmb3IoZmluYWwgUG9ydCBlcCA6IF9lbmRQb3J0cykgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBfaXNEYXRhRHJpdmVuXzEgPSB0aGlzLl9yb29tSGVscGVycy5pc0RhdGFEcml2ZW4oZXApOworICAgICAgICAgICAgICAgIGJvb2xlYW4gX25vdCA9ICghX2lzRGF0YURyaXZlbl8xKTsKKyAgICAgICAgICAgICAgICBpZiAoX25vdCkgeworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIF9pc1JlcGxpY2F0ZWQgPSBlcC5pc1JlcGxpY2F0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc1JlcGxpY2F0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJmb3IoaW50IGkgPSAwOyBpIDwgIik7CisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzExID0gZXAuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xMSwgIlx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZ2V0TkludGVyZmFjZUl0ZW1zKCk7IGkrKykiKTsKKyAgICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSgqKCIpOworICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xMiA9IGVwLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMTIsICJcdFx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuZ2V0SW50ZXJmYWNlSXRlbShpKSkpOyIpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UoIik7CisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEzID0gZXAuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xMywgIlx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpOyIpOworICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgeworICAgICAgICAgICAgRUxpc3Q8U0FQPiBfc2VydmljZUFjY2Vzc1BvaW50cyA9IGFjLmdldFNlcnZpY2VBY2Nlc3NQb2ludHMoKTsKKyAgICAgICAgICAgIGZvcihmaW5hbCBTQVAgc2FwIDogX3NlcnZpY2VBY2Nlc3NQb2ludHMpIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCIpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMTQgPSBzYXAuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMTQsICJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIik7Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEVMaXN0PFNQUD4gX3NlcnZpY2VQcm92aXNpb25Qb2ludHMgPSBhYy5nZXRTZXJ2aWNlUHJvdmlzaW9uUG9pbnRzKCk7CisgICAgICAgICAgICBmb3IoZmluYWwgU1BQIHNwcCA6IF9zZXJ2aWNlUHJvdmlzaW9uUG9pbnRzKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJmb3IoaW50IGkgPSAwOyBpIDwgIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xNSA9IHNwcC5nZXROYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xNSwgIlx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmdldE5JbnRlcmZhY2VJdGVtcygpOyBpKyspIik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UoKigiKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzE2ID0gc3BwLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzE2LCAiXHRcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmdldEludGVyZmFjZUl0ZW0oaSkpKTsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7Ci0gICAgICBTdHJpbmcgX25hbWVfOCA9IGFjLmdldE5hbWUoKTsKLSAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV84LCAiIik7CisgICAgICBTdHJpbmcgX25hbWVfMTcgPSBhYy5nZXROYW1lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMTcsICIiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOjpkZXN0cm95KCl7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8zID0gX3NldHRpbmdzXzMuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMykgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIk1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgXCJkZXN0cm95KClcIik7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBTdHJpbmcgX3VzZXJTdHJ1Y3RvckJvZHlfMSA9IHRoaXMuX3Byb2NlZHVyZUhlbHBlcnMudXNlclN0cnVjdG9yQm9keShhYywgZmFsc2UpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKF91c2VyU3RydWN0b3JCb2R5XzEsICJcdCIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgIHsKLSAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzIgPSBNYWluLmdldFNldHRpbmdzKCk7Ci0gICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMiA9IF9zZXR0aW5nc18yLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzIpIHsKKyAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzQgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fNCA9IF9zZXR0aW5nc180LmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzQpIHsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckRlc3Ryb3koKnRoaXMpOyIpOwogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKQEAgLTg3NCw4ICsxMTE5LDggQEAKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIEVMaXN0PFN0YW5kYXJkT3BlcmF0aW9uPiBfb3BlcmF0aW9ucyA9IGFjLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgIFN0cmluZyBfbmFtZV85ID0gYWMuZ2V0TmFtZSgpOwotICAgICAgQ2hhclNlcXVlbmNlIF9vcGVyYXRpb25zSW1wbGVtZW50YXRpb24gPSB0aGlzLl9wcm9jZWR1cmVIZWxwZXJzLm9wZXJhdGlvbnNJbXBsZW1lbnRhdGlvbihfb3BlcmF0aW9ucywgX25hbWVfOSk7CisgICAgICBTdHJpbmcgX25hbWVfMTggPSBhYy5nZXROYW1lKCk7CisgICAgICBDaGFyU2VxdWVuY2UgX29wZXJhdGlvbnNJbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3Byb2NlZHVyZUhlbHBlcnMub3BlcmF0aW9uc0ltcGxlbWVudGF0aW9uKF9vcGVyYXRpb25zLCBfbmFtZV8xOCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoX29wZXJhdGlvbnNJbXBsZW1lbnRhdGlvbiwgIiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKQEAgLTg5MCw4ICsxMTM1LDggQEAKICAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc180ID0gT2JqZWN0cy5lcXVhbChfY29tbVR5cGVfNCwgQ29tcG9uZW50Q29tbXVuaWNhdGlvblR5cGUuREFUQV9EUklWRU4pOwogICAgICAgICAgICAgaWYgKF9lcXVhbHNfNCkgewogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xMCA9IGFjLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEwLCAiIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xOSA9IGFjLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzE5LCAiIik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOjpyZWNlaXZlRXZlbnQoSW50ZXJmYWNlSXRlbUJhc2UqIGlmaXRlbSwgaW50IGV2dCwgdm9pZCogZ2VuZXJpY19kYXRhKSB7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKQEAgLTkxNCw4ICsxMTU5LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChfb3JfMikgewogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xMSA9IGFjLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzExLCAiIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8yMCA9IGFjLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIwLCAiIik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOjpyZWNlaXZlKGNvbnN0IE1lc3NhZ2UqIG1zZykgeyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgICB7CkBAIC05NDIsOCArMTE4Nyw4IEBACiAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG5vIHN0YXRlIG1hY2hpbmUiKTsKICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgidm9pZCAiKTsKLSAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xMiA9IGFjLmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xMiwgIiIpOworICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzIxID0gYWMuZ2V0TmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIxLCAiIik7CiAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6cmVjZWl2ZUV2ZW50KEludGVyZmFjZUl0ZW1CYXNlKiBpZml0ZW0sIGludCBldnQsIHZvaWQqIGRhdGEpIHsiKTsKICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4uamF2YQppbmRleCBiNTBhODA4Li5kY2YzZTcxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Ob2RlR2VuLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTI2LDcgKzI3LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5ldHBoeXMuZVRQaHlzLk5vZGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZXRwaHlzLmVUUGh5cy5QaHlzaWNhbFRocmVhZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5mc20uZlNNLkRldGFpbENvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuYnVpbGRlci5HZW5tb2RlbENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uQWN0b3JJbnN0YW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uU3RydWN0dXJlSW5zdGFuY2U7CkBAIC0zNCw3ICszNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLldpcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLldpcmVkU3RydWN0dXJlQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLldpcmVkU3ViU3lzdGVtQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZnNtLmZzbWdlbi5JRGlhZ25vc3RpY2lhbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLkFjdG9yQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5BY3RvclJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLlJvb21Nb2RlbDsKQEAgLTQyLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmJhc2UuR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAuTWFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC5nZW4uQ3BwRXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC5nZW4uSW5pdGlhbGl6YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5mc20uYmFzZS5GaWxlU3lzdGVtSGVscGVyczsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmZzbS5iYXNlLklHZW5lcmF0b3JGaWxlSW87CiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5mc20uYmFzZS5JbmRleGVkOwpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkZ1bmN0aW9ucy5GdW5jdGlvbjE7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkl0ZXJhYmxlRXh0ZW5zaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuTGlzdEV4dGVuc2lvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKIAogQFNpbmdsZXRvbgpAQCAtNzcsNyArNzgsNyBAQAogICBwcml2YXRlIElHZW5lcmF0b3JGaWxlSW8gZmlsZUlPOwogICAKICAgQEluamVjdAotICBwcml2YXRlIElEaWFnbm9zdGljaWFuIGRpYWdub3N0aWNpYW47CisgIHByaXZhdGUgSW5pdGlhbGl6YXRpb24gaW5pdEhlbHBlcjsKICAgCiAgIHB1YmxpYyB2b2lkIGRvR2VuZXJhdGUoZmluYWwgUm9vdCByb290KSB7CiAgICAgZmluYWwgTWFwPFN1YlN5c3RlbUNsYXNzLCBXaXJlZFN1YlN5c3RlbUNsYXNzPiBzc2NjMndpcmVkID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxTdWJTeXN0ZW1DbGFzcywgV2lyZWRTdWJTeXN0ZW1DbGFzcz5uZXdIYXNoTWFwKCk7CkBAIC0xNzMsNiArMTc0LDE3IEBACiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL21vZGVsYmFzZS9TdWJTeXN0ZW1DbGFzc0Jhc2UuaFwiIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CisgICAgICAgIEVMaXN0PEFjdG9ySW5zdGFuY2U+IF9hY3Rvckluc3RhbmNlcyA9IGNvbXAuZ2V0QWN0b3JJbnN0YW5jZXMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9ySW5zdGFuY2UgYWkgOiBfYWN0b3JJbnN0YW5jZXMpIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiIik7CisgICAgICAgICAgQWN0b3JDbGFzcyBfYWN0b3JDbGFzcyA9IGFpLmdldEFjdG9yQ2xhc3MoKTsKKyAgICAgICAgICBTdHJpbmcgX2FjdG9ySW5jbHVkZVBhdGggPSB0aGlzLl9jcHBFeHRlbnNpb25zLmdldEFjdG9ySW5jbHVkZVBhdGgoX2FjdG9yQ2xhc3MpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfYWN0b3JJbmNsdWRlUGF0aCwgIiIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBEZXRhaWxDb2RlIF91c2VyQ29kZTEgPSBjYy5nZXRVc2VyQ29kZTEoKTsKICAgICAgIENoYXJTZXF1ZW5jZSBfdXNlckNvZGUgPSB0aGlzLl9wcm9jZWR1cmVIZWxwZXJzLnVzZXJDb2RlKF91c2VyQ29kZTEpOwpAQCAtMjEyLDkgKzIyNCw0OSBAQAogICAgICAgfQogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIHN1YiBhY3RvcnMiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIHsKKyAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnMgPSBjYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1YiA6IF9hY3RvclJlZnMpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eSA9IHN1Yi5nZXRNdWx0aXBsaWNpdHkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2dyZWF0ZXJUaGFuID0gKF9tdWx0aXBsaWNpdHkgPiAxKTsKKyAgICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiUmVwbGljYXRlZCIpOworICAgICAgICAgICAgICBBY3RvckNsYXNzIF90eXBlXzEgPSBzdWIuZ2V0VHlwZSgpOworICAgICAgICAgICAgICBTdHJpbmcgX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShfdHlwZV8xKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZSA9IHN1Yi5nZXROYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgICAgICAgICAgQWN0b3JDbGFzcyBfdHlwZV8yID0gc3ViLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZV8xID0gdGhpcy5fY3BwRXh0ZW5zaW9ucy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShfdHlwZV8yKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZV8xLCAiXHRcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBzdWIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZChjbHNuYW1lLCAiXHRcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCIoSVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgifiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKGNsc25hbWUsICJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIigpOyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2aXJ0dWFsIHZvaWQgcmVjZWl2ZUV2ZW50KGV0UnVudGltZTo6SW50ZXJmYWNlSXRlbUJhc2UqIGlmaXRlbSwgaW50IGV2dCwgdm9pZCogZGF0YSk7Iik7CkBAIC0yMjMsMTcgKzI3NSwyOSBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2aXJ0dWFsIHZvaWQgaW5zdGFudGlhdGVNZXNzYWdlU2VydmljZXMoKTsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2aXJ0dWFsIHZvaWQgaW5zdGFudGlhdGVBY3RvcnMoKTsiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgidmlydHVhbCB2b2lkIG1hcFRocmVhZHModm9pZCk7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgidmlydHVhbCB2b2lkIGluaXRpYWxpemUodm9pZCk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CisgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5ncyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbikgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgidmlydHVhbCB2b2lkIHNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInZpcnR1YWwgdm9pZCBpbml0KCk7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICB7Ci0gICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5ncyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbikgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMSA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8xID0gX3NldHRpbmdzXzEuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSkgewogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZXRCb29sIGhhc0dlbmVyYXRlZE1TQ0luc3RydW1lbnRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0iKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC0yODQsNiArMzQ4LDM1IEBACiAgICAgcmV0dXJuICgiVEhSRUFEXyIgKyBfdXBwZXJDYXNlKTsKICAgfQogICAKKyAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2VuZXJhdGVDb25zdHJ1Y3RvckluaXRhbGl6ZXJMaXN0KGZpbmFsIFN1YlN5c3RlbUNsYXNzIGNjKSB7CisgICAgQ2hhclNlcXVlbmNlIF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKKyAgICB7CisgICAgICBARXh0ZW5zaW9uCisgICAgICBmaW5hbCBJbml0aWFsaXphdGlvbiBpbml0SGVscGVyID0gdGhpcy5pbml0SGVscGVyOworICAgICAgQXJyYXlMaXN0PENoYXJTZXF1ZW5jZT4gaW5pdExpc3QgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPENoYXJTZXF1ZW5jZT5uZXdBcnJheUxpc3QoKTsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJTdWJTeXN0ZW1DbGFzc0Jhc2UocGFyZW50LCBuYW1lKSIpOworICAgICAgaW5pdExpc3QuYWRkKF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnMgPSBjYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgIGZpbmFsIEZ1bmN0aW9uMTxBY3RvclJlZiwgU3RyaW5nPiBfZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24xPEFjdG9yUmVmLCBTdHJpbmc+KCkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KGZpbmFsIEFjdG9yUmVmIGl0KSB7CisgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgU3RyaW5nIF9uYW1lID0gaXQuZ2V0TmFtZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKHRoaXMsIFwiIik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBpdC5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEsICIiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiKSIpOworICAgICAgICAgIHJldHVybiBfYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgICB9OworICAgICAgTGlzdDxTdHJpbmc+IF9tYXAgPSBMaXN0RXh0ZW5zaW9ucy48QWN0b3JSZWYsIFN0cmluZz5tYXAoX2FjdG9yUmVmcywgX2Z1bmN0aW9uKTsKKyAgICAgIEl0ZXJhYmxlcy48Q2hhclNlcXVlbmNlPmFkZEFsbChpbml0TGlzdCwgX21hcCk7CisgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IGluaXRIZWxwZXIuZ2VuZXJhdGVDdG9ySW5pdGlhbGl6ZXJMaXN0KGluaXRMaXN0KTsKKyAgICB9CisgICAgcmV0dXJuIF94YmxvY2tleHByZXNzaW9uOworICB9CisgIAogICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdlbmVyYXRlU291cmNlRmlsZShmaW5hbCBSb290IHJvb3QsIGZpbmFsIFN1YlN5c3RlbUluc3RhbmNlIGNvbXAsIGZpbmFsIFdpcmVkU3ViU3lzdGVtQ2xhc3Mgd2lyZWQsIGZpbmFsIENvbGxlY3Rpb248UGh5c2ljYWxUaHJlYWQ+IHVzZWRUaHJlYWRzKSB7CiAgICAgQ2hhclNlcXVlbmNlIF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKICAgICB7CkBAIC0zMjcsNiArNDIwLDggQEAKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaFwiIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL2RlYnVnZ2luZy9NU0NGdW5jdGlvbk9iamVjdC5oXCIiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbWVzc2FnaW5nL0lNZXNzYWdlU2VydmljZS5oXCIiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmhcIiIpOwpAQCAtMzM4LDE4ICs0MzMsNiBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCIjaW5jbHVkZSBcImNvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuaFwiIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICB7Ci0gICAgICAgIEVMaXN0PEFjdG9ySW5zdGFuY2U+IF9hY3Rvckluc3RhbmNlcyA9IGNvbXAuZ2V0QWN0b3JJbnN0YW5jZXMoKTsKLSAgICAgICAgZm9yKGZpbmFsIEFjdG9ySW5zdGFuY2UgYWkgOiBfYWN0b3JJbnN0YW5jZXMpIHsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiIik7Ci0gICAgICAgICAgQWN0b3JDbGFzcyBfYWN0b3JDbGFzcyA9IGFpLmdldEFjdG9yQ2xhc3MoKTsKLSAgICAgICAgICBTdHJpbmcgX2FjdG9ySW5jbHVkZVBhdGggPSB0aGlzLl9jcHBFeHRlbnNpb25zLmdldEFjdG9ySW5jbHVkZVBhdGgoX2FjdG9yQ2xhc3MpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfYWN0b3JJbmNsdWRlUGF0aCwgIiIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInVzaW5nIG5hbWVzcGFjZSBldFJ1bnRpbWU7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC0zNzcsMTMgKzQ2MCw1OSBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKGNsc25hbWUsICIiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOjoiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZChjbHNuYW1lLCAiIik7Ci0gICAgICBfYnVpbGRlci5hcHBlbmQoIihJUlRPYmplY3QqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDoiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKLSAgICAgIF9idWlsZGVyLmFwcGVuZCgiU3ViU3lzdGVtQ2xhc3NCYXNlKHBhcmVudCwgbmFtZSkiKTsKLSAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIENoYXJTZXF1ZW5jZSBfZ2VuZXJhdGVDb25zdHJ1Y3RvckluaXRhbGl6ZXJMaXN0ID0gdGhpcy5nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QoY2MpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QsICJcdFx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CisgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5ncyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbikgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIk1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgXCJDb25zdHJ1Y3RvclwiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnMgPSBjYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1YiA6IF9hY3RvclJlZnMpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eSA9IHN1Yi5nZXRNdWx0aXBsaWNpdHkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2dyZWF0ZXJUaGFuID0gKF9tdWx0aXBsaWNpdHkgPiAxKTsKKyAgICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWUgPSBzdWIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUsICJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5jcmVhdGVTdWJBY3RvcnMoIik7CisgICAgICAgICAgICAgIGludCBfbXVsdGlwbGljaXR5XzEgPSBzdWIuZ2V0TXVsdGlwbGljaXR5KCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbXVsdGlwbGljaXR5XzEsICJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIik7Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChjbHNuYW1lLCAiIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6fiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKGNsc25hbWUsICIiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiKCkgeyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIHsKKyAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzEgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSA9IF9zZXR0aW5nc18xLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzEpIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksIFwiRGVzdHJ1Y3RvclwiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwpAQCAtMzk5LDYgKzUyOCwxNiBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCI6Omluc3RhbnRpYXRlTWVzc2FnZVNlcnZpY2VzKCl7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMiA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8yID0gX3NldHRpbmdzXzIuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMikgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIk1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgXCJpbnN0YW50aWF0ZU1lc3NhZ2VTZXJ2aWNlcygpXCIpOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJJTWVzc2FnZVNlcnZpY2UqIG1zZ1NlcnZpY2U7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC00NDQsMTQgKzU4MywxNCBAQAogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgibXNnU2VydmljZSA9IG5ldyBNZXNzYWdlU2VydmljZSh0aGlzLCBJTWVzc2FnZVNlcnZpY2U6OiIpOwogICAgICAgICAgICAgICBFeGVjTW9kZSBfZXhlY21vZGVfMiA9IHRocmVhZF8xLmdldEV4ZWNtb2RlKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZSA9IF9leGVjbW9kZV8yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiXHRcdCIpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMSA9IF9leGVjbW9kZV8yLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCBpbnRlcnZhbCwgMCwgIik7CiAgICAgICAgICAgICAgIFN0cmluZyBfdGhyZWFkSWRfMSA9IHRoaXMuZ2V0VGhyZWFkSWQodGhyZWFkXzEpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3RocmVhZElkXzEsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCBcIk1lc3NhZ2VTZXJ2aWNlXyIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMSA9IHRocmVhZF8xLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEsICJcdFx0Iik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8yID0gdGhyZWFkXzEuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMiwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiwgIik7CiAgICAgICAgICAgICAgIGxvbmcgX3ByaW8gPSB0aHJlYWRfMS5nZXRQcmlvKCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfcHJpbywgIlx0XHQiKTsKQEAgLTQ2MiwxNCArNjAxLDE0IEBACiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJtc2dTZXJ2aWNlID0gbmV3IE1lc3NhZ2VTZXJ2aWNlKHRoaXMsIElNZXNzYWdlU2VydmljZTo6Iik7CiAgICAgICAgICAgICAgIEV4ZWNNb2RlIF9leGVjbW9kZV8zID0gdGhyZWFkXzEuZ2V0RXhlY21vZGUoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzIgPSBfZXhlY21vZGVfMy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8yLCAiXHRcdCIpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMyA9IF9leGVjbW9kZV8zLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzMsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCAwLCAiKTsKICAgICAgICAgICAgICAgU3RyaW5nIF90aHJlYWRJZF8yID0gdGhpcy5nZXRUaHJlYWRJZCh0aHJlYWRfMSk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfdGhyZWFkSWRfMiwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIsIFwiTWVzc2FnZVNlcnZpY2VfIik7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8zID0gdGhyZWFkXzEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMywgIlx0XHQiKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzQgPSB0aHJlYWRfMS5nZXROYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV80LCAiXHRcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiLCAiKTsKICAgICAgICAgICAgICAgbG9uZyBfcHJpb18xID0gdGhyZWFkXzEuZ2V0UHJpbygpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3ByaW9fMSwgIlx0XHQiKTsKQEAgLTQ5MSwxNyArNjMwLDE2IEBACiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoY2xzbmFtZSwgIiIpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKCI6Omluc3RhbnRpYXRlQWN0b3JzKCl7Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6bWFwVGhyZWFkcygpIHsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7Ci0gICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIHRocmVhZCBtYXBwaW5ncyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewogICAgICAgICBFTGlzdDxBY3Rvckluc3RhbmNlPiBfYWxsQ29udGFpbmVkSW5zdGFuY2VzID0gY29tcC5nZXRBbGxDb250YWluZWRJbnN0YW5jZXMoKTsKLSAgICAgICAgZm9yKGZpbmFsIEFjdG9ySW5zdGFuY2UgYWlfMSA6IF9hbGxDb250YWluZWRJbnN0YW5jZXMpIHsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9ySW5zdGFuY2UgYWkgOiBfYWxsQ29udGFpbmVkSW5zdGFuY2VzKSB7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIGZpbmFsIEVUTWFwVXRpbC5NYXBwZWRUaHJlYWQgbWFwcGVkID0gRVRNYXBVdGlsLmdldE1hcHBlZFRocmVhZChhaV8xKTsKKyAgICAgICAgICBmaW5hbCBFVE1hcFV0aWwuTWFwcGVkVGhyZWFkIG1hcHBlZCA9IEVUTWFwVXRpbC5nZXRNYXBwZWRUaHJlYWQoYWkpOwogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgewogICAgICAgICAgICAgYm9vbGVhbiBfb3JfMSA9IGZhbHNlOwpAQCAtNTE2LDcgKzY1NCw3IEBACiAgICAgICAgICAgICBpZiAoX25vdCkgewogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiYWRkUGF0aFRvVGhyZWFkKFwiIik7Ci0gICAgICAgICAgICAgIFN0cmluZyBfcGF0aCA9IGFpXzEuZ2V0UGF0aCgpOworICAgICAgICAgICAgICBTdHJpbmcgX3BhdGggPSBhaS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfcGF0aCwgIlx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsICIpOwogICAgICAgICAgICAgICBQaHlzaWNhbFRocmVhZCBfdGhyZWFkID0gbWFwcGVkLmdldFRocmVhZCgpOwpAQCAtNTI4LDc5ICs2NjYsNjAgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBzdWIgYWN0b3JzIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoY2xzbmFtZSwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCI6OmluaXRpYWxpemUoKSB7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgewotICAgICAgICBFTGlzdDxBY3RvclJlZj4gX2FjdG9yUmVmcyA9IGNjLmdldEFjdG9yUmVmcygpOwotICAgICAgICBmb3IoZmluYWwgQWN0b3JSZWYgc3ViIDogX2FjdG9yUmVmcykgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8zID0gX3NldHRpbmdzXzMuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMykgeworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuZ2V0U3luY0xvZ2dlcigpLmFkZFZpc2libGVDb21tZW50KFwic3RhcnRpbmcgaW5pdGlhbGl6YXRpb25cIik7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIk1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgXCJpbml0aWFsaXplKClcIik7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBfbXVsdGlwbGljaXR5ID0gc3ViLmdldE11bHRpcGxpY2l0eSgpOwotICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW4gPSAoX211bHRpcGxpY2l0eSA+IDEpOwotICAgICAgICAgICAgaWYgKF9ncmVhdGVyVGhhbikgewotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZm9yIChpbnQgaT0wOyBpPCIpOwotICAgICAgICAgICAgICBpbnQgX211bHRpcGxpY2l0eV8xID0gc3ViLmdldE11bHRpcGxpY2l0eSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX211bHRpcGxpY2l0eV8xLCAiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7ICsraSkgeyIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfMSA9IGNjLmdldEFjdG9yUmVmcygpOworICAgICAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1Yl8xIDogX2FjdG9yUmVmc18xKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3MgPSBNYWluLmdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgaW50IF9tdWx0aXBsaWNpdHlfMiA9IHN1Yl8xLmdldE11bHRpcGxpY2l0eSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gX2dyZWF0ZXJUaGFuXzEgPSAoX211bHRpcGxpY2l0eV8yID4gMSk7CisgICAgICAgICAgICAgICAgaWYgKF9ncmVhdGVyVGhhbl8xKSB7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFjdG9yQ3JlYXRlKCp0aGlzLCBcIiIpOwotICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzQgPSBzdWIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzQsICJcdFx0Iik7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoR2VubW9kZWxDb25zdGFudHMuSU5ERVhfU0VQLCAiXHRcdCIpOwotICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIitpKTsiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZm9yIChpbnQgaT0wOyBpPCIpOworICAgICAgICAgICAgICAgICAgaW50IF9tdWx0aXBsaWNpdHlfMyA9IHN1Yl8xLmdldE11bHRpcGxpY2l0eSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tdWx0aXBsaWNpdHlfMywgIlx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsgKytpKSB7Iik7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJuZXcgIik7Ci0gICAgICAgICAgICAgIEFjdG9yQ2xhc3MgX3R5cGVfMSA9IHN1Yi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBfaW1wbGVtZW50YXRpb25DbGFzc05hbWUgPSB0aGlzLl9jcHBFeHRlbnNpb25zLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKF90eXBlXzEpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLCAiXHRcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIih0aGlzLCBcIiIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNSA9IHN1Yi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV81LCAiXHRcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoR2VubW9kZWxDb25zdGFudHMuSU5ERVhfU0VQLCAiXHRcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiK2kpOyIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzEgPSBNYWluLmdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8xID0gX3NldHRpbmdzXzEuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8xKSB7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFjdG9yQ3JlYXRlKCp0aGlzLCAiKTsKKyAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV81ID0gc3ViXzEuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzUsICJcdFx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5nZXRTdWJBY3RvcihpKS0+Z2V0TmFtZSgpKTsiKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBY3RvckNyZWF0ZSgqdGhpcywgXCIiKTsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gc3ViLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gc3ViXzEuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzYsICJcdCIpOwogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIik7Iik7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgibmV3ICIpOwotICAgICAgICAgICAgICBBY3RvckNsYXNzIF90eXBlXzIgPSBzdWIuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lXzEgPSB0aGlzLl9jcHBFeHRlbnNpb25zLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKF90eXBlXzIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2ltcGxlbWVudGF0aW9uQ2xhc3NOYW1lXzEsICJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIih0aGlzLCBcIiIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNyA9IHN1Yi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV83LCAiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIik7Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIHdpcmluZyIpOwpAQCAtNjI5LDI5ICs3NDgsNzAgQEAKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIGNhbGwgaW5pdGlhbGl6ZSBvZiBzdWIgYWN0b3JzIik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CisgICAgICAgIEVMaXN0PEFjdG9yUmVmPiBfYWN0b3JSZWZzXzIgPSBjYy5nZXRBY3RvclJlZnMoKTsKKyAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1Yl8yIDogX2FjdG9yUmVmc18yKSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgIFN0cmluZyBfbmFtZV83ID0gc3ViXzIuZ2V0TmFtZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV83LCAiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5pbml0aWFsaXplKCk7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICB7CisgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5nc180ID0gTWFpbi5nZXRTZXR0aW5ncygpOworICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzQgPSBfc2V0dGluZ3NfNC5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl80KSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2b2lkICIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChjbHNuYW1lLCAiIik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI6OnNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpIHsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImZvcihpbnQgaSA9IDA7IGkgPCBtX1JUU3lzdGVtUG9ydC5nZXROSW50ZXJmYWNlSXRlbXMoKTsgaSsrKSIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCoobV9SVFN5c3RlbVBvcnQuZ2V0SW50ZXJmYWNlSXRlbShpKSkpOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZihyZWN1cnNpdmUpIHsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgeworICAgICAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfMyA9IGNjLmdldEFjdG9yUmVmcygpOworICAgICAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1Yl8zIDogX2FjdG9yUmVmc18zKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfOCA9IHN1Yl8zLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzgsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLnNldFByb2Jlc0FjdGl2ZShyZWN1cnNpdmUsIGFjdGl2ZSk7Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoY2xzbmFtZSwgIiIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCI6OmluaXQoKXsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7Ci0gICAgICB7Ci0gICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5nc18yID0gTWFpbi5nZXRTZXR0aW5ncygpOwotICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzIgPSBfc2V0dGluZ3NfMi5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8yKSB7Ci0gICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudChcImJlZ2luIHN1YiBzeXN0ZW0gaW5pdGlhbGl6YXRpb25cIik7Iik7Ci0gICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwotICAgICAgICB9Ci0gICAgICB9CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlN1YlN5c3RlbUNsYXNzQmFzZTo6aW5pdCgpOyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewotICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8zID0gX3NldHRpbmdzXzMuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMykgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfNSA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl81ID0gX3NldHRpbmdzXzUuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fNSkgewogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkVmlzaWJsZUNvbW1lbnQoXCJkb25lIHN1YiBzeXN0ZW0gaW5pdGlhbGl6YXRpb25cIik7Iik7CiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwpAQCAtNjYwLDIzICs4MjAsNDEgQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewotICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfNCA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl80ID0gX3NldHRpbmdzXzQuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fNCkgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfNiA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl82ID0gX3NldHRpbmdzXzYuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fNikgewogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKGNsc25hbWUsICIiKTsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjo6ZGVzdHJveSgpIHsiKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkVmlzaWJsZUNvbW1lbnQoXCJiZWdpbiBzdWIgc3lzdGVtIGRlc3RydWN0aW9uXCIpOyIpOwotICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfNyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fNyA9IF9zZXR0aW5nc183LmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl83KSB7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmdldFN5bmNMb2dnZXIoKS5hZGRWaXNpYmxlQ29tbWVudChcInN0YXJ0aW5nIGRlc3RydWN0aW9uXCIpOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksIFwiZGVzdHJveSgpXCIpOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFZpc2libGVDb21tZW50KFwiYmVnaW4gc3ViIHN5c3RlbSBkZXN0cnVjdGlvblwiKTsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJTdWJTeXN0ZW1DbGFzc0Jhc2U6OmRlc3Ryb3koKTsiKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudChcImRvbmUgc3ViIHN5c3RlbSBkZXN0cnVjdGlvblwiKTsiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgeworICAgICAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzggPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzggPSBfc2V0dGluZ3NfOC5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fOCkgeworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRWaXNpYmxlQ29tbWVudChcImRvbmUgc3ViIHN5c3RlbSBkZXN0cnVjdGlvblwiKTsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vUHJvdG9jb2xDbGFzc0dlbi5qYXZhCmluZGV4IDc0ODc4ZmQuLjY2ZmM3MjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4uamF2YQpAQCAtNTEyLDYgKzUxMiw4IEBACiAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaFwiIik7CiAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vZGVidWdnaW5nL01TQ0Z1bmN0aW9uT2JqZWN0LmhcIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL21lc3NhZ2luZy9BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlci5oXCIiKTsKICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKCIjaW5jbHVkZSBcImNvbW1vbi9tZXNzYWdpbmcvQWRkcmVzcy5oXCIiKTsKQEAgLTYzOCwxNSArNjQwLDYgQEAKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKLSAgICAgIHsKLSAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzID0gTWFpbi5nZXRTZXR0aW5ncygpOwotICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uID0gX3NldHRpbmdzLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKSB7Ci0gICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UoKnRoaXMpOyIpOwotICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKLSAgICAgICAgfQotICAgICAgfQogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC02NzEsMjEgKzY2NCwxMiBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwotICAgICAgewotICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMSA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8xID0gX3NldHRpbmdzXzEuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSkgewotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCp0aGlzKTsiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KICAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgewotICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3NfMiA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbl8yID0gX3NldHRpbmdzXzIuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMikgeworICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3MgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24gPSBfc2V0dGluZ3MuaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24pIHsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ2b2lkICIpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChwb3J0Q2xhc3NOYW1lLCAiIik7CkBAIC03MzEsOSArNzE1LDkgQEAKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIHsKLSAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzMgPSBNYWluLmdldFNldHRpbmdzKCk7Ci0gICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMyA9IF9zZXR0aW5nc18zLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzMpIHsKKyAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzXzEgPSBNYWluLmdldFNldHRpbmdzKCk7CisgICAgICAgIGJvb2xlYW4gX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb25fMSA9IF9zZXR0aW5nc18xLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaWYgKF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uXzEpIHsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY0luKGdldFBlZXJBZGRyZXNzKCksIGdldEFkZHJlc3MoKSwgIik7CiAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBwYy5nZXROYW1lKCk7CkBAIC0xMTE1LDIxICsxMDk5LDI3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY091dChnZXRBZGRyZXNzKCksIGdldFBlZXJBZGRyZXNzKCksIik7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5uZXdMaW5lKCk7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQocG9ydENsYXNzTmFtZSwgIlx0XHQiKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiOjpnZXRNZXNzYWdlU3RyaW5nKCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKHBvcnRDbGFzc05hbWUsICJcdFx0Iik7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIjo6Iik7Ci0gICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoZGlyLCAiXHRcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJfIik7Ci0gICAgICAgICAgU3RyaW5nIF9uYW1lXzMgPSBtLmdldE5hbWUoKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZChfbmFtZV8zLCAiXHRcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCIpKTsiKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgeworICAgICAgICAgICAgR2xvYmFsR2VuZXJhdG9yU2V0dGluZ3MgX3NldHRpbmdzID0gTWFpbi5nZXRTZXR0aW5ncygpOworICAgICAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgICAgICBpZiAoX2lzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY091dChnZXRBZGRyZXNzKCksIGdldFBlZXJBZGRyZXNzKCksIik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIubmV3TGluZSgpOworICAgICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKHBvcnRDbGFzc05hbWUsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCI6OmdldE1lc3NhZ2VTdHJpbmcoIik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKHBvcnRDbGFzc05hbWUsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCI6OiIpOworICAgICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZChkaXIsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJfIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8zID0gbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKF9uYW1lXzMsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCIpKTsiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiaWYgKGdldFBlZXJBZGRyZXNzKCkuaXNWYWxpZCgpKXsiKTsKICAgICAgICAgICBfYnVpbGRlcl8yLm5ld0xpbmUoKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy1nZW4vY29tbW9uL21vZGVsYmFzZS9SVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2wuY3BwIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjLWdlbi9jb21tb24vbW9kZWxiYXNlL1JUU3lzdGVtU2VydmljZXNQcm90b2NvbC5jcHAKaW5kZXggNTUyNzZlNy4uMGYyMDFjMiAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjLWdlbi9jb21tb24vbW9kZWxiYXNlL1JUU3lzdGVtU2VydmljZXNQcm90b2NvbC5jcHAKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjLWdlbi9jb21tb24vbW9kZWxiYXNlL1JUU3lzdGVtU2VydmljZXNQcm90b2NvbC5jcHAKQEAgLTcsMTQgKzcsMTMgQEAKIAogI2luY2x1ZGUgIlJUU3lzdGVtU2VydmljZXNQcm90b2NvbC5oIgogCi0jaW5jbHVkZSA8Y29tbW9uL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8Y29tbW9uL21lc3NhZ2luZy9BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlci5oPgotI2luY2x1ZGUgPGNvbW1vbi9tZXNzYWdpbmcvQWRkcmVzcy5oPgotI2luY2x1ZGUgPGNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZS5oPgotI2luY2x1ZGUgPGNvbW1vbi9tb2RlbGJhc2UvSUV2ZW50UmVjZWl2ZXIuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJjb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21tb24vZGVidWdnaW5nL01TQ0Z1bmN0aW9uT2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlci5oIgorI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvQWRkcmVzcy5oIgorI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZS5oIgorI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvSUV2ZW50UmVjZWl2ZXIuaCIKICNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBuYW1lc3BhY2UgZXRSdW50aW1lOwpAQCAtMzgsMTYgKzM3LDE0IEBACiAvLyBwb3J0IGNsYXNzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1SVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xQb3J0OjpSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xQb3J0KElJbnRlcmZhY2VJdGVtT3duZXIqIGFjdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IGxvY2FsSWQpIDoKLQkJUG9ydEJhc2UoYWN0b3IsIG5hbWUsIGxvY2FsSWQsIDApCitSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xQb3J0OjpSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xQb3J0KElJbnRlcmZhY2VJdGVtT3duZXIqIGFjdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IGxvY2FsSWQpCisJOiBQb3J0QmFzZShhY3RvciwgbmFtZSwgbG9jYWxJZCwgMCkKIHsKLQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSgqdGhpcyk7CiB9CiAKLVJUU3lzdGVtU2VydmljZXNQcm90b2NvbFBvcnQ6OlJUU3lzdGVtU2VydmljZXNQcm90b2NvbFBvcnQoSUludGVyZmFjZUl0ZW1Pd25lciogYWN0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbG9jYWxJZCwgaW50IGlkeCkgOgotCQlQb3J0QmFzZShhY3RvciwgbmFtZSwgbG9jYWxJZCwgaWR4KQorUlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sUG9ydDo6UlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sUG9ydChJSW50ZXJmYWNlSXRlbU93bmVyKiBhY3RvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBsb2NhbElkLCBpbnQgaWR4KQorCTogUG9ydEJhc2UoYWN0b3IsIG5hbWUsIGxvY2FsSWQsIGlkeCkKIHsKLQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZFBvcnRJbnN0YW5jZSgqdGhpcyk7CiB9CiAKIHZvaWQgUlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sUG9ydDo6ZGVzdHJveSgpIHsKQEAgLTgyLDE2ICs3OSwxNCBAQAogLy8gY29uanVnYXRlZCBwb3J0IGNsYXNzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1SVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xDb25qUG9ydDo6UlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sQ29ualBvcnQoSUludGVyZmFjZUl0ZW1Pd25lciogYWN0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbG9jYWxJZCkgOgotCQlQb3J0QmFzZShhY3RvciwgbmFtZSwgbG9jYWxJZCwgMCkKK1JUU3lzdGVtU2VydmljZXNQcm90b2NvbENvbmpQb3J0OjpSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xDb25qUG9ydChJSW50ZXJmYWNlSXRlbU93bmVyKiBhY3RvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBsb2NhbElkKQorCTogUG9ydEJhc2UoYWN0b3IsIG5hbWUsIGxvY2FsSWQsIDApCiB7Ci0JRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRQb3J0SW5zdGFuY2UoKnRoaXMpOwogfQogCi1SVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xDb25qUG9ydDo6UlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sQ29ualBvcnQoSUludGVyZmFjZUl0ZW1Pd25lciogYWN0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgbG9jYWxJZCwgaW50IGlkeCkgOgotCQlQb3J0QmFzZShhY3RvciwgbmFtZSwgbG9jYWxJZCwgaWR4KQorUlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sQ29ualBvcnQ6OlJUU3lzdGVtU2VydmljZXNQcm90b2NvbENvbmpQb3J0KElJbnRlcmZhY2VJdGVtT3duZXIqIGFjdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IGxvY2FsSWQsIGludCBpZHgpCisJOiBQb3J0QmFzZShhY3RvciwgbmFtZSwgbG9jYWxJZCwgaWR4KQogewotCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkUG9ydEluc3RhbmNlKCp0aGlzKTsKIH0KIAogdm9pZCBSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xDb25qUG9ydDo6ZGVzdHJveSgpIHsKQEAgLTE1OSwzICsxNTQsNCBAQAogCX0KIH0KIAorCmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMtZ2VuL2NvbW1vbi9tb2RlbGJhc2UvUlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sLmggYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMtZ2VuL2NvbW1vbi9tb2RlbGJhc2UvUlRTeXN0ZW1TZXJ2aWNlc1Byb3RvY29sLmgKaW5kZXggNjljOTE0ZC4uNzY4MmU5MyAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjLWdlbi9jb21tb24vbW9kZWxiYXNlL1JUU3lzdGVtU2VydmljZXNQcm90b2NvbC5oCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy1nZW4vY29tbW9uL21vZGVsYmFzZS9SVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2wuaApAQCAtNSwxNSArNSwxNSBAQAogICoKICAqLwogCi0jaWZuZGVmIF9SVFNZU1RFTVNFUlZJQ0VTUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1JUU1lTVEVNU0VSVklDRVNQUk9UT0NPTF9IXworI2lmbmRlZiBfQ09NTU9OX01PREVMQkFTRV9SVFNZU1RFTVNFUlZJQ0VTUFJPVE9DT0xfSF8KKyNkZWZpbmUgX0NPTU1PTl9NT0RFTEJBU0VfUlRTWVNURU1TRVJWSUNFU1BST1RPQ09MX0hfCiAKLSNpbmNsdWRlIDxjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmg+Ci0jaW5jbHVkZSA8Y29tbW9uL21vZGVsYmFzZS9Qb3J0QmFzZS5oPgotI2luY2x1ZGUgPGNvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEludGVyZmFjZUl0ZW1CYXNlLmg+Ci0jaW5jbHVkZSA8Y29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkUG9ydEJhc2UuaD4KLSNpbmNsdWRlIDxldERhdGF0eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmgiCisjaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9Qb3J0QmFzZS5oIgorI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEludGVyZmFjZUl0ZW1CYXNlLmgiCisjaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkUG9ydEJhc2UuaCIKKyNpbmNsdWRlICJjb21tb24vZXREYXRhdHlwZXNDcHAuaHBwIgorCiAKIAogCkBAIC00Myw3ICs0Myw2IEBACiAJcHJpdmF0ZToKIAkJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHNfbWVzc2FnZVN0cmluZ3NbXTsKIAotCiB9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI0LDQgKzEyMyw2IEBACiAJCX0KIAogfTsKLSNlbmRpZiAvKiBfUlRTWVNURU1TRVJWSUNFU1BST1RPQ09MX0hfICovCisKKworI2VuZGlmIC8qIF9DT01NT05fTU9ERUxCQVNFX1JUU1lTVEVNU0VSVklDRVNQUk9UT0NPTF9IXyAqLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9kZWJ1Z2dpbmcvRGVidWdnaW5nU2VydmljZS5jcHAgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlLmNwcAppbmRleCA4OWE4YmM2Li5iMmRlZGMzIDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9BY3RvckNsYXNzQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvU3ViU3lzdGVtQ2xhc3NCYXNlLmgiCi0jaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9Qb3J0QmFzZS5oIgorI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuaCIKICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogbmFtZXNwYWNlIGV0UnVudGltZSB7CkBAIC0zMSw4ICszMSw4IEBACiAJCW1fcG9ydEluc3RhbmNlcygpIHsKIH0KIAotY29uc3QgUG9ydEJhc2UqIERlYnVnZ2luZ1NlcnZpY2U6OmdldFBvcnQoY29uc3QgQWRkcmVzcyYgYWRkcmVzcykgY29uc3QgewotCXN0ZDo6bWFwPEFkZHJlc3MsIGNvbnN0IFBvcnRCYXNlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3J0SW5zdGFuY2VzLmZpbmQoYWRkcmVzcyk7Citjb25zdCBJbnRlcmZhY2VJdGVtQmFzZSogRGVidWdnaW5nU2VydmljZTo6Z2V0UG9ydChjb25zdCBBZGRyZXNzJiBhZGRyZXNzKSBjb25zdCB7CisJc3RkOjptYXA8QWRkcmVzcywgY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3BvcnRJbnN0YW5jZXMuZmluZChhZGRyZXNzKTsKIAlpZiAoaXQgIT0gbV9wb3J0SW5zdGFuY2VzLmVuZCgpKQogCQlyZXR1cm4gaXQtPnNlY29uZDsKIApAQCAtNDAsOCArNDAsOCBAQAogfQogCiB2b2lkIERlYnVnZ2luZ1NlcnZpY2U6OmFkZE1lc3NhZ2VBc3luY091dChjb25zdCBBZGRyZXNzJiBzb3VyY2UsIGNvbnN0IEFkZHJlc3MmIHRhcmdldCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgewotCWNvbnN0IFBvcnRCYXNlKiBzcmNQb3J0ID0gZ2V0UG9ydChzb3VyY2UpOwotCWNvbnN0IFBvcnRCYXNlKiB0Z3RQb3J0ID0gZ2V0UG9ydCh0YXJnZXQpOworCWNvbnN0IEludGVyZmFjZUl0ZW1CYXNlKiBzcmNQb3J0ID0gZ2V0UG9ydChzb3VyY2UpOworCWNvbnN0IEludGVyZmFjZUl0ZW1CYXNlKiB0Z3RQb3J0ID0gZ2V0UG9ydCh0YXJnZXQpOwogCWlmIChzcmNQb3J0ICE9IDAgJiYgdGd0UG9ydCAhPSAwKQogCQltX2FzeW5jTG9nZ2VyLmFkZE1lc3NhZ2VBc3luY091dChzcmNQb3J0LT5nZXRBY3RvcigpLT5nZXRJbnN0YW5jZVBhdGgoKSwgdGd0UG9ydC0+Z2V0QWN0b3IoKS0+Z2V0SW5zdGFuY2VQYXRoKCksCiAJCQkJbXNnKTsKQEAgLTQ5LDI0ICs0OSwyNCBAQAogfQogCiB2b2lkIERlYnVnZ2luZ1NlcnZpY2U6OmFkZE1lc3NhZ2VBc3luY0luKGNvbnN0IEFkZHJlc3MmIHNvdXJjZSwgY29uc3QgQWRkcmVzcyYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7Ci0JY29uc3QgUG9ydEJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7Ci0JY29uc3QgUG9ydEJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CiAJaWYgKHNyY1BvcnQgIT0gMCAmJiB0Z3RQb3J0ICE9IDApCiAJCW1fYXN5bmNMb2dnZXIuYWRkTWVzc2FnZUFzeW5jSW4oc3JjUG9ydC0+Z2V0QWN0b3IoKS0+Z2V0SW5zdGFuY2VQYXRoKCksIHRndFBvcnQtPmdldEFjdG9yKCktPmdldEluc3RhbmNlUGF0aCgpLAogCQkJCW1zZyk7CiB9CiAKIHZvaWQgRGVidWdnaW5nU2VydmljZTo6YWRkTWVzc2FnZVN5bmNDYWxsKGNvbnN0IEFkZHJlc3MmIHNvdXJjZSwgY29uc3QgQWRkcmVzcyYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7Ci0JY29uc3QgUG9ydEJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7Ci0JY29uc3QgUG9ydEJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CiAJaWYgKHNyY1BvcnQgIT0gMCAmJiB0Z3RQb3J0ICE9IDApCiAJCW1fYXN5bmNMb2dnZXIuYWRkTWVzc2FnZVN5bmNDYWxsKHNyY1BvcnQtPmdldEFjdG9yKCktPmdldEluc3RhbmNlUGF0aCgpLCB0Z3RQb3J0LT5nZXRBY3RvcigpLT5nZXRJbnN0YW5jZVBhdGgoKSwKIAkJCQltc2cpOwogfQogCiB2b2lkIERlYnVnZ2luZ1NlcnZpY2U6OmFkZE1lc3NhZ2VTeW5jUmV0dXJuKGNvbnN0IEFkZHJlc3MmIHNvdXJjZSwgY29uc3QgQWRkcmVzcyYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7Ci0JY29uc3QgUG9ydEJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7Ci0JY29uc3QgUG9ydEJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHNyY1BvcnQgPSBnZXRQb3J0KHNvdXJjZSk7CisJY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqIHRndFBvcnQgPSBnZXRQb3J0KHRhcmdldCk7CiAJaWYgKHNyY1BvcnQgIT0gMCAmJiB0Z3RQb3J0ICE9IDApCiAJCW1fYXN5bmNMb2dnZXIuYWRkTWVzc2FnZVN5bmNSZXR1cm4oc3JjUG9ydC0+Z2V0QWN0b3IoKS0+Z2V0SW5zdGFuY2VQYXRoKCksCiAJCQkJdGd0UG9ydC0+Z2V0QWN0b3IoKS0+Z2V0SW5zdGFuY2VQYXRoKCksIG1zZyk7CkBAIC05NSwxMSArOTUsMTEgQEAKIAltX2FzeW5jTG9nZ2VyLmFkZFZpc2libGVDb21tZW50KGNvbW1lbnQpOwogfQogCi12b2lkIERlYnVnZ2luZ1NlcnZpY2U6OmFkZFBvcnRJbnN0YW5jZShjb25zdCBQb3J0QmFzZSYgcG9ydCkgewordm9pZCBEZWJ1Z2dpbmdTZXJ2aWNlOjphZGRQb3J0SW5zdGFuY2UoY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UmIHBvcnQpIHsKIAltX3BvcnRJbnN0YW5jZXNbcG9ydC5nZXRBZGRyZXNzKCldID0gJnBvcnQ7CiB9CiAKLXZvaWQgRGVidWdnaW5nU2VydmljZTo6cmVtb3ZlUG9ydEluc3RhbmNlKGNvbnN0IFBvcnRCYXNlJiBwb3J0KSB7Cit2b2lkIERlYnVnZ2luZ1NlcnZpY2U6OnJlbW92ZVBvcnRJbnN0YW5jZShjb25zdCBJbnRlcmZhY2VJdGVtQmFzZSYgcG9ydCkgewogCW1fcG9ydEluc3RhbmNlcy5lcmFzZShwb3J0LmdldEFkZHJlc3MoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2UuaAppbmRleCBjN2VmM2U2Li4wYWM5ZTYzIDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlLmgKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9kZWJ1Z2dpbmcvRGVidWdnaW5nU2VydmljZS5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiY29tbW9uL2RlYnVnZ2luZy9NU0NMb2dnZXIuaCIKICNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL0FkZHJlc3MuaCIKICNpbmNsdWRlICJldERhdGF0eXBlcy5oIgorI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuaCIKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWFwPgogCkBAIC00MSw4ICs0Miw4IEBACiAJdm9pZCBhZGRNZXNzYWdlQWN0b3JDcmVhdGUoY29uc3QgQWN0b3JDbGFzc0Jhc2UmIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlZk5hbWUpOwogCXZvaWQgYWRkTWVzc2FnZUFjdG9yRGVzdHJveShjb25zdCBBY3RvckNsYXNzQmFzZSYgaW5zdCk7CiAJdm9pZCBhZGRWaXNpYmxlQ29tbWVudChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudCk7Ci0Jdm9pZCBhZGRQb3J0SW5zdGFuY2UoY29uc3QgUG9ydEJhc2UmIHBvcnQpOwotCXZvaWQgcmVtb3ZlUG9ydEluc3RhbmNlKGNvbnN0IFBvcnRCYXNlJiBwb3J0KTsKKwl2b2lkIGFkZFBvcnRJbnN0YW5jZShjb25zdCBJbnRlcmZhY2VJdGVtQmFzZSYgcG9ydCk7CisJdm9pZCByZW1vdmVQb3J0SW5zdGFuY2UoY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UmIHBvcnQpOwogCiAJTVNDTG9nZ2VyJiBnZXRTeW5jTG9nZ2VyKCkgeyByZXR1cm4gbV9zeW5jTG9nZ2VyOyB9CiAJTVNDTG9nZ2VyJiBnZXRBc3luY0xvZ2dlcigpIHsgcmV0dXJuIG1fYXN5bmNMb2dnZXI7IH0KQEAgLTUxLDkgKzUyLDkgQEAKIAogCU1TQ0xvZ2dlciBtX2FzeW5jTG9nZ2VyOwogCU1TQ0xvZ2dlciBtX3N5bmNMb2dnZXI7Ci0Jc3RkOjptYXA8QWRkcmVzcywgY29uc3QgUG9ydEJhc2UqPiBtX3BvcnRJbnN0YW5jZXM7CisJc3RkOjptYXA8QWRkcmVzcywgY29uc3QgSW50ZXJmYWNlSXRlbUJhc2UqPiBtX3BvcnRJbnN0YW5jZXM7CiAKLQljb25zdCBQb3J0QmFzZSogZ2V0UG9ydChjb25zdCBBZGRyZXNzJiBhZGRyZXNzKSBjb25zdDsKKwljb25zdCBJbnRlcmZhY2VJdGVtQmFzZSogZ2V0UG9ydChjb25zdCBBZGRyZXNzJiBhZGRyZXNzKSBjb25zdDsKIAogCURlYnVnZ2luZ1NlcnZpY2UoKTsKIAlEZWJ1Z2dpbmdTZXJ2aWNlKERlYnVnZ2luZ1NlcnZpY2UgY29uc3QmKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL1JUT2JqZWN0LmNwcCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL1JUT2JqZWN0LmNwcAppbmRleCAxOWUxNDZhLi42YzMxODJlIDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9SVE9iamVjdC5jcHAKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvUlRPYmplY3QuY3BwCkBAIC0zMywxMiArMzMsNiBAQAogCX0KIH0KIAotUlRPYmplY3Q6On5SVE9iamVjdCgpIHsKLQlmb3IgKHN0ZDo6dmVjdG9yPElSVE9iamVjdCo+OjppdGVyYXRvciBpdCA9IG1fY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gbV9jaGlsZHJlbi5lbmQoKTsgKytpdCkgewotCQlkZWxldGUgKml0OwotCX0KLX0KLQogdm9pZCBSVE9iamVjdDo6ZGVzdHJveSgpIHsKIAlmb3IgKHN0ZDo6dmVjdG9yPElSVE9iamVjdCo+OjppdGVyYXRvciBpdCA9IG1fY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gbV9jaGlsZHJlbi5lbmQoKTsgKytpdCkgewogCQlSVE9iamVjdCogY2hpbGQgPSBkeW5hbWljX2Nhc3Q8UlRPYmplY3QqPigqaXQpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvUlRPYmplY3QuaCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL1JUT2JqZWN0LmgKaW5kZXggYTRiYjZjZC4uY2ViMmI2YyAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvUlRPYmplY3QuaAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9SVE9iamVjdC5oCkBAIC0yMyw3ICsyMyw3IEBACiBwdWJsaWM6CiAJUlRPYmplY3QoSVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKIAotCXZpcnR1YWwgflJUT2JqZWN0KCk7CisJdmlydHVhbCB+UlRPYmplY3QoKSB7fQogCiAJdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0IHsKIAkJcmV0dXJuIG1fbmFtZTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0FjdG9yQ2xhc3NCYXNlLmNwcCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0FjdG9yQ2xhc3NCYXNlLmNwcAppbmRleCA5MzE0NDliLi41ZjY3YjhhIDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9BY3RvckNsYXNzQmFzZS5jcHAKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvQWN0b3JDbGFzc0Jhc2UuY3BwCkBAIC0zMyw2ICszMywxNyBAQAogCW1fc3RhdGUgPSAwOwogfQogCit2b2lkIEFjdG9yQ2xhc3NCYXNlOjppbml0aWFsaXplKCkgeworCS8vIHNpbmNlIHdlIGhhdmUgbm8gbWFwcGluZyBmb3IgdGhlIHN5c3RlbSBwb3J0cyB3ZSBjb25uZWN0IHRoZW0gZGlyZWN0bHkgaGVyZQorCUlSZXBsaWNhdGVkSW50ZXJmYWNlSXRlbSogc3lzdGVtUG9ydCA9IGdldFN5c3RlbVBvcnQoKTsKKwlpZiAoc3lzdGVtUG9ydCAhPSAwKSB7CisJCUludGVyZmFjZUl0ZW1CYXNlKiBwZWVyID0gc3lzdGVtUG9ydC0+Y3JlYXRlU3ViSW50ZXJmYWNlSXRlbSgpOworCQltX1JUU3lzdGVtUG9ydC5jb25uZWN0V2l0aChwZWVyKTsKKwl9Cit9CisKKworCiAvL1N1YlN5c3RlbUNsYXNzQmFzZSogQWN0b3JDbGFzc0Jhc2U6OmdldFN1YlN5c3RlbSgpIGNvbnN0IHsKIC8vCXJldHVybiAwOyAvLyBUT0RPIEpICiAvL30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0FjdG9yQ2xhc3NCYXNlLmggYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9BY3RvckNsYXNzQmFzZS5oCmluZGV4IDdiZDAwMmMuLjUyZDg3NmIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0FjdG9yQ2xhc3NCYXNlLmgKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvQWN0b3JDbGFzc0Jhc2UuaApAQCAtMjMsNyArMjMsNiBAQAogbmFtZXNwYWNlIGV0UnVudGltZSB7CiAKIAotCiBjbGFzcyBBY3RvckNsYXNzQmFzZTogcHVibGljIFN5c3RlbVBvcnRPd25lciwgcHVibGljIHZpcnR1YWwgSU1lc3NhZ2VSZWNlaXZlciB7CiBwdWJsaWM6CiAKQEAgLTQyLDYgKzQxLDkgQEAKIAkJcmV0dXJuIEFkZHJlc3M6OkVNUFRZOwogCX0KIAorCXZpcnR1YWwgdm9pZCBpbml0aWFsaXplKHZvaWQpOworCXZpcnR1YWwgdm9pZCBzZXRQcm9iZXNBY3RpdmUoYm9vbCByZWN1cnNpdmUsIGJvb2wgYWN0aXZlKSB7fQorCiAJLy9TdWJTeXN0ZW1DbGFzc0Jhc2UqIGdldFN1YlN5c3RlbSgpIGNvbnN0OwogCiAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbGlmZWN5Y2xlIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuY3BwIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuY3BwCmluZGV4IDI4MzRmZjQuLjQ5ODEzN2MgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9JbnRlcmZhY2VJdGVtQmFzZS5jcHAKQEAgLTQ0LDggKzQ0LDE2IEBACiAJCW1fcmVwbGljYXRvcigwKSB7CiAKIAltX3JlcGxpY2F0b3IgPSBkeW5hbWljX2Nhc3Q8SVJlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtKj4ob3duZXIpOworfQogCi0JaW50IHRocmVhZCA9IG93bmVyLT5nZXRFdmVudFJlY2VpdmVyKCktPmdldFRocmVhZCgpOworSW50ZXJmYWNlSXRlbUJhc2U6On5JbnRlcmZhY2VJdGVtQmFzZSgpIHsKKwltX3BlZXJBZGRyZXNzID0gQWRkcmVzczo6RU1QVFk7CisJbV9vd25Nc2dSZWNlaXZlciA9IDA7CisJbV9wZWVyTXNnUmVjZWl2ZXIgPSAwOworfQorCit2b2lkIEludGVyZmFjZUl0ZW1CYXNlOjppbml0KCkgeworCWludCB0aHJlYWQgPSBkeW5hbWljX2Nhc3Q8SUV2ZW50UmVjZWl2ZXIqPiAoZ2V0UGFyZW50KCkpLT5nZXRUaHJlYWQoKTsKIAlpZiAodGhyZWFkID49IDApIHsKIAkJSU1lc3NhZ2VTZXJ2aWNlKiBtc2dTdmMgPSBSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5nZXRNc2dTdmModGhyZWFkKTsKIAkJQWRkcmVzcyBhZGRyID0gbXNnU3ZjLT5nZXRGcmVlQWRkcmVzcygpOwpAQCAtNTYsMTIgKzY0LDYgQEAKIAl9CiB9CiAKLUludGVyZmFjZUl0ZW1CYXNlOjp+SW50ZXJmYWNlSXRlbUJhc2UoKSB7Ci0JbV9wZWVyQWRkcmVzcyA9IEFkZHJlc3M6OkVNUFRZOwotCW1fb3duTXNnUmVjZWl2ZXIgPSAwOwotCW1fcGVlck1zZ1JlY2VpdmVyID0gMDsKLX0KLQogSUludGVyZmFjZUl0ZW0qIEludGVyZmFjZUl0ZW1CYXNlOjpjb25uZWN0V2l0aChJSW50ZXJmYWNlSXRlbSogcGVlcikgewogCWlmIChwZWVyICE9IDApIHsKIAkJbV9wZWVyID0gcGVlcjsKQEAgLTc4LDYgKzgwLDEwIEBACiAKIAkJSW50ZXJmYWNlSXRlbUJhc2UqIGlmSXRlbVBlZXIgPSBkeW5hbWljX2Nhc3Q8SW50ZXJmYWNlSXRlbUJhc2UqPihtX3BlZXIpOwogCQlpZiAoaWZJdGVtUGVlciAhPSAwKSB7CisJCQkvLyBpbml0aWFsaXplIFBvcnRzCisJCQl0aGlzLT5pbml0KCk7CisJCQlpZkl0ZW1QZWVyLT5pbml0KCk7CisKIAkJCS8vIGNvbm5lY3Qgd2l0aCBlYWNoIG90aGVyCiAJCQltX3BlZXJBZGRyZXNzID0gaWZJdGVtUGVlci0+Z2V0QWRkcmVzcygpOwogCQkJaWZJdGVtUGVlci0+bV9wZWVyQWRkcmVzcyA9IGdldEFkZHJlc3MoKTsKQEAgLTEyMSw4ICsxMjcsMTAgQEAKIAkJbV9yZXBsaWNhdG9yLT5yZW1vdmVJdGVtKCp0aGlzKTsKIAl9CiAKLQltX293bk1zZ1JlY2VpdmVyLT5yZW1vdmVNZXNzYWdlUmVjZWl2ZXIoKnRoaXMpOwotCW1fb3duTXNnUmVjZWl2ZXItPmZyZWVBZGRyZXNzKGdldEFkZHJlc3MoKSk7CisJaWYobV9vd25Nc2dSZWNlaXZlcikgeworCQltX293bk1zZ1JlY2VpdmVyLT5yZW1vdmVNZXNzYWdlUmVjZWl2ZXIoKnRoaXMpOworCQltX293bk1zZ1JlY2VpdmVyLT5mcmVlQWRkcmVzcyhnZXRBZGRyZXNzKCkpOworCX0KIAogCUFic3RyYWN0TWVzc2FnZVJlY2VpdmVyOjpkZXN0cm95KCk7CiB9CmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9JbnRlcmZhY2VJdGVtQmFzZS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuaAppbmRleCAwY2M1ZGUyLi5jZGIxMmQ5IDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9JbnRlcmZhY2VJdGVtQmFzZS5oCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmgKQEAgLTYxLDYgKzYxLDcgQEAKIAkJcmV0dXJuIG1fcGVlck1zZ1JlY2VpdmVyOwogCX0KIAorCXZvaWQgaW5pdCh2b2lkKTsKIAl2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwogCiAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JUU3lzdGVtUHJvdG9jb2wuY3BwIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUlRTeXN0ZW1Qcm90b2NvbC5jcHAKaW5kZXggOTFlYjBlOC4uOWE5ZjkzMCAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUlRTeXN0ZW1Qcm90b2NvbC5jcHAKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUlRTeXN0ZW1Qcm90b2NvbC5jcHAKQEAgLTIwLDEzICsyMCw2IEBACiAKIFJUU3lzdGVtUG9ydDo6UlRTeXN0ZW1Qb3J0KElJbnRlcmZhY2VJdGVtT3duZXIqIGFjdG9yLCBpbnQgbG9jYWxJZCkgOgogCQlSVFN5c3RlbVNlcnZpY2VzUHJvdG9jb2xQb3J0KGFjdG9yLCBSVFN5c3RlbVByb3RvY29sOjpSVF9TWVNURU1fUE9SVF9OQU1FLCBsb2NhbElkKSB7Ci0KLQkvLyBzaW5jZSB3ZSBoYXZlIG5vIG1hcHBpbmcgZm9yIHRoZSBzeXN0ZW0gcG9ydHMgd2UgY29ubmVjdCB0aGVtIGRpcmVjdGx5IGhlcmUKLQlJUmVwbGljYXRlZEludGVyZmFjZUl0ZW0qIHN5c3RlbVBvcnQgPSBhY3Rvci0+Z2V0U3lzdGVtUG9ydCgpOwotCWlmIChzeXN0ZW1Qb3J0ICE9IDApIHsKLQkJSW50ZXJmYWNlSXRlbUJhc2UqIHBlZXIgPSBzeXN0ZW1Qb3J0LT5jcmVhdGVTdWJJbnRlcmZhY2VJdGVtKCk7Ci0JCWNvbm5lY3RXaXRoKHBlZXIpOwotCX0KIH0KIAogUlRTeXN0ZW1Db25qUG9ydDo6UlRTeXN0ZW1Db25qUG9ydChJSW50ZXJmYWNlSXRlbU93bmVyKiBhY3RvciwgaW50IGxvY2FsSWQpIDoKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZS5jcHAgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmU3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2UuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgcHJvdG9zIHNvZnR3YXJlIGdtYmggKGh0dHA6Ly93d3cucHJvdG9zLmRlKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ09OVFJJQlVUT1JTOgorICogCQlKYW4gQmVsbGUgKGluaXRpYWwgY29udHJpYnV0aW9uKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlLmgiCisKK25hbWVzcGFjZSBldFJ1bnRpbWUgeworCitSZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2U6OlJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZShJUlRPYmplY3QqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDoKKwkJUlRPYmplY3QocGFyZW50LCBuYW1lKSwgbV9pdGVtcygpIHsKK30KKworUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlOjp+UmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlKCkgeworCWZvcihzdGQ6OnZlY3RvcjxBY3RvckNsYXNzQmFzZSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0gbV9pdGVtcy5lbmQoKTsgaXQrKykKKwkJZGVsZXRlICppdDsKK30KKwordm9pZCBSZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2U6OmNyZWF0ZVN1YkFjdG9ycyhpbnQgbnVtYmVyKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQlzdGQ6OnN0cmluZ3N0cmVhbSBpdGVtTmFtZTsKKwkJaXRlbU5hbWUgPDwgZ2V0TmFtZSgpIDw8IFNFUCA8PCBpOworCQlBY3RvckNsYXNzQmFzZSogaXRlbSA9IGNyZWF0ZUFjdG9yKGdldFBhcmVudCgpLCBpdGVtTmFtZS5zdHIoKSk7CisJCW1faXRlbXMucHVzaF9iYWNrKGl0ZW0pOworCX0KK30KKwordm9pZCBSZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2U6OmluaXRpYWxpemUoKSB7CisJZm9yKHN0ZDo6dmVjdG9yPEFjdG9yQ2xhc3NCYXNlKj46Oml0ZXJhdG9yIGl0ID0gbV9pdGVtcy5iZWdpbigpOyBpdCAhPSBtX2l0ZW1zLmVuZCgpOyBpdCsrKQorCQkoKml0KS0+aW5pdGlhbGl6ZSgpOworfQorCit2b2lkIFJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZTo6c2V0UHJvYmVzQWN0aXZlKGJvb2wgcmVjdXJzaXZlLCBib29sIGFjdGl2ZSkgeworCWZvcihzdGQ6OnZlY3RvcjxBY3RvckNsYXNzQmFzZSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0gbV9pdGVtcy5lbmQoKTsgaXQrKykKKwkJCSgqaXQpLT5zZXRQcm9iZXNBY3RpdmUocmVjdXJzaXZlLCBhY3RpdmUpOworfQorCit9IC8vIG5hbWVzcGFjZSBldFJ1bnRpbWUKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExZWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgcHJvdG9zIHNvZnR3YXJlIGdtYmggKGh0dHA6Ly93d3cucHJvdG9zLmRlKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ09OVFJJQlVUT1JTOgorICogCQlKYW4gQmVsbGUgKGluaXRpYWwgY29udHJpYnV0aW9uKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNSQ19DT01NT05fTU9ERUxCQVNFX1JFUExJQ0FURURBQ1RPUkNMQVNTQkFTRV9IXworI2RlZmluZSBTUkNfQ09NTU9OX01PREVMQkFTRV9SRVBMSUNBVEVEQUNUT1JDTEFTU0JBU0VfSF8KKworI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvUlRPYmplY3QuaCIKKyNpbmNsdWRlICJjb21tb24vbW9kZWxiYXNlL0FjdG9yQ2xhc3NCYXNlLmgiCisKK25hbWVzcGFjZSBldFJ1bnRpbWUgeworCitjbGFzcyBSZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2UgOiBwdWJsaWMgUlRPYmplY3QgeworCitwdWJsaWM6CisJc3RhdGljIGNvbnN0IGNoYXIgU0VQID0gJzonOworCisJUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisJdmlydHVhbCB+UmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlKHZvaWQpOworCXZvaWQgY3JlYXRlU3ViQWN0b3JzKGludCBudW1iZXIpOworCXZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKKwl2b2lkIHNldFByb2Jlc0FjdGl2ZShib29sIHJlY3Vyc2l2ZSwgYm9vbCBhY3RpdmUpOworCWludCBnZXROU3ViQWN0b3JzKHZvaWQpIHsgcmV0dXJuIG1faXRlbXMuc2l6ZSgpOyB9CisJQWN0b3JDbGFzc0Jhc2UqIGdldFN1YkFjdG9yKGludCBpbmRleCkgeyByZXR1cm4gbV9pdGVtcy5hdChpbmRleCk7IH0KKworcHJvdGVjdGVkOgorCXZpcnR1YWwgQWN0b3JDbGFzc0Jhc2UqIGNyZWF0ZUFjdG9yKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgPSAwOworCitwcml2YXRlOgorCXN0ZDo6dmVjdG9yPEFjdG9yQ2xhc3NCYXNlKj4gbV9pdGVtczsKK307CisKK30gLy8gbmFtZXNwYWNlIGV0IFJ1bnRpbWUKKworI2VuZGlmIC8qIFNSQ19DT01NT05fTU9ERUxCQVNFX1JFUExJQ0FURURBQ1RPUkNMQVNTQkFTRV9IXyAqLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEludGVyZmFjZUl0ZW1CYXNlLmNwcCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZS5jcHAKaW5kZXggOWI3MTZmOS4uNmU1YjUzNiAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEludGVyZmFjZUl0ZW1CYXNlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkSW50ZXJmYWNlSXRlbUJhc2UuY3BwCkBAIC0yNSw3ICsyNSwxMiBAQAogCQltX2xvY2FsSWQobG9jYWxJZCksCiAJCW1faXRlbXMoKSwKIAkJbV9yZWxlYXNlZEluZGljZXMoKSB7Cit9CiAKK1JlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZTo6flJlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZSgpIHsKKwlmb3Ioc3RkOjp2ZWN0b3I8SW50ZXJmYWNlSXRlbUJhc2UqPjo6aXRlcmF0b3IgaXQgPSBtX2l0ZW1zLmJlZ2luKCk7IGl0ICE9IG1faXRlbXMuZW5kKCk7ICsraXQpIHsKKwkJZGVsZXRlICppdDsKKwl9CiB9CiAKIEludGVyZmFjZUl0ZW1CYXNlKiBSZXBsaWNhdGVkSW50ZXJmYWNlSXRlbUJhc2U6OmNyZWF0ZVN1YkludGVyZmFjZUl0ZW0oKSB7CmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkSW50ZXJmYWNlSXRlbUJhc2UuaCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZS5oCmluZGV4IGUxNDYwZDEuLjQ3MzgzODIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZS5oCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZS5oCkBAIC0yOCw3ICsyOCw3IEBACiBwdWJsaWM6CiAJc3RhdGljIGNvbnN0IGNoYXIgU0VQID0gJzonOwogCi0JdmlydHVhbCB+UmVwbGljYXRlZEludGVyZmFjZUl0ZW1CYXNlKCl7fQorCXZpcnR1YWwgflJlcGxpY2F0ZWRJbnRlcmZhY2VJdGVtQmFzZSgpOwogCiAJdmlydHVhbCBJbnRlcmZhY2VJdGVtQmFzZSogY3JlYXRlU3ViSW50ZXJmYWNlSXRlbSgpOwogCXZpcnR1YWwgdm9pZCByZW1vdmVJdGVtKEludGVyZmFjZUl0ZW1CYXNlJiBpdGVtKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5jcHAgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9TdWJTeXN0ZW1DbGFzc0Jhc2UuY3BwCmluZGV4IDg1NGQ2ZWQuLmQ3ZTMzYTAgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5jcHAKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvU3ViU3lzdGVtQ2xhc3NCYXNlLmNwcApAQCAtMzMsNiArMzMsNyBAQAogCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuZ2V0QXN5bmNMb2dnZXIoKS5vcGVuKCk7CiAJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5nZXRTeW5jTG9nZ2VyKCkuc2V0TVNDKG5hbWUgKyAiX1N5bmMiLCAibG9nLyIpOwogCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuZ2V0U3luY0xvZ2dlcigpLm9wZW4oKTsKKwlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmdldFN5bmNMb2dnZXIoKS5zZXRPYmplY3ROYW1lKCJtYWluIik7CiAKIAlSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLnNldFN1YlN5c3RlbSh0aGlzKTsKIH0KQEAgLTQ4LDggKzQ5LDkgQEAKIAkvLyBub3JtYWx5IHRoZSBwb3J0cyB3aWxsIGFkZHJlc3MgdGhlIGNvcnJlY3QgdGFyZ2V0IG1lc3NhZ2Ugc2VydmljZSBkaXJlY3RseQogCS8vIGl0IGlzIGp1c3QgZm9yIHRlc3QgcHVycG9zZXMKIAkvLyBSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5jb25uZWN0QWxsKCk7Ci0KLQlpbnN0YW50aWF0ZUFjdG9ycygpOworCW1hcFRocmVhZHMoKTsKKwlpbml0aWFsaXplKCk7CisJc2V0UHJvYmVzQWN0aXZlKHRydWUsIHRydWUpOwogLy8Jc3RkOjpjb3V0IDw8IHRvU3RyaW5nUmVjdXJzaXZlKCkgPDwgc3RkOjplbmRsOwogCiAJLy8gaW5pdGlhbGl6ZSBhbGwgYWN0b3IgaW5zdGFuY2VzCmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9TdWJTeXN0ZW1DbGFzc0Jhc2UuaCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5oCmluZGV4IGJjODBiZWQuLjExYmQyOGMgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5oCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5oCkBAIC0zMiw3ICszMiw5IEBACiAKIAl2aXJ0dWFsIHZvaWQgaW5pdCgpOwogCXZpcnR1YWwgdm9pZCBpbnN0YW50aWF0ZU1lc3NhZ2VTZXJ2aWNlcygpID0gMDsKLQl2aXJ0dWFsIHZvaWQgaW5zdGFudGlhdGVBY3RvcnMoKSA9IDA7CisJdmlydHVhbCB2b2lkIG1hcFRocmVhZHModm9pZCkgPSAwOworCXZpcnR1YWwgdm9pZCBpbml0aWFsaXplKHZvaWQpID0gMDsKKwl2aXJ0dWFsIHZvaWQgc2V0UHJvYmVzQWN0aXZlKGJvb2wgcmVjdXJzaXZlLCBib29sIGFjdGl2ZSkge30KIAogCXZvaWQgc3RhcnQoKTsKIAl2b2lkIHN0b3AoKTsK