ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Ob2RlR2VuLnh0ZW5kIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4ueHRlbmQKaW5kZXggMjYzNTI1Mi4uN2FjMjA2ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4ueHRlbmQKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC9zcmMvb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4ueHRlbmQKQEAgLTgzLDYgKzgzLDcgQEAKIAogCQmrZ2VuZXJhdGVJbmNsdWRlR3VhcmRCZWdpbihjYywgJycpuwogCisJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL0lNZXNzYWdlU2VydmljZS5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21vZGVsYmFzZS9TdWJTeXN0ZW1DbGFzc0Jhc2UuaCIKIAkJq0ZPUiBhaSA6IGNvbXAuYWN0b3JJbnN0YW5jZXO7CiAJCQkjaW5jbHVkZSAiq2FpLmFjdG9yQ2xhc3MuYWN0b3JJbmNsdWRlUGF0aLsiCkBAIC0xMDAsMTEgKzEwMSwxMCBAQAogCQkJq2NjLnVzZXJDb2RlMi51c2VyQ29kZbsKIAogCQkJcHVibGljOgotCiAJCQkJq0ZPUiB0aHJlYWQgOiB0aHJlYWRzLmluZGV4ZWS7CiAJCQkJCXN0YXRpYyBjb25zdCBpbnQgq3RocmVhZC52YWx1ZS50aHJlYWRJZLs7CiAJCQkJq0VOREZPUrsKLQorCQkJCQogCQkJCS8vIHN1YiBhY3RvcnMKIAkJCQmrRk9SIHN1YiA6IGNjLmFjdG9yUmVmc7sKIAkJCQkJq0lGIHN1Yi5tdWx0aXBsaWNpdHk+MbsKQEAgLTEzMyw2ICsxMzMsMTAgQEAKIAkJCQmrRU5ESUa7CiAKIAkJCXByaXZhdGU6CisJCQkJLy8gTWVzc2FnZVNlcnZpY2VzCisJCQkJq0ZPUiB0aHJlYWQgOiB0aHJlYWRzuworCQkJCQlJTWVzc2FnZVNlcnZpY2UqIG1zZ1N2Y1+rdGhyZWFkLm5hbWW7OworCQkJCatFTkRGT1K7CiAKIAkJCQmrY2xzbmFtZbsoKTsKIAkJCQmrY2xzbmFtZbsoq2Nsc25hbWW7IGNvbnN0Jik7CkBAIC0xNTIsNyArMTU2LDcgQEAKIAlkZWYgcHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QoU3ViU3lzdGVtQ2xhc3MgY2MpIHsKIAkJdmFsIGV4dGVuc2lvbiBpbml0SGVscGVyID0gaW5pdEhlbHBlcgogCQl2YXIgaW5pdExpc3QgPSA8Q2hhclNlcXVlbmNlPm5ld0FycmF5TGlzdAotCisJCQogCQkvLyBzdXBlciBjbGFzcwogCQlpbml0TGlzdCArPSAnJydTdWJTeXN0ZW1DbGFzc0Jhc2UocGFyZW50LCBuYW1lKScnJwogCSAgICAvLyBvd24gc3ViIGFjdG9ycwpAQCAtMTg0LDYgKzE4OCw3IEBACiAJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmgiCiAJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlci5oIgogCQkjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9SVFNlcnZpY2VzLmgiCisJCSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnkuaCIKIAkJI2luY2x1ZGUgImNvbW1vbi9tb2RlbGJhc2UvSW50ZXJmYWNlSXRlbUJhc2UuaCIKIAogCQl1c2luZyBuYW1lc3BhY2UgZXRSdW50aW1lOwpAQCAtMTk2LDYgKzIwMSw5IEBACiAKIAkJq2Nsc25hbWW7OjqrY2xzbmFtZbsoSVJUT2JqZWN0KiBwYXJlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQogCQkJCatjYy5nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3S7CisJCQkJq0ZPUiB0aHJlYWQgOiB0aHJlYWRzuworCQkJCQksIG1zZ1N2Y1+rdGhyZWFkLm5hbWW7KE5VTEwpCisJCQkJq0VOREZPUrsKIAkJewogCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuwogCQkJCU1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgIkNvbnN0cnVjdG9yIik7CkBAIC0yMTEsNiArMjE5LDkgQEAKIAkJCatJRiBNYWluOjpzZXR0aW5ncy5nZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbrsKIAkJCQlNU0NGdW5jdGlvbk9iamVjdCBtc2NGdW5jdGlvbk9iamVjdChnZXRJbnN0YW5jZVBhdGhOYW1lKCksICJEZXN0cnVjdG9yIik7CiAJCQmrRU5ESUa7CisJCQmrRk9SIHRocmVhZCA6IHRocmVhZHO7CisJCQkJZGVsZXRlIG1zZ1N2Y1+rdGhyZWFkLm5hbWW7OworCQkJq0VOREZPUrsKIAkJfQogCiAJCXZvaWQgq2Nsc25hbWW7OjpyZWNlaXZlRXZlbnQoSW50ZXJmYWNlSXRlbUJhc2UqIGlmaXRlbSwgaW50IGV2dCwgdm9pZCogZGF0YSl7CkBAIC0yMjIsMTkgKzIzMywyMCBAQAogCQkJCU1TQ0Z1bmN0aW9uT2JqZWN0IG1zY0Z1bmN0aW9uT2JqZWN0KGdldEluc3RhbmNlUGF0aE5hbWUoKSwgImluc3RhbnRpYXRlTWVzc2FnZVNlcnZpY2VzKCkiKTsKIAkJCatFTkRJRrsKIAotCQkJSU1lc3NhZ2VTZXJ2aWNlKiBtc2dTZXJ2aWNlOworCQkJSU1lc3NhZ2VNZW1vcnkqIG1zZ01lbW9yeTsKIAkJCatGT1IgdGhyZWFkOiB0aHJlYWRzuwogCQkJCXsKKwkJCQkJbXNnTWVtb3J5ID0gbmV3IFN0YXRpY01lc3NhZ2VNZW1vcnkodGhpcywgIk1lc3NhZ2VNZW1vcnlfq3RocmVhZC5uYW1luyIsIKt0aHJlYWQubXNnYmxvY2tzaXpluywgq3RocmVhZC5tc2dwb29sc2l6ZbspOwogCQkJCQmrSUYgdGhyZWFkLmV4ZWNtb2RlPT1FeGVjTW9kZTo6UE9MTEVEIHx8IHRocmVhZC5leGVjbW9kZT09RXhlY01vZGU6Ok1JWEVEuwogCQkJCQkJZXRUaW1lIGludGVydmFsOwogCQkJCQkJaW50ZXJ2YWwuc2VjID0gq1RpbWVDb252ZXJ0ZXI6OnNwbGl0KHRocmVhZC50aW1lLCBUaW1lQ29udmVydGVyLlNFQywgdHJ1ZSm7OwogCQkJCQkJaW50ZXJ2YWwublNlYyA9IKtUaW1lQ29udmVydGVyOjpzcGxpdCh0aHJlYWQudGltZSwgVGltZUNvbnZlcnRlci5NSUxMSV9TRUMsIGZhbHNlKbtMOwotCi0JCQkJCQltc2dTZXJ2aWNlID0gbmV3IE1lc3NhZ2VTZXJ2aWNlKHRoaXMsIElNZXNzYWdlU2VydmljZTo6q3RocmVhZC5leGVjbW9kZS5nZXROYW1luywgaW50ZXJ2YWwsIDAsIKt0aHJlYWQudGhyZWFkSWS7LCAiTWVzc2FnZVNlcnZpY2Vfq3RocmVhZC5uYW1luyIsIKt0aHJlYWQucHJpb7spOworCQkJCQkJCisJCQkJCQltc2dTdmNfq3RocmVhZC5uYW1luyA9IG5ldyBNZXNzYWdlU2VydmljZSh0aGlzLCBJTWVzc2FnZVNlcnZpY2U6Oqt0aHJlYWQuZXhlY21vZGUuZ2V0TmFtZbssIGludGVydmFsLCAwLCCrdGhyZWFkLnRocmVhZElkuywgIk1lc3NhZ2VTZXJ2aWNlX6t0aHJlYWQubmFtZbsiLCBtc2dNZW1vcnksIKt0aHJlYWQucHJpb7spOwogCQkJCQmrRUxTRbsKLQkJCQkJCW1zZ1NlcnZpY2UgPSBuZXcgTWVzc2FnZVNlcnZpY2UodGhpcywgSU1lc3NhZ2VTZXJ2aWNlOjqrdGhyZWFkLmV4ZWNtb2RlLmdldE5hbWW7LCAwLCCrdGhyZWFkLnRocmVhZElkuywgIk1lc3NhZ2VTZXJ2aWNlX6t0aHJlYWQubmFtZbsiLCCrdGhyZWFkLnByaW+7KTsKKwkJCQkJCW1zZ1N2Y1+rdGhyZWFkLm5hbWW7ID0gbmV3IE1lc3NhZ2VTZXJ2aWNlKHRoaXMsIElNZXNzYWdlU2VydmljZTo6q3RocmVhZC5leGVjbW9kZS5nZXROYW1luywgMCwgq3RocmVhZC50aHJlYWRJZLssICJNZXNzYWdlU2VydmljZV+rdGhyZWFkLm5hbWW7IiwgbXNnTWVtb3J5LCCrdGhyZWFkLnByaW+7KTsKIAkJCQkJq0VORElGuwotCQkJCQlSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5hZGRNc2dTdmMoKm1zZ1NlcnZpY2UpOworCQkJCQlSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5hZGRNc2dTdmMoKm1zZ1N2Y1+rdGhyZWFkLm5hbWW7KTsKIAkJCQl9CiAJCQmrRU5ERk9SuwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3NyYy9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vUHJvdG9jb2xDbGFzc0dlbi54dGVuZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLnh0ZW5kCmluZGV4IGI1ODhlMjcuLjM5YTk5N2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLnh0ZW5kCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAvc3JjL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLnh0ZW5kCkBAIC0xNTEsNyArMTUxLDggQEAKIAogCQkgLy8gc2VudCBtZXNzYWdlcwogCQmrRk9SIG0gOiBwYy5nZXRBbGxNZXNzYWdlcyhjb25qKbsKLQkJICAJq21lc3NhZ2VTaWduYXR1cmUobSm7OworCQkgIAmrbWVzc2FnZVNpZ25hdHVyZShtLCBmYWxzZSm7OworCQkgIAmrbWVzc2FnZVNpZ25hdHVyZShtLCB0cnVlKbs7CiAJCatFTkRGT1K7CiAJfTsKIApAQCAtMTcwLDEyICsxNzEsMTIgQEAKIAkJCatJRiBjb25quwogCQkJCS8vIGluY29taW5nIG1lc3NhZ2VzCiAJCQkJq0ZPUiBtIDogcGMuZ2V0QWxsSW5jb21pbmdNZXNzYWdlcygpuwotCQkJCQmrbWVzc2FnZVNpZ25hdHVyZShtKbs7CisJCQkJCattZXNzYWdlU2lnbmF0dXJlKG0sIGZhbHNlKbs7CiAJCQkJq0VOREZPUrsKIAkJCatFTFNFuwogCQkJCS8vIG91dGdvaW5nIG1lc3NhZ2VzCiAJCQkJq0ZPUiBtIDogcGMuZ2V0QWxsT3V0Z29pbmdNZXNzYWdlcygpuwotCQkJCQmrbWVzc2FnZVNpZ25hdHVyZShtKbs7CisJCQkJCattZXNzYWdlU2lnbmF0dXJlKG0sIGZhbHNlKbs7CiAJCQkJq0VOREZPUrsKIAkJCatFTkRJRrsKIApAQCAtMzEyLDE4ICszMTMsMTggQEAKIAmrSUYgY29uarsKIAkJLy8gaW5jb21pbmcgbWVzc2FnZXMKIAkJq0ZPUiBtIDogcGMuZ2V0QWxsSW5jb21pbmdNZXNzYWdlcygpuwotCQkJq21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG0sIHJlcGxQb3J0Q2xhc3NOYW1lKbt7CisJCQmrbWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24obSwgcmVwbFBvcnRDbGFzc05hbWUsIGZhbHNlKbt7CiAJCQkJZm9yIChzdGQ6OnZlY3RvcjxldFJ1bnRpbWU6OkludGVyZmFjZUl0ZW1CYXNlKj46Oml0ZXJhdG9yIGl0ID0gZ2V0SXRlbXMoKS5iZWdpbigpOyBpdCAhPSBnZXRJdGVtcygpLmVuZCgpOyArK2l0KSB7Ci0JCQkJCShkeW5hbWljX2Nhc3Q8q3BvcnRDbGFzc05hbWW7Kj4oKml0KSktPqttZXNzYWdlQ2FsbChtKbs7CisJCQkJCShkeW5hbWljX2Nhc3Q8q3BvcnRDbGFzc05hbWW7Kj4oKml0KSktPqttZXNzYWdlQ2FsbChtLCBmYWxzZSm7OwogCQkJCX0KIAkJCX0KIAkJq0VOREZPUrsKIAmrRUxTRbsKIAkJLy8gb3V0Z29pbmcgbWVzc2FnZXMKIAkJq0ZPUiBtIDogcGMuZ2V0QWxsT3V0Z29pbmdNZXNzYWdlcygpuwotCQkJq21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG0sIHJlcGxQb3J0Q2xhc3NOYW1lKbt7CisJCQmrbWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24obSwgcmVwbFBvcnRDbGFzc05hbWUsIGZhbHNlKbt7CiAJCQkJZm9yIChzdGQ6OnZlY3RvcjxldFJ1bnRpbWU6OkludGVyZmFjZUl0ZW1CYXNlKj46Oml0ZXJhdG9yIGl0ID0gZ2V0SXRlbXMoKS5iZWdpbigpOyBpdCAhPSBnZXRJdGVtcygpLmVuZCgpOyArK2l0KSB7Ci0JCQkJCShkeW5hbWljX2Nhc3Q8q3BvcnRDbGFzc05hbWW7Kj4oKml0KSktPqttZXNzYWdlQ2FsbChtKbs7CisJCQkJCShkeW5hbWljX2Nhc3Q8q3BvcnRDbGFzc05hbWW7Kj4oKml0KSktPqttZXNzYWdlQ2FsbChtLCBmYWxzZSm7OwogCQkJCX0KIAkJCX0KIAkJq0VOREZPUrsKQEAgLTM0MiwzOCArMzQzLDQ4IEBACiAJCWluaXRMaXN0LmdlbmVyYXRlQ3RvckluaXRpYWxpemVyTGlzdAogCX0KIAotCWRlZiBwcm90ZWN0ZWQgbWVzc2FnZUNhbGwoTWVzc2FnZSBtKSB7Ci0JCScnJ6ttLm5hbWW7KKtJRiBtLmRhdGEhPW51bGy7IKttLmRhdGEubmFtZburRU5ESUa7KScnJworCWRlZiBwcm90ZWN0ZWQgbWVzc2FnZUNhbGwoTWVzc2FnZSBtLCBib29sZWFuIGltcGwpIHsKKwkJJycnq20ubmFtZburSUYgaW1wbLtfaW1wbKtFTkRJRrsoq0lGIG0uZGF0YSE9bnVsbLsgq20uZGF0YS5uYW1lu6tFTkRJRrspJycnCiAJfQogCiAKLQlkZWYgcHJvdGVjdGVkIG1lc3NhZ2VTaWduYXR1cmUoTWVzc2FnZSBtKSB7Ci0JCScnJ6tJRiBtLnByaXa7cHJpdmF0ZTqrRUxTRbtwdWJsaWM6q0VORElGuyB2b2lkIKttLm5hbWW7KKtJRiBtLmRhdGEhPW51bGy7q20uZGF0YS5yZWZUeXBlLnNpZ25hdHVyZVN0cmluZ7sgq20uZGF0YS5uYW1lu6tFTkRJRrspJycnCisJZGVmIHByb3RlY3RlZCBtZXNzYWdlU2lnbmF0dXJlKE1lc3NhZ2UgbSwgYm9vbGVhbiBpbXBsKSB7CisJCScnJ6tJRiBtLnByaXZ8fGltcGy7cHJpdmF0ZTqrRUxTRbtwdWJsaWM6q0VORElGuyB2b2lkIKttLm5hbWW7q0lGIGltcGy7X2ltcGyrRU5ESUa7KKtJRiBtLmRhdGEhPW51bGy7q20uZGF0YS5yZWZUeXBlLnNpZ25hdHVyZVN0cmluZ7sgq20uZGF0YS5uYW1lu6tFTkRJRrspJycnCiAJfQogCi0JZGVmIHByb3RlY3RlZCBtZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihNZXNzYWdlIG0sIFN0cmluZyBjbGFzc1ByZWZpeCkgewotCQknJyd2b2lkIKtjbGFzc1ByZWZpeLs6OqttLm5hbWW7KKtJRiBtLmRhdGEhPW51bGy7q20uZGF0YS5yZWZUeXBlLnNpZ25hdHVyZVN0cmluZ7sgq20uZGF0YS5uYW1lu6tFTkRJRrspJycnCisJZGVmIHByb3RlY3RlZCBtZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihNZXNzYWdlIG0sIFN0cmluZyBjbGFzc1ByZWZpeCwgYm9vbGVhbiBpbXBsKSB7CisJCScnJ3ZvaWQgq2NsYXNzUHJlZml4uzo6q20ubmFtZburSUYgaW1wbLtfaW1wbKtFTkRJRrsoq0lGIG0uZGF0YSE9bnVsbLurbS5kYXRhLnJlZlR5cGUuc2lnbmF0dXJlU3RyaW5nuyCrbS5kYXRhLm5hbWW7q0VORElGuyknJycKIAl9CiAKIAlkZWYgcHJvdGVjdGVkIHNlbmRNZXNzYWdlKE1lc3NhZ2UgbSwgU3RyaW5nIHBvcnRDbGFzc05hbWUsIFN0cmluZyBjbGFzc1ByZWZpeCwgYm9vbGVhbiBjb25qKSB7CiAJCXZhciBkaXIgPSBpZiAoY29uaikgIklOIiBlbHNlICJPVVQiCiAJCXZhciBoZGxyID0gbS5nZXRTZW5kSGFuZGxlcihjb25qKQotCQl2YWwgZGF0YUFyZyA9IGlmKG0uZGF0YSAhPSBudWxsKSAnJycsIKtJRiBtLmRhdGEucmVmVHlwZS5yZWa7q20uZGF0YS5uYW1lu6tFTFNFuyarbS5kYXRhLm5hbWW7LCBzaXplb2Yoq20uZGF0YS5yZWZUeXBlLnR5cGUudHlwZU5hbWW7KatFTkRJRrsnJycKLQkJdmFsIG1lc3NhZ2UgPSAnJyduZXcgTWVzc2FnZShnZXRQZWVyQWRkcmVzcygpLCCrcG9ydENsYXNzTmFtZbs6OqtkaXK7X6ttLm5hbWW7q2RhdGFBcmc/OicnuyknJycKKwkJdmFsIGRhdGFBcmcgPSBpZihtLmRhdGEgIT0gbnVsbCkgJycnLCCrbS5kYXRhLm5hbWW7JycnCisJCXZhbCBtZXNzYWdlVHlwZSA9IGlmKG0uZGF0YSAhPSBudWxsICYmICFtLmRhdGEucmVmVHlwZS5yZWYpICcnJ0RhdGFNZXNzYWdlPKttLmRhdGEucmVmVHlwZS50eXBlLnR5cGVOYW1luz4nJycgZWxzZSAnJydNZXNzYWdlJycnCisJCXZhbCBtZXNzYWdlID0gJycnbmV3IChidWZmZXIpIKttZXNzYWdlVHlwZbsoZ2V0UGVlckFkZHJlc3MoKSwgq3BvcnRDbGFzc05hbWW7OjqrZGlyu1+rbS5uYW1lu6tkYXRhQXJnPzonJ7spJycnCiAJCScnJwotCQkJq21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG0sIGNsYXNzUHJlZml4KbsgeworCQkJq21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG0sIGNsYXNzUHJlZml4LCBmYWxzZSm7IHsKIAkJCQmrSUYgaGRsciE9bnVsbLsKIAkJCQkJq0ZPUiBjb21tYW5kIDogaGRsci5kZXRhaWxDb2RlLmxpbmVzuwmrY29tbWFuZLsKIAkJCQkJq0VOREZPUrsKIAkJCQmrRUxTRbsKLQkJCQkJq0lGIE1haW46OnNldHRpbmdzLmdlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uuwotCQkJCQkJRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQXN5bmNPdXQoZ2V0QWRkcmVzcygpLCBnZXRQZWVyQWRkcmVzcygpLAotCQkJCQkJCatwb3J0Q2xhc3NOYW1luzo6Z2V0TWVzc2FnZVN0cmluZyircG9ydENsYXNzTmFtZbs6OqtkaXK7X6ttLm5hbWW7KSk7Ci0JCQkJCatFTkRJRrsKLQkJCQkJaWYgKGdldFBlZXJBZGRyZXNzKCkuaXNWYWxpZCgpKXsKKwkJCQkJq21lc3NhZ2VDYWxsKG0sIHRydWUpuzsKKwkJCQmrRU5ESUa7CisJCQl9CisJCQkKKwkJCattZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihtLCBjbGFzc1ByZWZpeCwgdHJ1ZSm7IHsKKwkJCQmrSUYgTWFpbjo6c2V0dGluZ3MuZ2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb267CisJCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFzeW5jT3V0KGdldEFkZHJlc3MoKSwgZ2V0UGVlckFkZHJlc3MoKSwKKwkJCQkJq3BvcnRDbGFzc05hbWW7OjpnZXRNZXNzYWdlU3RyaW5nKKtwb3J0Q2xhc3NOYW1luzo6q2Rpcrtfq20ubmFtZbspKTsKKwkJCQmrRU5ESUa7CisJCQkJaWYgKGdldFBlZXJBZGRyZXNzKCkuaXNWYWxpZCgpKSB7Ciurq6sJCQkJCXdlIGhhdmUgdG8gdXNlIGEgZHluYW1pYyBjYXN0IGhlcmUgYmVjYXVzZSB3ZSBoYXZlIGEgdmlydHVhbCBiYXNlIGNsYXNzCisJCQkJCU1lc3NhZ2UqIGJ1ZmZlciA9IGR5bmFtaWNfY2FzdDxJTWVzc2FnZVNlcnZpY2UqPihnZXRQZWVyTXNnUmVjZWl2ZXIoKSktPmdldE1lc3NhZ2VCdWZmZXIoc2l6ZW9mKKttZXNzYWdlVHlwZbspKTsKKwkJCQkJaWYgKGJ1ZmZlcikgewogCQkJCQkJZ2V0UGVlck1zZ1JlY2VpdmVyKCktPnJlY2VpdmUoq21lc3NhZ2W7KTsKIAkJCQkJfQotCQkJCatFTkRJRrsKK6urqwkJCQkJLy8gVE9ETyBKQjogSGFuZGxlIGJ1ZmZlciA9PSBOVUxMCisJCQkJfQogCQkJfQogCQknJycKIAl9CkBAIC0zODEsNyArMzkyLDYgQEAKIAogCWRlZiBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhRHJpdmVuSGVhZGVyRmlsZShSb290IHJvb3QsIFByb3RvY29sQ2xhc3MgcGMpIHsKIAkJdmFsIHNlbnRNc2dzID0gcGMuYWxsSW5jb21pbmdNZXNzYWdlcy5maWx0ZXIobXxtLmRhdGEhPW51bGwpCi0JCXZhbCBtb2RlbHMgPSByb290LmdldFJlZmVyZW5jZWRNb2RlbHMocGMpCiAJCScnJwogCQkJLyoqCiAJCQkgKiBAYXV0aG9yIGdlbmVyYXRlZCBieSBlVHJpY2UKQEAgLTQ1Nyw3ICs0NjcsNiBAQAogCiAJZGVmIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFEcml2ZW5Tb3VyY2VGaWxlKFJvb3Qgcm9vdCwgUHJvdG9jb2xDbGFzcyBwYykgewogCQl2YWwgc2VudE1zZ3MgPSBwYy5hbGxJbmNvbWluZ01lc3NhZ2VzLmZpbHRlcihtfG0uZGF0YSE9bnVsbCkKLQkJdmFsIG1vZGVscyA9IHJvb3QuZ2V0UmVmZXJlbmNlZE1vZGVscyhwYykKIAkJJycnCiAJCQkvKioKIAkJCSAqIEBhdXRob3IgZ2VuZXJhdGVkIGJ5IGVUcmljZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Ob2RlR2VuLmphdmEKaW5kZXggY2EyOTQwNy4uZjkzZjFmOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL05vZGVHZW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vTm9kZUdlbi5qYXZhCkBAIC0xNjUsNiArMTY1LDggQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZChfZ2VuZXJhdGVJbmNsdWRlR3VhcmRCZWdpbiwgIiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbWVzc2FnaW5nL0lNZXNzYWdlU2VydmljZS5oXCIiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbW9kZWxiYXNlL1N1YlN5c3RlbUNsYXNzQmFzZS5oXCIiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIHsKQEAgLTIwMiw3ICsyMDQsNiBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJwdWJsaWM6Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7Ci0gICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICB7CiAgICAgICAgIEl0ZXJhYmxlPEluZGV4ZWQ8UGh5c2ljYWxUaHJlYWQ+PiBfaW5kZXhlZCA9IEluZGV4ZWQuPFBoeXNpY2FsVGhyZWFkPmluZGV4ZWQodGhyZWFkcyk7CiAgICAgICAgIGZvcihmaW5hbCBJbmRleGVkPFBoeXNpY2FsVGhyZWFkPiB0aHJlYWQgOiBfaW5kZXhlZCkgewpAQCAtMjE1LDYgKzIxNiw3IEBACiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gc3ViIGFjdG9ycyIpOwpAQCAtMzAzLDYgKzMwNSwxOSBAQAogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJwcml2YXRlOiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIE1lc3NhZ2VTZXJ2aWNlcyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgeworICAgICAgICBmb3IoZmluYWwgUGh5c2ljYWxUaHJlYWQgdGhyZWFkXzEgOiB0aHJlYWRzKSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJJTWVzc2FnZVNlcnZpY2UqIG1zZ1N2Y18iKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfMiA9IHRocmVhZF8xLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMiwgIlx0XHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIjsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZChjbHNuYW1lLCAiXHRcdCIpOwpAQCAtNDI1LDYgKzQ0MCw4IEBACiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIiNpbmNsdWRlIFwiY29tbW9uL21lc3NhZ2luZy9SVFNlcnZpY2VzLmhcIiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIjaW5jbHVkZSBcImNvbW1vbi9tZXNzYWdpbmcvU3RhdGljTWVzc2FnZU1lbW9yeS5oXCIiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiI2luY2x1ZGUgXCJjb21tb24vbW9kZWxiYXNlL0ludGVyZmFjZUl0ZW1CYXNlLmhcIiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwpAQCAtNDYxLDYgKzQ3OCwxNiBAQAogICAgICAgQ2hhclNlcXVlbmNlIF9nZW5lcmF0ZUNvbnN0cnVjdG9ySW5pdGFsaXplckxpc3QgPSB0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JJbml0YWxpemVyTGlzdChjYyk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoX2dlbmVyYXRlQ29uc3RydWN0b3JJbml0YWxpemVyTGlzdCwgIlx0XHQiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICB7CisgICAgICAgIGZvcihmaW5hbCBQaHlzaWNhbFRocmVhZCB0aHJlYWRfMSA6IHRocmVhZHMpIHsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiwgbXNnU3ZjXyIpOworICAgICAgICAgIFN0cmluZyBfbmFtZSA9IHRocmVhZF8xLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUsICJcdFx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIoTlVMTCkiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgICBfYnVpbGRlci5hcHBlbmQoInsiKTsKICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIHsKQEAgLTQ4MCw4ICs1MDcsOCBAQAogICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW4gPSAoX211bHRpcGxpY2l0eSA+IDEpOwogICAgICAgICAgICAgaWYgKF9ncmVhdGVyVGhhbikgewogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZSA9IHN1Yi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIlx0Iik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xID0gc3ViLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEsICJcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5jcmVhdGVTdWJBY3RvcnMoIik7CiAgICAgICAgICAgICAgIGludCBfbXVsdGlwbGljaXR5XzEgPSBzdWIuZ2V0TXVsdGlwbGljaXR5KCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbXVsdGlwbGljaXR5XzEsICJcdCIpOwpAQCAtNTA4LDYgKzUzNSwxNiBAQAogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgeworICAgICAgICBmb3IoZmluYWwgUGh5c2ljYWxUaHJlYWQgdGhyZWFkXzIgOiB0aHJlYWRzKSB7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZGVsZXRlIG1zZ1N2Y18iKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfMiA9IHRocmVhZF8yLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMiwgIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC01MzQsMTUgKzU3MSwyOCBAQAogICAgICAgfQogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgX2J1aWxkZXIuYXBwZW5kKCJJTWVzc2FnZVNlcnZpY2UqIG1zZ1NlcnZpY2U7Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIklNZXNzYWdlTWVtb3J5KiBtc2dNZW1vcnk7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICB7Ci0gICAgICAgIGZvcihmaW5hbCBQaHlzaWNhbFRocmVhZCB0aHJlYWRfMSA6IHRocmVhZHMpIHsKKyAgICAgICAgZm9yKGZpbmFsIFBoeXNpY2FsVGhyZWFkIHRocmVhZF8zIDogdGhyZWFkcykgewogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInsiKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIm1zZ01lbW9yeSA9IG5ldyBTdGF0aWNNZXNzYWdlTWVtb3J5KHRoaXMsIFwiTWVzc2FnZU1lbW9yeV8iKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfMyA9IHRocmVhZF8zLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMywgIlx0XHQiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiLCAiKTsKKyAgICAgICAgICBpbnQgX21zZ2Jsb2Nrc2l6ZSA9IHRocmVhZF8zLmdldE1zZ2Jsb2Nrc2l6ZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbXNnYmxvY2tzaXplLCAiXHRcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICBpbnQgX21zZ3Bvb2xzaXplID0gdGhyZWFkXzMuZ2V0TXNncG9vbHNpemUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX21zZ3Bvb2xzaXplLCAiXHRcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoT2JqZWN0cy5lcXVhbCh0aHJlYWRfMS5nZXRFeGVjbW9kZSgpLCBFeGVjTW9kZS5QT0xMRUQpIHx8IE9iamVjdHMuZXF1YWwodGhyZWFkXzEuZ2V0RXhlY21vZGUoKSwgRXhlY01vZGUuTUlYRUQpKSkgeworICAgICAgICAgICAgaWYgKChPYmplY3RzLmVxdWFsKHRocmVhZF8zLmdldEV4ZWNtb2RlKCksIEV4ZWNNb2RlLlBPTExFRCkgfHwgT2JqZWN0cy5lcXVhbCh0aHJlYWRfMy5nZXRFeGVjbW9kZSgpLCBFeGVjTW9kZS5NSVhFRCkpKSB7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImV0VGltZSBpbnRlcnZhbDsiKTsKQEAgLTU1MCw3ICs2MDAsNyBAQAogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpbnRlcnZhbC5zZWMgPSAiKTsKLSAgICAgICAgICAgICAgbG9uZyBfdGltZSA9IHRocmVhZF8xLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgbG9uZyBfdGltZSA9IHRocmVhZF8zLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgbG9uZyBfc3BsaXQgPSBUaW1lQ29udmVydGVyLnNwbGl0KF90aW1lLCBUaW1lQ29udmVydGVyLlNFQywgdHJ1ZSk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc3BsaXQsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOwpAQCAtNTU4LDQ0ICs2MDgsNTIgQEAKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaW50ZXJ2YWwublNlYyA9ICIpOwotICAgICAgICAgICAgICBsb25nIF90aW1lXzEgPSB0aHJlYWRfMS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgIGxvbmcgX3RpbWVfMSA9IHRocmVhZF8zLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgbG9uZyBfc3BsaXRfMSA9IFRpbWVDb252ZXJ0ZXIuc3BsaXQoX3RpbWVfMSwgVGltZUNvbnZlcnRlci5NSUxMSV9TRUMsIGZhbHNlKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zcGxpdF8xLCAiXHRcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkw7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIm1zZ1NlcnZpY2UgPSBuZXcgTWVzc2FnZVNlcnZpY2UodGhpcywgSU1lc3NhZ2VTZXJ2aWNlOjoiKTsKLSAgICAgICAgICAgICAgRXhlY01vZGUgX2V4ZWNtb2RlID0gdGhyZWFkXzEuZ2V0RXhlY21vZGUoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBfZXhlY21vZGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJtc2dTdmNfIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV80ID0gdGhyZWFkXzMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNCwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgPSBuZXcgTWVzc2FnZVNlcnZpY2UodGhpcywgSU1lc3NhZ2VTZXJ2aWNlOjoiKTsKKyAgICAgICAgICAgICAgRXhlY01vZGUgX2V4ZWNtb2RlID0gdGhyZWFkXzMuZ2V0RXhlY21vZGUoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzUgPSBfZXhlY21vZGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNSwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIsIGludGVydmFsLCAwLCAiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF90aHJlYWRJZF8xID0gdGhpcy5nZXRUaHJlYWRJZCh0aHJlYWRfMSk7CisgICAgICAgICAgICAgIFN0cmluZyBfdGhyZWFkSWRfMSA9IHRoaXMuZ2V0VGhyZWFkSWQodGhyZWFkXzMpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3RocmVhZElkXzEsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCBcIk1lc3NhZ2VTZXJ2aWNlXyIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMiA9IHRocmVhZF8xLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIsICJcdFx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsICIpOwotICAgICAgICAgICAgICBsb25nIF9wcmlvID0gdGhyZWFkXzEuZ2V0UHJpbygpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNiA9IHRocmVhZF8zLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzYsICJcdFx0Iik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsIG1zZ01lbW9yeSwgIik7CisgICAgICAgICAgICAgIGxvbmcgX3ByaW8gPSB0aHJlYWRfMy5nZXRQcmlvKCk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfcHJpbywgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpOyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgibXNnU2VydmljZSA9IG5ldyBNZXNzYWdlU2VydmljZSh0aGlzLCBJTWVzc2FnZVNlcnZpY2U6OiIpOwotICAgICAgICAgICAgICBFeGVjTW9kZSBfZXhlY21vZGVfMSA9IHRocmVhZF8xLmdldEV4ZWNtb2RlKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8zID0gX2V4ZWNtb2RlXzEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMywgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJtc2dTdmNfIik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV83ID0gdGhyZWFkXzMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNywgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgPSBuZXcgTWVzc2FnZVNlcnZpY2UodGhpcywgSU1lc3NhZ2VTZXJ2aWNlOjoiKTsKKyAgICAgICAgICAgICAgRXhlY01vZGUgX2V4ZWNtb2RlXzEgPSB0aHJlYWRfMy5nZXRFeGVjbW9kZSgpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfOCA9IF9leGVjbW9kZV8xLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzgsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCAwLCAiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF90aHJlYWRJZF8yID0gdGhpcy5nZXRUaHJlYWRJZCh0aHJlYWRfMSk7CisgICAgICAgICAgICAgIFN0cmluZyBfdGhyZWFkSWRfMiA9IHRoaXMuZ2V0VGhyZWFkSWQodGhyZWFkXzMpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3RocmVhZElkXzIsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLCBcIk1lc3NhZ2VTZXJ2aWNlXyIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfNCA9IHRocmVhZF8xLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzQsICJcdFx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsICIpOwotICAgICAgICAgICAgICBsb25nIF9wcmlvXzEgPSB0aHJlYWRfMS5nZXRQcmlvKCk7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV85ID0gdGhyZWFkXzMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfOSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiwgbXNnTWVtb3J5LCAiKTsKKyAgICAgICAgICAgICAgbG9uZyBfcHJpb18xID0gdGhyZWFkXzMuZ2V0UHJpbygpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3ByaW9fMSwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIpOyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwpAQCAtNjAzLDggKzY2MSwxMSBAQAogICAgICAgICAgIH0KICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiUlRTZXJ2aWNlczo6Z2V0SW5zdGFuY2UoKS5nZXRNc2dTdmNDdHJsKCkuYWRkTXNnU3ZjKCptc2dTZXJ2aWNlKTsiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKS5hZGRNc2dTdmMoKm1zZ1N2Y18iKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfMTAgPSB0aHJlYWRfMy5nZXROYW1lKCk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEwLCAiXHRcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC02NzYsOCArNzM3LDggQEAKICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGVidWdnaW5nU2VydmljZTo6Z2V0SW5zdGFuY2UoKS5hZGRNZXNzYWdlQWN0b3JDcmVhdGUoKnRoaXMsICIpOwotICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzUgPSBzdWJfMS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNSwgIlx0XHQiKTsKKyAgICAgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xMSA9IHN1Yl8xLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xMSwgIlx0XHQiKTsKICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLmdldFN1YkFjdG9yKGkpLT5nZXROYW1lKCkpOyIpOwogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKICAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKQEAgLTY4Niw4ICs3NDcsOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFjdG9yQ3JlYXRlKCp0aGlzLCBcIiIpOwotICAgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzYgPSBzdWJfMS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNiwgIlx0Iik7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMTIgPSBzdWJfMS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMTIsICJcdCIpOwogICAgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIik7Iik7CiAgICAgICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTczNCw4ICs3OTUsOCBAQAogICAgICAgICBFTGlzdDxBY3RvclJlZj4gX2FjdG9yUmVmc18yID0gY2MuZ2V0QWN0b3JSZWZzKCk7CiAgICAgICAgIGZvcihmaW5hbCBBY3RvclJlZiBzdWJfMiA6IF9hY3RvclJlZnNfMikgewogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICBTdHJpbmcgX25hbWVfNyA9IHN1Yl8yLmdldE5hbWUoKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfNywgIlx0Iik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzEzID0gc3ViXzIuZ2V0TmFtZSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xMywgIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuaW5pdGlhbGl6ZSgpOyIpOwogICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgIH0KQEAgLTc2NCw4ICs4MjUsOCBAQAogICAgICAgICAgICAgRUxpc3Q8QWN0b3JSZWY+IF9hY3RvclJlZnNfMyA9IGNjLmdldEFjdG9yUmVmcygpOwogICAgICAgICAgICAgZm9yKGZpbmFsIEFjdG9yUmVmIHN1Yl8zIDogX2FjdG9yUmVmc18zKSB7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOwotICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfOCA9IHN1Yl8zLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzgsICJcdFx0Iik7CisgICAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xNCA9IHN1Yl8zLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzE0LCAiXHRcdCIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi5zZXRQcm9iZXNBY3RpdmUocmVjdXJzaXZlLCBhY3RpdmUpOyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jcHAveHRlbmQtZ2VuL29yZy9lY2xpcHNlL2V0cmljZS9nZW5lcmF0b3IvY3BwL2dlbi9Qcm90b2NvbENsYXNzR2VuLmphdmEKaW5kZXggZDUwYzUyZC4uM2RhNjQyOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNwcC94dGVuZC1nZW4vb3JnL2VjbGlwc2UvZXRyaWNlL2dlbmVyYXRvci9jcHAvZ2VuL1Byb3RvY29sQ2xhc3NHZW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY3BwL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9ldHJpY2UvZ2VuZXJhdG9yL2NwcC9nZW4vUHJvdG9jb2xDbGFzc0dlbi5qYXZhCkBAIC0zMiw3ICszMiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUucm9vbS5Qb3J0T3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUHJvdG9jb2xDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5yb29tLlJlZmFibGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uUm9vbU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU0FQOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uU1BQOwogaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLnJvb20uVmFyRGVjbDsKQEAgLTM4MiwxMCArMzgxLDE1IEBACiAgICAgICAgIExpc3Q8TWVzc2FnZT4gX2FsbE1lc3NhZ2VzID0gdGhpcy5fcm9vbUhlbHBlcnMuZ2V0QWxsTWVzc2FnZXMocGMsIGNvbmopOwogICAgICAgICBmb3IoZmluYWwgTWVzc2FnZSBtIDogX2FsbE1lc3NhZ2VzKSB7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZVNpZ25hdHVyZSA9IHRoaXMubWVzc2FnZVNpZ25hdHVyZShtKTsKKyAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VTaWduYXR1cmUgPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmUobSwgZmFsc2UpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbWVzc2FnZVNpZ25hdHVyZSwgIlx0Iik7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgQ2hhclNlcXVlbmNlIF9tZXNzYWdlU2lnbmF0dXJlXzEgPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmUobSwgdHJ1ZSk7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tZXNzYWdlU2lnbmF0dXJlXzEsICJcdCIpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIF9idWlsZGVyLmFwcGVuZCgifTsiKTsKQEAgLTQzOCw4ICs0NDIsOCBAQAogICAgICAgICAgICAgTGlzdDxNZXNzYWdlPiBfYWxsSW5jb21pbmdNZXNzYWdlcyA9IHRoaXMuX3Jvb21IZWxwZXJzLmdldEFsbEluY29taW5nTWVzc2FnZXMocGMpOwogICAgICAgICAgICAgZm9yKGZpbmFsIE1lc3NhZ2UgbV8xIDogX2FsbEluY29taW5nTWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7Ci0gICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZVNpZ25hdHVyZV8xID0gdGhpcy5tZXNzYWdlU2lnbmF0dXJlKG1fMSk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbWVzc2FnZVNpZ25hdHVyZV8xLCAiXHRcdCIpOworICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VTaWduYXR1cmVfMiA9IHRoaXMubWVzc2FnZVNpZ25hdHVyZShtXzEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tZXNzYWdlU2lnbmF0dXJlXzIsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgfQpAQCAtNDUyLDggKzQ1Niw4IEBACiAgICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IF9hbGxPdXRnb2luZ01lc3NhZ2VzID0gdGhpcy5fcm9vbUhlbHBlcnMuZ2V0QWxsT3V0Z29pbmdNZXNzYWdlcyhwYyk7CiAgICAgICAgICAgICBmb3IoZmluYWwgTWVzc2FnZSBtXzIgOiBfYWxsT3V0Z29pbmdNZXNzYWdlcykgewogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKLSAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIF9tZXNzYWdlU2lnbmF0dXJlXzIgPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmUobV8yKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tZXNzYWdlU2lnbmF0dXJlXzIsICJcdFx0Iik7CisgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZVNpZ25hdHVyZV8zID0gdGhpcy5tZXNzYWdlU2lnbmF0dXJlKG1fMiwgZmFsc2UpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX21lc3NhZ2VTaWduYXR1cmVfMywgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgICAgICB9CkBAIC04NTQsNyArODU4LDcgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IF9hbGxJbmNvbWluZ01lc3NhZ2VzID0gdGhpcy5fcm9vbUhlbHBlcnMuZ2V0QWxsSW5jb21pbmdNZXNzYWdlcyhwYyk7CiAgICAgICAgICAgICBmb3IoZmluYWwgTWVzc2FnZSBtXzEgOiBfYWxsSW5jb21pbmdNZXNzYWdlcykgewotICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uID0gdGhpcy5tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihtXzEsIHJlcGxQb3J0Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIF9tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbiA9IHRoaXMubWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24obV8xLCByZXBsUG9ydENsYXNzTmFtZSwgZmFsc2UpOwogICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uLCAiIik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgieyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwpAQCAtODY1LDcgKzg2OSw3IEBACiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKGR5bmFtaWNfY2FzdDwiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKHBvcnRDbGFzc05hbWUsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKj4oKml0KSktPiIpOwotICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VDYWxsID0gdGhpcy5tZXNzYWdlQ2FsbChtXzEpOworICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VDYWxsID0gdGhpcy5tZXNzYWdlQ2FsbChtXzEsIGZhbHNlKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tZXNzYWdlQ2FsbCwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CkBAIC04ODIsNyArODg2LDcgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IF9hbGxPdXRnb2luZ01lc3NhZ2VzID0gdGhpcy5fcm9vbUhlbHBlcnMuZ2V0QWxsT3V0Z29pbmdNZXNzYWdlcyhwYyk7CiAgICAgICAgICAgICBmb3IoZmluYWwgTWVzc2FnZSBtXzIgOiBfYWxsT3V0Z29pbmdNZXNzYWdlcykgewotICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uXzEgPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG1fMiwgcmVwbFBvcnRDbGFzc05hbWUpOworICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uXzEgPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG1fMiwgcmVwbFBvcnRDbGFzc05hbWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbl8xLCAiIik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgieyIpOwogICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOwpAQCAtODkzLDcgKzg5Nyw3IEBACiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKGR5bmFtaWNfY2FzdDwiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKHBvcnRDbGFzc05hbWUsICJcdFx0Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKj4oKml0KSktPiIpOwotICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX21lc3NhZ2VDYWxsXzEgPSB0aGlzLm1lc3NhZ2VDYWxsKG1fMik7CisgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZUNhbGxfMSA9IHRoaXMubWVzc2FnZUNhbGwobV8yLCBmYWxzZSk7CiAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbWVzc2FnZUNhbGxfMSwgIlx0XHQiKTsKICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCI7Iik7CiAgICAgICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CkBAIC05NDYsMTAgKzk1MCwxNSBAQAogICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKICAgfQogICAKLSAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBtZXNzYWdlQ2FsbChmaW5hbCBNZXNzYWdlIG0pIHsKKyAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBtZXNzYWdlQ2FsbChmaW5hbCBNZXNzYWdlIG0sIGZpbmFsIGJvb2xlYW4gaW1wbCkgewogICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwogICAgIFN0cmluZyBfbmFtZSA9IG0uZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgIHsKKyAgICAgIGlmIChpbXBsKSB7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiX2ltcGwiKTsKKyAgICAgIH0KKyAgICB9CiAgICAgX2J1aWxkZXIuYXBwZW5kKCIoIik7CiAgICAgewogICAgICAgVmFyRGVjbCBfZGF0YSA9IG0uZ2V0RGF0YSgpOwpAQCAtOTY1LDExICs5NzQsMTAgQEAKICAgICByZXR1cm4gX2J1aWxkZXI7CiAgIH0KICAgCi0gIHByb3RlY3RlZCBDaGFyU2VxdWVuY2UgbWVzc2FnZVNpZ25hdHVyZShmaW5hbCBNZXNzYWdlIG0pIHsKKyAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBtZXNzYWdlU2lnbmF0dXJlKGZpbmFsIE1lc3NhZ2UgbSwgZmluYWwgYm9vbGVhbiBpbXBsKSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CiAgICAgewotICAgICAgYm9vbGVhbiBfaXNQcml2ID0gbS5pc1ByaXYoKTsKLSAgICAgIGlmIChfaXNQcml2KSB7CisgICAgICBpZiAoKG0uaXNQcml2KCkgfHwgaW1wbCkpIHsKICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJwcml2YXRlOiIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJwdWJsaWM6Iik7CkBAIC05NzgsNiArOTg2LDExIEBACiAgICAgX2J1aWxkZXIuYXBwZW5kKCIgdm9pZCAiKTsKICAgICBTdHJpbmcgX25hbWUgPSBtLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUsICIiKTsKKyAgICB7CisgICAgICBpZiAoaW1wbCkgeworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIl9pbXBsIik7CisgICAgICB9CisgICAgfQogICAgIF9idWlsZGVyLmFwcGVuZCgiKCIpOwogICAgIHsKICAgICAgIFZhckRlY2wgX2RhdGEgPSBtLmdldERhdGEoKTsKQEAgLTk5NywxMyArMTAxMCwxOCBAQAogICAgIHJldHVybiBfYnVpbGRlcjsKICAgfQogICAKLSAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBtZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihmaW5hbCBNZXNzYWdlIG0sIGZpbmFsIFN0cmluZyBjbGFzc1ByZWZpeCkgeworICBwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIG1lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKGZpbmFsIE1lc3NhZ2UgbSwgZmluYWwgU3RyaW5nIGNsYXNzUHJlZml4LCBmaW5hbCBib29sZWFuIGltcGwpIHsKICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKICAgICBfYnVpbGRlci5hcHBlbmQoInZvaWQgIik7CiAgICAgX2J1aWxkZXIuYXBwZW5kKGNsYXNzUHJlZml4LCAiIik7CiAgICAgX2J1aWxkZXIuYXBwZW5kKCI6OiIpOwogICAgIFN0cmluZyBfbmFtZSA9IG0uZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgIHsKKyAgICAgIGlmIChpbXBsKSB7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiX2ltcGwiKTsKKyAgICAgIH0KKyAgICB9CiAgICAgX2J1aWxkZXIuYXBwZW5kKCIoIik7CiAgICAgewogICAgICAgVmFyRGVjbCBfZGF0YSA9IG0uZ2V0RGF0YSgpOwpAQCAtMTA0MCwxMDUgKzEwNTgsMTI2IEBACiAgICAgICBpZiAoX25vdEVxdWFscykgewogICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICB7Ci0gICAgICAgICAgVmFyRGVjbCBfZGF0YV8xID0gbS5nZXREYXRhKCk7Ci0gICAgICAgICAgUmVmYWJsZVR5cGUgX3JlZlR5cGUgPSBfZGF0YV8xLmdldFJlZlR5cGUoKTsKLSAgICAgICAgICBib29sZWFuIF9pc1JlZiA9IF9yZWZUeXBlLmlzUmVmKCk7Ci0gICAgICAgICAgaWYgKF9pc1JlZikgewotICAgICAgICAgICAgVmFyRGVjbCBfZGF0YV8yID0gbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBTdHJpbmcgX25hbWUgPSBfZGF0YV8yLmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiYiKTsKLSAgICAgICAgICAgIFZhckRlY2wgX2RhdGFfMyA9IG0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBfZGF0YV8zLmdldE5hbWUoKTsKLSAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xLCAiIik7Ci0gICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiwgc2l6ZW9mKCIpOwotICAgICAgICAgICAgVmFyRGVjbCBfZGF0YV80ID0gbS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBSZWZhYmxlVHlwZSBfcmVmVHlwZV8xID0gX2RhdGFfNC5nZXRSZWZUeXBlKCk7Ci0gICAgICAgICAgICBEYXRhVHlwZSBfdHlwZSA9IF9yZWZUeXBlXzEuZ2V0VHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nIF90eXBlTmFtZSA9IHRoaXMuX3R5cGVIZWxwZXJzLnR5cGVOYW1lKF90eXBlKTsKLSAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfdHlwZU5hbWUsICIiKTsKLSAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBWYXJEZWNsIF9kYXRhXzEgPSBtLmdldERhdGEoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX2RhdGFfMS5nZXROYW1lKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOwogICAgICAgICBfeGlmZXhwcmVzc2lvbl8xID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKICAgICAgIH0KICAgICAgIGZpbmFsIFN0cmluZyBkYXRhQXJnID0gX3hpZmV4cHJlc3Npb25fMTsKLSAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgICBfYnVpbGRlcl8xLmFwcGVuZCgibmV3IE1lc3NhZ2UoZ2V0UGVlckFkZHJlc3MoKSwgIik7Ci0gICAgICBfYnVpbGRlcl8xLmFwcGVuZChwb3J0Q2xhc3NOYW1lLCAiIik7Ci0gICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiOjoiKTsKLSAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGRpciwgIiIpOwotICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIl8iKTsKLSAgICAgIFN0cmluZyBfbmFtZV8yID0gbS5nZXROYW1lKCk7Ci0gICAgICBfYnVpbGRlcl8xLmFwcGVuZChfbmFtZV8yLCAiIik7CisgICAgICBTdHJpbmcgX3hpZmV4cHJlc3Npb25fMiA9IG51bGw7CisgICAgICBpZiAoKCghT2JqZWN0cy5lcXVhbChtLmdldERhdGEoKSwgbnVsbCkpICYmICghbS5nZXREYXRhKCkuZ2V0UmVmVHlwZSgpLmlzUmVmKCkpKSkgeworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiRGF0YU1lc3NhZ2U8Iik7CisgICAgICAgIFZhckRlY2wgX2RhdGFfMiA9IG0uZ2V0RGF0YSgpOworICAgICAgICBSZWZhYmxlVHlwZSBfcmVmVHlwZSA9IF9kYXRhXzIuZ2V0UmVmVHlwZSgpOworICAgICAgICBEYXRhVHlwZSBfdHlwZSA9IF9yZWZUeXBlLmdldFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIF90eXBlTmFtZSA9IHRoaXMuX3R5cGVIZWxwZXJzLnR5cGVOYW1lKF90eXBlKTsKKyAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3R5cGVOYW1lLCAiIik7CisgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCI+Iik7CisgICAgICAgIF94aWZleHByZXNzaW9uXzIgPSBfYnVpbGRlcl8xLnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiTWVzc2FnZSIpOworICAgICAgICBfeGlmZXhwcmVzc2lvbl8yID0gX2J1aWxkZXJfMi50b1N0cmluZygpOworICAgICAgfQorICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2VUeXBlID0gX3hpZmV4cHJlc3Npb25fMjsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl8zLmFwcGVuZCgibmV3IChidWZmZXIpICIpOworICAgICAgX2J1aWxkZXJfMy5hcHBlbmQobWVzc2FnZVR5cGUsICIiKTsKKyAgICAgIF9idWlsZGVyXzMuYXBwZW5kKCIoZ2V0UGVlckFkZHJlc3MoKSwgIik7CisgICAgICBfYnVpbGRlcl8zLmFwcGVuZChwb3J0Q2xhc3NOYW1lLCAiIik7CisgICAgICBfYnVpbGRlcl8zLmFwcGVuZCgiOjoiKTsKKyAgICAgIF9idWlsZGVyXzMuYXBwZW5kKGRpciwgIiIpOworICAgICAgX2J1aWxkZXJfMy5hcHBlbmQoIl8iKTsKKyAgICAgIFN0cmluZyBfbmFtZV8xID0gbS5nZXROYW1lKCk7CisgICAgICBfYnVpbGRlcl8zLmFwcGVuZChfbmFtZV8xLCAiIik7CiAgICAgICBTdHJpbmcgX2VsdmlzID0gbnVsbDsKICAgICAgIGlmIChkYXRhQXJnICE9IG51bGwpIHsKICAgICAgICAgX2VsdmlzID0gZGF0YUFyZzsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIF9lbHZpcyA9ICIiOwogICAgICAgfQotICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX2VsdmlzLCAiIik7Ci0gICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiKSIpOwotICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBfYnVpbGRlcl8xLnRvU3RyaW5nKCk7Ci0gICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwotICAgICAgQ2hhclNlcXVlbmNlIF9tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbiA9IHRoaXMubWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24obSwgY2xhc3NQcmVmaXgpOwotICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoX21lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uLCAiIik7Ci0gICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiIHsiKTsKLSAgICAgIF9idWlsZGVyXzIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIF9idWlsZGVyXzMuYXBwZW5kKF9lbHZpcywgIiIpOworICAgICAgX2J1aWxkZXJfMy5hcHBlbmQoIikiKTsKKyAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gX2J1aWxkZXJfMy50b1N0cmluZygpOworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24gPSB0aGlzLm1lc3NhZ2VTaWduYXR1cmVEZWZpbml0aW9uKG0sIGNsYXNzUHJlZml4LCBmYWxzZSk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZChfbWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb24sICIiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCIgeyIpOworICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgewogICAgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMSA9ICghT2JqZWN0cy5lcXVhbChoZGxyLCBudWxsKSk7CiAgICAgICAgIGlmIChfbm90RXF1YWxzXzEpIHsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHQiKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBEZXRhaWxDb2RlIF9kZXRhaWxDb2RlID0gaGRsci5nZXREZXRhaWxDb2RlKCk7CiAgICAgICAgICAgICBFTGlzdDxTdHJpbmc+IF9saW5lcyA9IF9kZXRhaWxDb2RlLmdldExpbmVzKCk7CiAgICAgICAgICAgICBmb3IoZmluYWwgU3RyaW5nIGNvbW1hbmQgOiBfbGluZXMpIHsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKGNvbW1hbmQsICJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlcl8yLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZChjb21tYW5kLCAiXHQiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHbG9iYWxHZW5lcmF0b3JTZXR0aW5ncyBfc2V0dGluZ3MgPSBNYWluLmdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBib29sZWFuIF9pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uID0gX3NldHRpbmdzLmlzR2VuZXJhdGVNU0NJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbikgewotICAgICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIkRlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFzeW5jT3V0KGdldEFkZHJlc3MoKSwgZ2V0UGVlckFkZHJlc3MoKSwiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5uZXdMaW5lKCk7Ci0gICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQocG9ydENsYXNzTmFtZSwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIjo6Z2V0TWVzc2FnZVN0cmluZygiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQocG9ydENsYXNzTmFtZSwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIjo6Iik7Ci0gICAgICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKGRpciwgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIl8iKTsKLSAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lXzMgPSBtLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoX25hbWVfMywgIlx0XHQiKTsKLSAgICAgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIikpOyIpOwotICAgICAgICAgICAgICBfYnVpbGRlcl8yLm5ld0xpbmVJZk5vdEVtcHR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJpZiAoZ2V0UGVlckFkZHJlc3MoKS5pc1ZhbGlkKCkpeyIpOwotICAgICAgICAgIF9idWlsZGVyXzIubmV3TGluZSgpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJnZXRQZWVyTXNnUmVjZWl2ZXIoKS0+cmVjZWl2ZSgiKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZChtZXNzYWdlLCAiXHRcdCIpOwotICAgICAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCIpOyIpOwotICAgICAgICAgIF9idWlsZGVyXzIubmV3TGluZUlmTm90RW1wdHkoKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgifSIpOwotICAgICAgICAgIF9idWlsZGVyXzIubmV3TGluZSgpOworICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbWVzc2FnZUNhbGwgPSB0aGlzLm1lc3NhZ2VDYWxsKG0sIHRydWUpOworICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKF9tZXNzYWdlQ2FsbCwgIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIjsiKTsKKyAgICAgICAgICBfYnVpbGRlcl80Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIF9idWlsZGVyXzIuYXBwZW5kKCJ9Iik7Ci0gICAgICBfYnVpbGRlcl8yLm5ld0xpbmUoKTsKLSAgICAgIF94YmxvY2tleHByZXNzaW9uID0gX2J1aWxkZXJfMjsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgQ2hhclNlcXVlbmNlIF9tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbl8xID0gdGhpcy5tZXNzYWdlU2lnbmF0dXJlRGVmaW5pdGlvbihtLCBjbGFzc1ByZWZpeCwgdHJ1ZSk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZChfbWVzc2FnZVNpZ25hdHVyZURlZmluaXRpb25fMSwgIiIpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIiB7Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICB7CisgICAgICAgIEdsb2JhbEdlbmVyYXRvclNldHRpbmdzIF9zZXR0aW5ncyA9IE1haW4uZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbiA9IF9zZXR0aW5ncy5pc0dlbmVyYXRlTVNDSW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGlmIChfaXNHZW5lcmF0ZU1TQ0luc3RydW1lbnRhdGlvbikgeworICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY091dChnZXRBZGRyZXNzKCksIGdldFBlZXJBZGRyZXNzKCksIik7CisgICAgICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfNC5hcHBlbmQocG9ydENsYXNzTmFtZSwgIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIjo6Z2V0TWVzc2FnZVN0cmluZygiKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZChwb3J0Q2xhc3NOYW1lLCAiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiOjoiKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZChkaXIsICJcdCIpOworICAgICAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJfIik7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzIgPSBtLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZChfbmFtZV8yLCAiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiKSk7Iik7CisgICAgICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJpZiAoZ2V0UGVlckFkZHJlc3MoKS5pc1ZhbGlkKCkpIHsiKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJNZXNzYWdlKiBidWZmZXIgPSBkeW5hbWljX2Nhc3Q8SU1lc3NhZ2VTZXJ2aWNlKj4oZ2V0UGVlck1zZ1JlY2VpdmVyKCkpLT5nZXRNZXNzYWdlQnVmZmVyKHNpemVvZigiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKG1lc3NhZ2VUeXBlLCAiXHRcdCIpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIikpOyIpOworICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJpZiAoYnVmZmVyKSB7Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJnZXRQZWVyTXNnUmVjZWl2ZXIoKS0+cmVjZWl2ZSgiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKG1lc3NhZ2UsICJcdFx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCIpOyIpOworICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBfYnVpbGRlcl80OwogICAgIH0KICAgICByZXR1cm4gX3hibG9ja2V4cHJlc3Npb247CiAgIH0KQEAgLTExNTUsNyArMTE5NCw2IEBACiAgICAgICAgIH0KICAgICAgIH07CiAgICAgICBmaW5hbCBJdGVyYWJsZTxNZXNzYWdlPiBzZW50TXNncyA9IEl0ZXJhYmxlRXh0ZW5zaW9ucy48TWVzc2FnZT5maWx0ZXIoX2FsbEluY29taW5nTWVzc2FnZXMsIF9mdW5jdGlvbik7Ci0gICAgICBmaW5hbCBFTGlzdDxSb29tTW9kZWw+IG1vZGVscyA9IHJvb3QuZ2V0UmVmZXJlbmNlZE1vZGVscyhwYyk7CiAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLyoqIik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CkBAIC0xMzkxLDcgKzE0MjksNiBAQAogICAgICAgICB9CiAgICAgICB9OwogICAgICAgZmluYWwgSXRlcmFibGU8TWVzc2FnZT4gc2VudE1zZ3MgPSBJdGVyYWJsZUV4dGVuc2lvbnMuPE1lc3NhZ2U+ZmlsdGVyKF9hbGxJbmNvbWluZ01lc3NhZ2VzLCBfZnVuY3Rpb24pOwotICAgICAgZmluYWwgRUxpc3Q8Um9vbU1vZGVsPiBtb2RlbHMgPSByb290LmdldFJlZmVyZW5jZWRNb2RlbHMocGMpOwogICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8qKiIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UudWkucnVudGltZS9jb250ZW50cy9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwLnppcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLnVpLnJ1bnRpbWUvY29udGVudHMvb3JnLmVjbGlwc2UuZXRyaWNlLm1vZGVsbGliLmNwcC56aXAKaW5kZXggNDYyNDQ5Yy4uOTY5MmVhMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UudWkucnVudGltZS9jb250ZW50cy9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwLnppcAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS51aS5ydW50aW1lL2NvbnRlbnRzL29yZy5lY2xpcHNlLmV0cmljZS5tb2RlbGxpYi5jcHAuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLnVpLnJ1bnRpbWUvY29udGVudHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnppcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXRyaWNlLnVpLnJ1bnRpbWUvY29udGVudHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnppcAppbmRleCA2NTlhNDc1Li4zZTMwMWI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmV0cmljZS51aS5ydW50aW1lL2NvbnRlbnRzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC56aXAKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5ldHJpY2UudWkucnVudGltZS9jb250ZW50cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLm1vZGVsbGliLmNwcC9tb2RlbC9HZW5lcmljUGh5c2ljYWwuZXRwaHlzIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwL21vZGVsL0dlbmVyaWNQaHlzaWNhbC5ldHBoeXMKaW5kZXggMjdmNDQyYi4uY2FlYzJiYSAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwL21vZGVsL0dlbmVyaWNQaHlzaWNhbC5ldHBoeXMKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwL21vZGVsL0dlbmVyaWNQaHlzaWNhbC5ldHBoeXMKQEAgLTE0LDcgKzE0LDcgQEAKIAkJCWludGVydmFsID0gMTAwbXMKIAkJCXByaW8gPSAwCiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDEwMAogCQl9CiAJCQpAQCAtMjIsNyArMjIsNyBAQAogCQkJZXhlY21vZGUgPSBibG9ja2VkCiAJCQlwcmlvID0gMAogCQkJc3RhY2tzaXplID0gMTAyNAotCQkJbXNnYmxvY2tzaXplID0gNjQKKwkJCW1zZ2Jsb2Nrc2l6ZSA9IDEyOAogCQkJbXNncG9vbHNpemUgPSAxMDAKIAkJfQogCQkKQEAgLTMxLDcgKzMxLDcgQEAKIAkJCWludGVydmFsID0gMTAwbXMKIAkJCXByaW8gPSAwCiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDEwMAogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwL21vZGVsL1RpbWluZ1NlcnZpY2Uucm9vbSBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLm1vZGVsbGliLmNwcC9tb2RlbC9UaW1pbmdTZXJ2aWNlLnJvb20KaW5kZXggNDIyOWQ3Mi4uYzFlNTZjZCAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UubW9kZWxsaWIuY3BwL21vZGVsL1RpbWluZ1NlcnZpY2Uucm9vbQorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5tb2RlbGxpYi5jcHAvbW9kZWwvVGltaW5nU2VydmljZS5yb29tCkBAIC0yNDgsMTMgKzI0OCw3IEBACiAJCQlpbmNvbWluZyBzdGFydFRpbWVyIHsKIAkJCSJpZiAoc3RhdHVzPT0wKXsKIAkJCQlzdGF0dXM9RVRfVElNRVJfUlVOTklORyB8IEVUX1RJTUVSX1BFUklPRElDOwotCQkJCURlYnVnZ2luZ1NlcnZpY2U6OmdldEluc3RhbmNlKCkuYWRkTWVzc2FnZUFzeW5jT3V0KGdldEFkZHJlc3MoKSwgZ2V0UGVlckFkZHJlc3MoKSwKLQkJCQkJCQkJCQkJCSAgIFBUaW1lcjo6Z2V0TWVzc2FnZVN0cmluZyhQVGltZXI6OklOX3N0YXJ0VGltZXIpKTsKLQkJCQlpZiAoZ2V0UGVlckFkZHJlc3MoKS5pc1ZhbGlkKCkpewotCQkJCQlnZXRQZWVyTXNnUmVjZWl2ZXIoKS0+cmVjZWl2ZShuZXcgTWVzc2FnZShnZXRQZWVyQWRkcmVzcygpLFBUaW1lcjo6SU5fc3RhcnRUaW1lciwKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzIpKSk7Ci0JCQkJfQorCQkJCXN0YXJ0VGltZXJfaW1wbCh0aW1lKTsKIAkJCX0KIAkJCSIKIAkJCX0KQEAgLTI2MiwxMyArMjU2LDcgQEAKIAkJCWluY29taW5nIHN0YXJ0VGltZW91dCB7CiAJCQkiaWYgKHN0YXR1cz09MCl7CiAJCQkJc3RhdHVzID0gRVRfVElNRVJfUlVOTklORzsKLQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY091dChnZXRBZGRyZXNzKCksIGdldFBlZXJBZGRyZXNzKCksCi0JCQkJCQkJCQkJCQkgICBQVGltZXI6OmdldE1lc3NhZ2VTdHJpbmcoUFRpbWVyOjpJTl9zdGFydFRpbWVvdXQpKTsKLQkJCQlpZiAoZ2V0UGVlckFkZHJlc3MoKS5pc1ZhbGlkKCkpewotCQkJCQlnZXRQZWVyTXNnUmVjZWl2ZXIoKS0+cmVjZWl2ZShuZXcgTWVzc2FnZShnZXRQZWVyQWRkcmVzcygpLFBUaW1lcjo6SU5fc3RhcnRUaW1lb3V0LAotCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMikpKTsKLQkJCQl9CisJCQkJc3RhcnRUaW1lb3V0X2ltcGwodGltZSk7CiAJCQl9CiAJCQkiCiAJCQl9CkBAIC0yOTEsMTEgKzI3OSw3IEBACiAJCQkiCiAJCQlpZiAoc3RhdHVzIT0wKXsKIAkJCQlzdGF0dXM9MDsKLQkJCQlEZWJ1Z2dpbmdTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLmFkZE1lc3NhZ2VBc3luY091dChnZXRBZGRyZXNzKCksIGdldFBlZXJBZGRyZXNzKCksCi0JCQkJCQkJCQkJCQkgICBQVGltZXI6OmdldE1lc3NhZ2VTdHJpbmcoUFRpbWVyOjpJTl9raWxsKSk7Ci0JCQkJaWYgKGdldFBlZXJBZGRyZXNzKCkuaXNWYWxpZCgpKXsKLQkJCQkJZ2V0UGVlck1zZ1JlY2VpdmVyKCktPnJlY2VpdmUobmV3IE1lc3NhZ2UoZ2V0UGVlckFkZHJlc3MoKSxQVGltZXI6OklOX2tpbGwpKTsKLQkJCQl9CisJCQkJa2lsbF9pbXBsKCk7CiAJCQl9CiAJCQkiCiAJCQl9CmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9BYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlLmNwcCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL0Fic3RyYWN0TWVzc2FnZVNlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTIzNTFkLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL0Fic3RyYWN0TWVzc2FnZVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMyBwcm90b3Mgc29mdHdhcmUgZ21iaCAoaHR0cDovL3d3dy5wcm90b3MuZGUpLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDT05UUklCVVRPUlM6Ci0gKiAJCUp1ZXJnZW4gSGF1ZyAoaW5pdGlhbCBjb250cmlidXRpb24pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL0Fic3RyYWN0TWVzc2FnZVNlcnZpY2UuaCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBldFJ1bnRpbWUgewotCi1BYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjpBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlKElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IG5vZGUsIGludCB0aHJlYWQpIDoKLQkJUlRPYmplY3QocGFyZW50LCBuYW1lKSwKLQkJbV9hZGRyZXNzKG5vZGUsIHRocmVhZCwgMCksCi0JCW1fbWVzc2FnZVF1ZXVlKHRoaXMsICJRdWV1ZSIpLAotCQltX21lc3NhZ2VEaXNwYXRjaGVyKHRoaXMsIG1fYWRkcmVzcy5jcmVhdGVJbmMoKSwgIkRpc3BhdGNoZXIiKSB7Ci19Ci0KLUFkZHJlc3MgQWJzdHJhY3RNZXNzYWdlU2VydmljZTo6Z2V0RnJlZUFkZHJlc3MoKSB7Ci0JcmV0dXJuIG1fbWVzc2FnZURpc3BhdGNoZXIuZ2V0RnJlZUFkZHJlc3MoKTsKLX0KLQotdm9pZCBBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjpmcmVlQWRkcmVzcyhjb25zdCBBZGRyZXNzJiBhZGRyKSB7Ci0JbV9tZXNzYWdlRGlzcGF0Y2hlci5mcmVlQWRkcmVzcyhhZGRyKTsKLX0KLQotdm9pZCBBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjphZGRNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpIHsKLQltX21lc3NhZ2VEaXNwYXRjaGVyLmFkZE1lc3NhZ2VSZWNlaXZlcihyZWNlaXZlcik7Ci19Ci0KLXZvaWQgQWJzdHJhY3RNZXNzYWdlU2VydmljZTo6cmVtb3ZlTWVzc2FnZVJlY2VpdmVyKElNZXNzYWdlUmVjZWl2ZXImIHJlY2VpdmVyKSB7Ci0JbV9tZXNzYWdlRGlzcGF0Y2hlci5yZW1vdmVNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOwotfQotCi12b2lkIEFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OmFkZFBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpIHsKLQltX21lc3NhZ2VEaXNwYXRjaGVyLmFkZFBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOwotfQotCi12b2lkIEFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OnJlbW92ZVBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpIHsKLQltX21lc3NhZ2VEaXNwYXRjaGVyLnJlbW92ZVBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOwotfQotCi12b2lkIEFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OnJlY2VpdmUoY29uc3QgTWVzc2FnZSogbXNnKSB7Ci0JaWYgKG1zZyAhPSAwKSB7Ci0JCW1fbWVzc2FnZVF1ZXVlLnB1c2goY29uc3RfY2FzdDxNZXNzYWdlKj4obXNnKSk7Ci0JfQotfQotCi1zdGQ6OnN0cmluZyBBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjp0b1N0cmluZygpIGNvbnN0IHsKLQlyZXR1cm4gZ2V0TmFtZSgpICsgIiAiICsgZ2V0QWRkcmVzcygpLnRvSUQoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvQWJzdHJhY3RNZXNzYWdlU2VydmljZS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvQWJzdHJhY3RNZXNzYWdlU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODAzMmZhLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL0Fic3RyYWN0TWVzc2FnZVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMgcHJvdG9zIHNvZnR3YXJlIGdtYmggKGh0dHA6Ly93d3cucHJvdG9zLmRlKS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ09OVFJJQlVUT1JTOgotICogCQlKdWVyZ2VuIEhhdWcgKGluaXRpYWwgY29udHJpYnV0aW9uKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBTUkNfQ09NTU9OX01FU1NBR0lOR19BQlNUUkFDVE1FU1NBR0VTRVJWSUNFX0hfCi0jZGVmaW5lIFNSQ19DT01NT05fTUVTU0FHSU5HX0FCU1RSQUNUTUVTU0FHRVNFUlZJQ0VfSF8KLQotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvQWRkcmVzcy5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlUXVldWUuaCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBldFJ1bnRpbWUgewotCi1jbGFzcyBBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOiBwdWJsaWMgUlRPYmplY3QsIHB1YmxpYyBJTWVzc2FnZVNlcnZpY2UgewotCi1wdWJsaWM6Ci0JdmlydHVhbCB+QWJzdHJhY3RNZXNzYWdlU2VydmljZSgpIHt9Ci0KLQl2aXJ0dWFsIGNvbnN0IEFkZHJlc3MmIGdldEFkZHJlc3MoKSBjb25zdCAgeyByZXR1cm4gbV9hZGRyZXNzOyB9Ci0KLQl2aXJ0dWFsIEFkZHJlc3MgZ2V0RnJlZUFkZHJlc3MoKTsKLQotCXZpcnR1YWwgdm9pZCBmcmVlQWRkcmVzcyhjb25zdCBBZGRyZXNzJiBhZGRyKTsKLQotCXZpcnR1YWwgdm9pZCBhZGRNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpOwotCXZpcnR1YWwgdm9pZCByZW1vdmVNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpOwotCi0JdmlydHVhbCB2b2lkIGFkZFBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpOwotCXZpcnR1YWwgdm9pZCByZW1vdmVQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKElNZXNzYWdlUmVjZWl2ZXImIHJlY2VpdmVyKTsKLQl2aXJ0dWFsIHZvaWQgcmVjZWl2ZShjb25zdCBNZXNzYWdlKiBtc2cpOwotCi1wcm90ZWN0ZWQ6Ci0JQWJzdHJhY3RNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBub2RlLCBpbnQgdGhyZWFkKTsKLQotCU1lc3NhZ2VTZVF1ZXVlJiBnZXRNZXNzYWdlUXVldWUoKSB7Ci0JCXJldHVybiBtX21lc3NhZ2VRdWV1ZTsKLQl9Ci0JTWVzc2FnZURpc3BhdGNoZXImIGdldE1lc3NhZ2VEaXNwYXRjaGVyKCkgewotCQlyZXR1cm4gbV9tZXNzYWdlRGlzcGF0Y2hlcjsKLQl9Ci0KLQlzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotCS8vIFRPRE86IGFkZCBpbnRlcm5hbCBtZXNzYWdlIHF1ZXVlIGZvciBsZXNzIGxvY2tzIChmYXN0ZXIgdGhyZWFkIGludGVybmFsCi0JLy8gbWVzc2FnaW5nKQotCUFkZHJlc3MgbV9hZGRyZXNzOwotCU1lc3NhZ2VTZVF1ZXVlIG1fbWVzc2FnZVF1ZXVlOwotCU1lc3NhZ2VEaXNwYXRjaGVyIG1fbWVzc2FnZURpc3BhdGNoZXI7Ci0KLQlBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlKCk7Ci0JQWJzdHJhY3RNZXNzYWdlU2VydmljZShBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlIGNvbnN0Jik7Ci0JQWJzdHJhY3RNZXNzYWdlU2VydmljZSYgb3BlcmF0b3I9KEFic3RyYWN0TWVzc2FnZVNlcnZpY2UgY29uc3QmKTsKLX07Ci0KLX0KLSNlbmRpZiAvKiBTUkNfQ09NTU9OX01FU1NBR0lOR19BQlNUUkFDVE1FU1NBR0VTRVJWSUNFX0hfICovCmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9JTWVzc2FnZU1lbW9yeS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VNZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY1NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VNZW1vcnkuaApAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENPTlRSSUJVVE9SUzoKKyAqIAkJSmFuIEJlbGxlIChpbml0aWFsIGNvbnRyaWJ1dGlvbikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTUkNfQ09NTU9OX01FU1NBR0lOR19JTUVTU0FHRU1FTU9SWV9IXworI2RlZmluZSBTUkNfQ09NTU9OX01FU1NBR0lOR19JTUVTU0FHRU1FTU9SWV9IXworCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9JUlRPYmplY3QuaCIKKworbmFtZXNwYWNlIGV0UnVudGltZSB7CisKK2NsYXNzIElNZXNzYWdlTWVtb3J5IDogdmlydHVhbCBJUlRPYmplY3QgeworcHVibGljOgorCXZpcnR1YWwgfklNZXNzYWdlTWVtb3J5KCkge30KKworCS8vIHJldHVybnMgYSBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplIGluIGJ5dGVzCisJLy8gdXNlIHRoZSBwbGFjZW1lbnQgY29uc3RydWN0b3IgdG8gY3JlYXRlIG9iamVjdHMgYW5kIGNhbGwgdGhlIGRlc3RydWN0b3IgZXhwbGljaXRseQorCXZpcnR1YWwgTWVzc2FnZSogZ2V0TWVzc2FnZUJ1ZmZlcihzaXplX3Qgc2l6ZSkgPSAwOworCS8vIGZyZWVzIHRoZSBidWZmZXIKKwl2aXJ0dWFsIHZvaWQgcmV0dXJuTWVzc2FnZUJ1ZmZlcihjb25zdCBNZXNzYWdlKiBidWZmZXIpID0gMDsKK307CisKK30gLyogbmFtZXNwYWNlIGV0UnVudGltZSAqLworCisjZW5kaWYgLyogU1JDX0NPTU1PTl9NRVNTQUdJTkdfSU1FU1NBR0VNRU1PUllfSF8gKi8KZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL0lNZXNzYWdlU2VydmljZS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgKaW5kZXggMTQ1ZDc2Ny4uYTI4NzFjMCAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgKQEAgLTM5LDYgKzM5LDkgQEAKIAl2aXJ0dWFsIHZvaWQgYWRkUG9sbGluZ01lc3NhZ2VSZWNlaXZlcihJTWVzc2FnZVJlY2VpdmVyJiByZWNlaXZlcikgPSAwOwogCXZpcnR1YWwgdm9pZCByZW1vdmVQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKElNZXNzYWdlUmVjZWl2ZXImIHJlY2VpdmVyKSA9IDA7CiAKKwl2aXJ0dWFsIE1lc3NhZ2UqIGdldE1lc3NhZ2VCdWZmZXIoaW50IHNpemUpID0gMDsKKwl2aXJ0dWFsIHZvaWQgcmV0dXJuTWVzc2FnZUJ1ZmZlcihjb25zdCBNZXNzYWdlKiBidWZmZXIpID0gMDsKKwogCS8vIFRPRE8gVGhyZWFkCiAvLwkJdm9pZCBzZXRUaHJlYWQoVGhyZWFkIHRocmVhZCk7CiAvLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZS5jcHAgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmNwcAppbmRleCBkOWU1ZGY2Li42OTcwNWY5IDEwMDY0NAotLS0gYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmNwcApAQCAtMTgsMjAgKzE4LDYgQEAKIAogbmFtZXNwYWNlIGV0UnVudGltZSB7CiAKLU1lc3NhZ2U6Ok1lc3NhZ2UoY29uc3QgQWRkcmVzcyYgYWRkciwgaW50IGV2dElkLCBjb25zdCB2b2lkKiBkYXRhVG9Db3B5LCBzdGQ6OnNpemVfdCBkYXRhU2l6ZSkgOgotCQltX2FkZHJlc3MoYWRkciksCi0JCW1fZXZ0SWQoZXZ0SWQpLAotCQltX25leHQoMCksCi0JCW1fZGF0YVNpemUoMCksCi0JCW1fZGF0YSgwKXsKLQlpZihkYXRhVG9Db3B5ICE9IDAgJiYgZGF0YVNpemUgPiAwKXsKLQkJbV9kYXRhID0gc3RkOjptYWxsb2MoZGF0YVNpemUpOwotCQlpZihtX2RhdGEgIT0gMCl7Ci0JCQltX2RhdGFTaXplID0gZGF0YVNpemU7Ci0JCQlzdGQ6Om1lbWNweShtX2RhdGEsIGRhdGFUb0NvcHksIGRhdGFTaXplKTsKLQkJfQotCX0KLX0KIE1lc3NhZ2U6Ok1lc3NhZ2UoY29uc3QgQWRkcmVzcyYgYWRkciwgaW50IGV2dElkLCB2b2lkKiBkYXRhUHRyKSA6CiAJCW1fYWRkcmVzcyhhZGRyKSwKIAkJbV9ldnRJZChldnRJZCksCkBAIC00OSw4ICszNSw2IEBACiBNZXNzYWdlOjp+TWVzc2FnZSgpIHsKIAltX2V2dElkID0gMDsKIAltX25leHQgPSAwOwotCWlmKG1fZGF0YVNpemUgPiAwKQotCQlzdGQ6OmZyZWUobV9kYXRhKTsKIAltX2RhdGEgPSAwOwogCW1fZGF0YVNpemUgPSAwOwogfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZS5oCmluZGV4IGI5NzgwMjguLmU0NTY0YzQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL01lc3NhZ2UuaAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmgKQEAgLTI1LDEyICsyNSwxMCBAQAogCiBwdWJsaWM6CiAKLQkvLyBNZXNzYWdlcyB3aXRoIGRhdGEgVE9ETyBNZXNzYWdlQnVmZmVyCi0JTWVzc2FnZShjb25zdCBBZGRyZXNzJiBhZGRyLCBpbnQgZXZ0SWQsIGNvbnN0IHZvaWQqIGRhdGFUb0NvcHksIHN0ZDo6c2l6ZV90IGRhdGFTaXplKTsKIAlNZXNzYWdlKGNvbnN0IEFkZHJlc3MmIGFkZHIsIGludCBldnRJZCwgdm9pZCogZGF0YVB0cik7CiAKIAlNZXNzYWdlKGNvbnN0IEFkZHJlc3MmIGFkZHIsIGludCBldnRJZCk7Ci0Jfk1lc3NhZ2UoKTsKKwl2aXJ0dWFsIH5NZXNzYWdlKCk7CiAKIAljb25zdCBBZGRyZXNzJiBnZXRBZGRyZXNzKCkgY29uc3QgewogCQlyZXR1cm4gbV9hZGRyZXNzOwpAQCAtNzIsNSArNzAsMTggQEAKIAogfTsKIAordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIERhdGFNZXNzYWdlIDogcHVibGljIE1lc3NhZ2UgeworcHVibGljOgorCURhdGFNZXNzYWdlKGNvbnN0IEFkZHJlc3MmIGFkZHIsIGludCBldnRJZCwgY29uc3QgVCYgZGF0YVRvQ29weSkgOgorCQlNZXNzYWdlKGFkZHIsIGV2dElkLCAmbV9kYXRhKSwgbV9kYXRhKGRhdGFUb0NvcHkpIHt9Citwcml2YXRlOgorCVQgbV9kYXRhOworCisJRGF0YU1lc3NhZ2Uodm9pZCk7CisJRGF0YU1lc3NhZ2UoRGF0YU1lc3NhZ2UgY29uc3QmKTsKKwlEYXRhTWVzc2FnZSYgb3BlcmF0b3I9KERhdGFNZXNzYWdlIGNvbnN0Jik7Cit9OworCiB9IC8qIG5hbWVzcGFjZSBldFJ1bnRpbWUgKi8KICNlbmRpZiAvKiBNRVNTQUdFX0hfICovCmRpZmYgLS1naXQgYS9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5jcHAgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5jcHAKaW5kZXggZTgwMzViMS4uZjUyNTBiZSAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZURpc3BhdGNoZXIuY3BwCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL01lc3NhZ2VEaXNwYXRjaGVyLmNwcApAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmgiCiAjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5oIgorI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBldFJ1bnRpbWUgewogCkBAIC04Miw5ICs4MywxMCBAQAogCX0gZWxzZSBpZiAocmVjZWl2ZXIgIT0gMCkgewogCQlyZWNlaXZlci0+cmVjZWl2ZShtc2cpOwogCQkvLyBUT0RPOiBlcnJvciBoYW5kbGluZyBmb3Igbm90IGZvdW5kIGFkZHJlc3NlcwotCi0JCWRlbGV0ZSBtc2c7CiAJfQorCisJbXNnLT5+TWVzc2FnZSgpOworCWR5bmFtaWNfY2FzdDxJTWVzc2FnZVNlcnZpY2UqPihnZXRQYXJlbnQoKSktPnJldHVybk1lc3NhZ2VCdWZmZXIobXNnKTsKIH0KIAogc3RkOjpzdHJpbmcgTWVzc2FnZURpc3BhdGNoZXI6OnRvU3RyaW5nKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2UuY3BwIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2UuY3BwCmluZGV4IGUyZDc0OTMuLjYyZDYyZDYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlU2VydmljZS5jcHAKQEAgLTEwLDcgKzEwLDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZURpc3BhdGNoZXIuaCIKICNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZVF1ZXVlLmgiCiAjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlU2VydmljZS5oIgogI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2VDb250cm9sbGVyLmgiCkBAIC0yMSwxMiArMjAsMTYgQEAKIG5hbWVzcGFjZSBldFJ1bnRpbWUgewogCiAKLU1lc3NhZ2VTZXJ2aWNlOjpNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgSU1lc3NhZ2VTZXJ2aWNlOjpFeGVjTW9kZSBtb2RlLCBpbnQgbm9kZSwgaW50IHRocmVhZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBwcmlvcml0eSkgOgotCQlBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlKHBhcmVudCwgbmFtZSwgbm9kZSwgdGhyZWFkKSwKK01lc3NhZ2VTZXJ2aWNlOjpNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgSU1lc3NhZ2VTZXJ2aWNlOjpFeGVjTW9kZSBtb2RlLCBpbnQgbm9kZSwgaW50IHRocmVhZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisJCUlNZXNzYWdlTWVtb3J5KiBtZW1vcnksIGludCBwcmlvcml0eSkgOgorCQlSVE9iamVjdChwYXJlbnQsIG5hbWUpLAogCQltX3J1bm5pbmcoZmFsc2UpLAogCQltX2V4ZWNNb2RlKG1vZGUpLAogCQltX2xhc3RNZXNzYWdlVGltZXN0YW1wKDApLAotCQltX3BvbGxpbmdNZXNzYWdlKGdldE1lc3NhZ2VEaXNwYXRjaGVyKCkuZ2V0QWRkcmVzcygpLCAwKSB7CisJCW1fYWRkcmVzcyhub2RlLCB0aHJlYWQsIDApLAorCQltX21lc3NhZ2VRdWV1ZSh0aGlzLCAiUXVldWUiKSwKKwkJbV9tZXNzYWdlRGlzcGF0Y2hlcih0aGlzLCBtX2FkZHJlc3MuY3JlYXRlSW5jKCksICJEaXNwYXRjaGVyIiksCisJCW1fbWVzc2FnZU1lbW9yeShtZW1vcnkpIHsKIAogCWV0VGltZSBpbnRlcnZhbDsKIAlpbnRlcnZhbC5zZWMgPSAwOwpAQCAtMzUsMTIgKzM4LDE1IEBACiB9CiAKIE1lc3NhZ2VTZXJ2aWNlOjpNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgSU1lc3NhZ2VTZXJ2aWNlOjpFeGVjTW9kZSBtb2RlLCBldFRpbWUgaW50ZXJ2YWwsIGludCBub2RlLCBpbnQgdGhyZWFkLAotCQljb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IHByaW9yaXR5KSA6Ci0JCUFic3RyYWN0TWVzc2FnZVNlcnZpY2UocGFyZW50LCBuYW1lLCBub2RlLCB0aHJlYWQpLAorCQljb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgSU1lc3NhZ2VNZW1vcnkqIG1lbW9yeSwgaW50IHByaW9yaXR5KSA6CisJCVJUT2JqZWN0KHBhcmVudCwgbmFtZSksCiAJCW1fcnVubmluZyhmYWxzZSksCiAJCW1fZXhlY01vZGUobW9kZSksCiAJCW1fbGFzdE1lc3NhZ2VUaW1lc3RhbXAoMCksCi0JCW1fcG9sbGluZ01lc3NhZ2UoZ2V0TWVzc2FnZURpc3BhdGNoZXIoKS5nZXRBZGRyZXNzKCksIDApIHsKKwkJbV9hZGRyZXNzKG5vZGUsIHRocmVhZCwgMCksCisJCW1fbWVzc2FnZVF1ZXVlKHRoaXMsICJRdWV1ZSIpLAorCQltX21lc3NhZ2VEaXNwYXRjaGVyKHRoaXMsIG1fYWRkcmVzcy5jcmVhdGVJbmMoKSwgIkRpc3BhdGNoZXIiKSwKKwkJbV9tZXNzYWdlTWVtb3J5KG1lbW9yeSkgewogCiAJTWVzc2FnZVNlcnZpY2VfaW5pdChpbnRlcnZhbCwgcHJpb3JpdHkpOwogfQpAQCAtNjcsMTIgKzczLDE4IEBACiB9CiAKIE1lc3NhZ2VTZXJ2aWNlOjp+TWVzc2FnZVNlcnZpY2UoKSB7CisJd2hpbGUobV9tZXNzYWdlUXVldWUuZ2V0U2l6ZSgpID4gMCkgeworCQljb25zdCBNZXNzYWdlKiBtc2cgPSBtX21lc3NhZ2VRdWV1ZS5wb3AoKTsKKwkJbXNnLT5+TWVzc2FnZSgpOworCQlyZXR1cm5NZXNzYWdlQnVmZmVyKG1zZyk7CisJfQogCWV0TXV0ZXhfZGVzdHJ1Y3QoJm1fbXV0ZXgpOwogCWV0U2VtYV9kZXN0cnVjdCgmbV9leGVjdXRpb25TZW1hcGhvcmUpOwogCWV0VGhyZWFkX2Rlc3RydWN0KCZtX3RocmVhZCk7CiAJaWYgKG1fZXhlY01vZGUgPT0gSU1lc3NhZ2VTZXJ2aWNlOjpQT0xMRUQgfHwgbV9leGVjTW9kZSA9PSBJTWVzc2FnZVNlcnZpY2U6Ok1JWEVEKSB7CiAJCWV0VGltZXJfZGVzdHJ1Y3QoJm1fdGltZXIpOwogCX0KKwlkZWxldGUgbV9tZXNzYWdlTWVtb3J5OwogfQogCiB2b2lkIE1lc3NhZ2VTZXJ2aWNlOjpzdGFydCgpIHsKQEAgLTg2LDcgKzk4LDcgQEAKIHZvaWQgTWVzc2FnZVNlcnZpY2U6OnJ1bigpIHsKIAl3aGlsZSAobV9ydW5uaW5nKSB7CiAJCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOwotCQljb25zdCBNZXNzYWdlKiBtc2cgPSBnZXRNZXNzYWdlUXVldWUoKS5wb3AoKTsgLy8gZ2V0IG5leHQgTWVzc2FnZSBmcm9tIFF1ZXVlCisJCWNvbnN0IE1lc3NhZ2UqIG1zZyA9IG1fbWVzc2FnZVF1ZXVlLnBvcCgpOyAvLyBnZXQgbmV4dCBNZXNzYWdlIGZyb20gUXVldWUKIAkJZXRNdXRleF9sZWF2ZSgmbV9tdXRleCk7CiAJCWlmIChtc2cgPT0gMCkgewogCQkJLy8gbm8gbWVzc2FnZSBpbiBxdWV1ZSAtPiB3YWl0IHRpbGwgVGhyZWFkIGlzIG5vdGlmaWVkCkBAIC05NCw3ICsxMDYsNyBAQAogCQl9IGVsc2UgewogCQkJLy9UT0RPOiBzZXQgdGltZXN0YW1wCiAJCQkvLyBtX2xhc3RNZXNzYWdlVGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlnZXRNZXNzYWdlRGlzcGF0Y2hlcigpLnJlY2VpdmUobXNnKTsKKwkJCW1fbWVzc2FnZURpc3BhdGNoZXIucmVjZWl2ZShtc2cpOwogCQl9CiAJfQogCkBAIC0xMDMsMTQgKzExNSwxNiBAQAogCiB2b2lkIE1lc3NhZ2VTZXJ2aWNlOjpyZWNlaXZlKGNvbnN0IE1lc3NhZ2UqIG1zZykgewogCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOwotCUFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OnJlY2VpdmUobXNnKTsKKwlpZiAobXNnICE9IDApIHsKKwkJbV9tZXNzYWdlUXVldWUucHVzaChjb25zdF9jYXN0PE1lc3NhZ2UqPihtc2cpKTsKKwl9CiAJZXRTZW1hX3dha2V1cCgmbV9leGVjdXRpb25TZW1hcGhvcmUpOwogCWV0TXV0ZXhfbGVhdmUoJm1fbXV0ZXgpOwogfQogCiBBZGRyZXNzIE1lc3NhZ2VTZXJ2aWNlOjpnZXRGcmVlQWRkcmVzcygpIHsKIAlldE11dGV4X2VudGVyKCZtX211dGV4KTsKLQlBZGRyZXNzIGFkZHJlc3MgPSBBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjpnZXRGcmVlQWRkcmVzcygpOworCUFkZHJlc3MgYWRkcmVzcyA9IG1fbWVzc2FnZURpc3BhdGNoZXIuZ2V0RnJlZUFkZHJlc3MoKTsKIAlldE11dGV4X2xlYXZlKCZtX211dGV4KTsKIAogCXJldHVybiBhZGRyZXNzOwpAQCAtMTE4LDM0ICsxMzIsNTEgQEAKIAogdm9pZCBNZXNzYWdlU2VydmljZTo6ZnJlZUFkZHJlc3MoY29uc3QgQWRkcmVzcyYgYWRkcikgewogCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOwotCUFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OmZyZWVBZGRyZXNzKGFkZHIpOworCW1fbWVzc2FnZURpc3BhdGNoZXIuZnJlZUFkZHJlc3MoYWRkcik7CiAJZXRNdXRleF9sZWF2ZSgmbV9tdXRleCk7CiB9CiAKIHZvaWQgTWVzc2FnZVNlcnZpY2U6OmFkZE1lc3NhZ2VSZWNlaXZlcihJTWVzc2FnZVJlY2VpdmVyJiByZWNlaXZlcikgewogCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOwotCUFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OmFkZE1lc3NhZ2VSZWNlaXZlcihyZWNlaXZlcik7CisJbV9tZXNzYWdlRGlzcGF0Y2hlci5hZGRNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOwogCWV0TXV0ZXhfbGVhdmUoJm1fbXV0ZXgpOwogfQogCiB2b2lkIE1lc3NhZ2VTZXJ2aWNlOjpyZW1vdmVNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpIHsKIAlldE11dGV4X2VudGVyKCZtX211dGV4KTsKLQlBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjpyZW1vdmVNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOworCW1fbWVzc2FnZURpc3BhdGNoZXIucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKHJlY2VpdmVyKTsKIAlldE11dGV4X2xlYXZlKCZtX211dGV4KTsKIH0KIAogdm9pZCBNZXNzYWdlU2VydmljZTo6YWRkUG9sbGluZ01lc3NhZ2VSZWNlaXZlcihJTWVzc2FnZVJlY2VpdmVyJiByZWNlaXZlcikgewogCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOwotCUFic3RyYWN0TWVzc2FnZVNlcnZpY2U6OmFkZFBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOworCW1fbWVzc2FnZURpc3BhdGNoZXIuYWRkUG9sbGluZ01lc3NhZ2VSZWNlaXZlcihyZWNlaXZlcik7CiAJZXRNdXRleF9sZWF2ZSgmbV9tdXRleCk7CiB9CiAKIHZvaWQgTWVzc2FnZVNlcnZpY2U6OnJlbW92ZVBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIoSU1lc3NhZ2VSZWNlaXZlciYgcmVjZWl2ZXIpIHsKIAlldE11dGV4X2VudGVyKCZtX211dGV4KTsKLQlBYnN0cmFjdE1lc3NhZ2VTZXJ2aWNlOjpyZW1vdmVQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKHJlY2VpdmVyKTsKKwltX21lc3NhZ2VEaXNwYXRjaGVyLnJlbW92ZVBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjZWl2ZXIpOwogCWV0TXV0ZXhfbGVhdmUoJm1fbXV0ZXgpOwogfQogCitNZXNzYWdlKiBNZXNzYWdlU2VydmljZTo6Z2V0TWVzc2FnZUJ1ZmZlcihpbnQgc2l6ZSkgeworCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOworCU1lc3NhZ2UqIGJ1ZmZlciA9IG1fbWVzc2FnZU1lbW9yeS0+Z2V0TWVzc2FnZUJ1ZmZlcihzaXplKTsKKwlldE11dGV4X2xlYXZlKCZtX211dGV4KTsKKwlyZXR1cm4gYnVmZmVyOworfQorCit2b2lkIE1lc3NhZ2VTZXJ2aWNlOjpyZXR1cm5NZXNzYWdlQnVmZmVyKGNvbnN0IE1lc3NhZ2UqIGJ1ZmZlcikgeworCWV0TXV0ZXhfZW50ZXIoJm1fbXV0ZXgpOworCW1fbWVzc2FnZU1lbW9yeS0+cmV0dXJuTWVzc2FnZUJ1ZmZlcihidWZmZXIpOworCWV0TXV0ZXhfbGVhdmUoJm1fbXV0ZXgpOworfQorCitzdGQ6OnN0cmluZyBNZXNzYWdlU2VydmljZTo6dG9TdHJpbmcoKSBjb25zdCB7CisJcmV0dXJuIGdldE5hbWUoKSArICIgIiArIGdldEFkZHJlc3MoKS50b0lEKCk7Cit9CisKIHZvaWQgTWVzc2FnZVNlcnZpY2U6OnRlcm1pbmF0ZSgpIHsKIAlpZiAobV9leGVjTW9kZSA9PSBJTWVzc2FnZVNlcnZpY2U6OlBPTExFRCB8fCBtX2V4ZWNNb2RlID09IElNZXNzYWdlU2VydmljZTo6TUlYRUQpIHsKIAkJZXRUaW1lcl9zdG9wKCZtX3RpbWVyKTsKQEAgLTE2MCw3ICsxOTEsMTQgQEAKIC8vIGNhbGxlZCBieSBvc2FsIHRpbWVyLCB0aHJlYWQgPwogdm9pZCBNZXNzYWdlU2VydmljZTo6cG9sbGluZ1Rhc2soKSB7CiAJaWYgKG1fcnVubmluZykgewotCQlyZWNlaXZlKCZtX3BvbGxpbmdNZXNzYWdlKTsKKwkJTWVzc2FnZSogcG9sbGluZ01lc3NhZ2UgPSBnZXRNZXNzYWdlQnVmZmVyKHNpemVvZihNZXNzYWdlKSk7CisJCWlmIChwb2xsaW5nTWVzc2FnZSkgeworCQkJbmV3IChwb2xsaW5nTWVzc2FnZSkgTWVzc2FnZShtX21lc3NhZ2VEaXNwYXRjaGVyLmdldEFkZHJlc3MoKSwgMCk7CisJCQlyZWNlaXZlKHBvbGxpbmdNZXNzYWdlKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIFRPRE8gSkI6IGVycm9yIGhhbmRsaW5nIGZvciBwb2xsaW5nTWVzc2FnZSA9PSBOVUxMCisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmggYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlU2VydmljZS5oCmluZGV4IGYyN2NlMmUuLjM4ODIyNjAgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlLmgKKysrIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2UuaApAQCAtMTMsMTAgKzEzLDExIEBACiAjaWZuZGVmIE1FU1NBR0VTRVJWSUNFX0hfCiAjZGVmaW5lIE1FU1NBR0VTRVJWSUNFX0hfCiAKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL0Fic3RyYWN0TWVzc2FnZVNlcnZpY2UuaCIKLQogI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvSU1lc3NhZ2VTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9BZGRyZXNzLmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5LmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5oIgogI2luY2x1ZGUgImV0RGF0YXR5cGVzLmgiCiAjaW5jbHVkZSAib3NhbC9ldE11dGV4LmgiCiAjaW5jbHVkZSAib3NhbC9ldFNlbWEuaCIKQEAgLTI2LDcgKzI3LDcgQEAKIAogbmFtZXNwYWNlIGV0UnVudGltZSB7CiAKLWNsYXNzIE1lc3NhZ2VTZXJ2aWNlOiBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlU2VydmljZSB7CitjbGFzcyBNZXNzYWdlU2VydmljZTogcHVibGljIFJUT2JqZWN0LCBwdWJsaWMgSU1lc3NhZ2VTZXJ2aWNlIHsKIAogcHVibGljOgogCkBAIC0zNCw4ICszNSw4IEBACiAJCVBPTExFRCwgQkxPQ0tFRCwgTUlYRUQKIAl9OwogCi0JTWVzc2FnZVNlcnZpY2UoSVJUT2JqZWN0KiBwYXJlbnQsIElNZXNzYWdlU2VydmljZTo6RXhlY01vZGUgbW9kZSwgaW50IG5vZGUsIGludCB0aHJlYWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQgcHJpb3JpdHkgPSAwKTsKLQlNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgSU1lc3NhZ2VTZXJ2aWNlOjpFeGVjTW9kZSBtb2RlLCBldFRpbWUgaW50ZXJ2YWwsIGludCBub2RlLCBpbnQgdGhyZWFkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IHByaW9yaXR5ID0gMCk7CisJTWVzc2FnZVNlcnZpY2UoSVJUT2JqZWN0KiBwYXJlbnQsIElNZXNzYWdlU2VydmljZTo6RXhlY01vZGUgbW9kZSwgaW50IG5vZGUsIGludCB0aHJlYWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBJTWVzc2FnZU1lbW9yeSogbWVtb3J5LCBpbnQgcHJpb3JpdHkgPSAwKTsKKwlNZXNzYWdlU2VydmljZShJUlRPYmplY3QqIHBhcmVudCwgSU1lc3NhZ2VTZXJ2aWNlOjpFeGVjTW9kZSBtb2RlLCBldFRpbWUgaW50ZXJ2YWwsIGludCBub2RlLCBpbnQgdGhyZWFkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgSU1lc3NhZ2VNZW1vcnkqIG1lbW9yeSwgaW50IHByaW9yaXR5ID0gMCk7CiAJdmlydHVhbCB+TWVzc2FnZVNlcnZpY2UoKTsKIAogCXZvaWQgcnVuKCk7CkBAIC01NCw2ICs1NSwxMiBAQAogCXZpcnR1YWwgdm9pZCByZW1vdmVQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKElNZXNzYWdlUmVjZWl2ZXImIHJlY2VpdmVyKTsKIAl2aXJ0dWFsIHZvaWQgcmVjZWl2ZShjb25zdCBNZXNzYWdlKiBtc2cpOwogCisJTWVzc2FnZSogZ2V0TWVzc2FnZUJ1ZmZlcihpbnQgc2l6ZSk7CisJdm9pZCByZXR1cm5NZXNzYWdlQnVmZmVyKGNvbnN0IE1lc3NhZ2UqIGJ1ZmZlcik7CisKKwljb25zdCBBZGRyZXNzJiBnZXRBZGRyZXNzKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1fYWRkcmVzczsgfQorCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKIAogCWxvbmcgZ2V0TGFzdE1lc3NhZ2VUaW1lc3RhbXAoKSBjb25zdCB7CkBAIC03NSwxMyArODIsMTcgQEAKIAlldEJvb2wgbV9ydW5uaW5nOwogCUlNZXNzYWdlU2VydmljZTo6RXhlY01vZGUgbV9leGVjTW9kZTsKIAlsb25nIG1fbGFzdE1lc3NhZ2VUaW1lc3RhbXA7Ci0JTWVzc2FnZSBtX3BvbGxpbmdNZXNzYWdlOwogCiAJZXRNdXRleCBtX211dGV4OwogCWV0U2VtYSBtX2V4ZWN1dGlvblNlbWFwaG9yZTsKIAlldFRocmVhZCBtX3RocmVhZDsKIAlldFRpbWVyIG1fdGltZXI7CiAKKwlBZGRyZXNzIG1fYWRkcmVzczsKKwlNZXNzYWdlU2VRdWV1ZSBtX21lc3NhZ2VRdWV1ZTsKKwlNZXNzYWdlRGlzcGF0Y2hlciBtX21lc3NhZ2VEaXNwYXRjaGVyOworCUlNZXNzYWdlTWVtb3J5KiBtX21lc3NhZ2VNZW1vcnk7CisKIAl2b2lkIE1lc3NhZ2VTZXJ2aWNlX2luaXQoZXRUaW1lIGludGVydmFsLCBpbnQgcHJpb3JpdHkpOyAvLyBjb21tb24gY3RvcgogCiAJTWVzc2FnZVNlcnZpY2UoKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnkuY3BwIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvU3RhdGljTWVzc2FnZU1lbW9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNzM4NwotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnkuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgcHJvdG9zIHNvZnR3YXJlIGdtYmggKGh0dHA6Ly93d3cucHJvdG9zLmRlKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ09OVFJJQlVUT1JTOgorICogCQlKYW4gQmVsbGUgKGluaXRpYWwgY29udHJpYnV0aW9uKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5LmgiCisKK25hbWVzcGFjZSBldFJ1bnRpbWUgeworCitTdGF0aWNNZXNzYWdlTWVtb3J5OjpTdGF0aWNNZXNzYWdlTWVtb3J5KElSVE9iamVjdCogcGFyZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc2l6ZV90IHNpemUsIGludCBudW1iZXIpIDoKKwkJUlRPYmplY3QocGFyZW50LCBuYW1lKSwgbV9zaXplKHNpemUpLCBtX21zZ1Bvb2woTlVMTCwgIm1lbW9yeSIpLCBtX2J1ZmZlcigwKSB7CisJbV9idWZmZXIgPSBuZXcgdWludDhfdFttX3NpemUgKiBudW1iZXJdOworCXVpbnQ4X3QqIHB0ciA9IG1fYnVmZmVyOworCWZvcihpbnQgaSA9IDA7IGkgPCBudW1iZXI7ICsraSkgeworCQlNZXNzYWdlKiBtc2cgPSBuZXcgKHB0cikgTWVzc2FnZShBZGRyZXNzOjpFTVBUWSwgMCk7CisJCW1fbXNnUG9vbC5wdXNoKG1zZyk7CisJCXB0ciArPSBtX3NpemU7CisJfQorfQorCitTdGF0aWNNZXNzYWdlTWVtb3J5Ojp+U3RhdGljTWVzc2FnZU1lbW9yeSgpIHsKKwlkZWxldGVbXSBtX2J1ZmZlcjsKK30KKworTWVzc2FnZSogU3RhdGljTWVzc2FnZU1lbW9yeTo6Z2V0TWVzc2FnZUJ1ZmZlcihzaXplX3Qgc2l6ZSkgeworCWlmKHNpemUgPD0gbV9zaXplICYmIG1fbXNnUG9vbC5nZXRTaXplKCkgPiAwKSB7CisJCXJldHVybiBjb25zdF9jYXN0PE1lc3NhZ2UqPihtX21zZ1Bvb2wucG9wKCkpOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCit2b2lkIFN0YXRpY01lc3NhZ2VNZW1vcnk6OnJldHVybk1lc3NhZ2VCdWZmZXIoY29uc3QgTWVzc2FnZSogYnVmZmVyKSB7CisJbV9tc2dQb29sLnB1c2goY29uc3RfY2FzdDxNZXNzYWdlKj4oYnVmZmVyKSk7Cit9CisKK30gLyogbmFtZXNwYWNlIGV0UnVudGltZSAqLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvU3RhdGljTWVzc2FnZU1lbW9yeS5oIGIvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tZXNzYWdpbmcvU3RhdGljTWVzc2FnZU1lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjVlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5LmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBwcm90b3Mgc29mdHdhcmUgZ21iaCAoaHR0cDovL3d3dy5wcm90b3MuZGUpLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDT05UUklCVVRPUlM6CisgKiAJCUphbiBCZWxsZSAoaW5pdGlhbCBjb250cmlidXRpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU1JDX0NPTU1PTl9NRVNTQUdJTkdfU1RBVElDTUVTU0FHRU1FTU9SWV9IXworI2RlZmluZSBTUkNfQ09NTU9OX01FU1NBR0lOR19TVEFUSUNNRVNTQUdFTUVNT1JZX0hfCisKKyNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL0lNZXNzYWdlTWVtb3J5LmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9SVE9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlUXVldWUuaCIKKworbmFtZXNwYWNlIGV0UnVudGltZSB7CisKK2NsYXNzIFN0YXRpY01lc3NhZ2VNZW1vcnkgOiBwdWJsaWMgSU1lc3NhZ2VNZW1vcnksIHB1YmxpYyBSVE9iamVjdCB7CitwdWJsaWM6CisJU3RhdGljTWVzc2FnZU1lbW9yeShJUlRPYmplY3QqIHBhcmVudCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNpemVfdCBzaXplLCBpbnQgbnVtYmVyKTsKKwl2aXJ0dWFsIH5TdGF0aWNNZXNzYWdlTWVtb3J5KCk7CisKKwkvLyByZXR1cm5zIGEgYnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBpbiBieXRlcworCU1lc3NhZ2UqIGdldE1lc3NhZ2VCdWZmZXIoc2l6ZV90IHNpemUpOworCS8vIGZyZWVzIHRoZSBidWZmZXIKKwl2b2lkIHJldHVybk1lc3NhZ2VCdWZmZXIoY29uc3QgTWVzc2FnZSogYnVmZmVyKTsKKworCS8vIHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBvbmUgbWVzc2FnZSBidWZmZXIKKwlpbnQgZ2V0QnVmZmVyU2l6ZSh2b2lkKSB7IHJldHVybiBtX3NpemU7IH0KKwkvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSBtZXNzYWdlIGJ1ZmZlcnMKKwlpbnQgZ2V0TWVzc2FnZVBvb2xTaXplKHZvaWQpIHsgcmV0dXJuIG1fbXNnUG9vbC5nZXRTaXplKCk7IH0KKworcHJpdmF0ZToKKwlzaXplX3QgbV9zaXplOworCU1lc3NhZ2VTZVF1ZXVlIG1fbXNnUG9vbDsKKwl1aW50OF90KiBtX2J1ZmZlcjsKK307CisKK30gLyogbmFtZXNwYWNlIGV0UnVudGltZSAqLworCisjZW5kaWYgLyogU1JDX0NPTU1PTl9NRVNTQUdJTkdfU1RBVElDTUVTU0FHRU1FTU9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlLmNwcCBiL3J1bnRpbWUvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwL3NyYy9jb21tb24vbW9kZWxiYXNlL1JlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZS5jcHAKaW5kZXggNTJiZTdlYy4uZmM5NzQ3YyAxMDA2NDQKLS0tIGEvcnVudGltZS9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAvc3JjL2NvbW1vbi9tb2RlbGJhc2UvUmVwbGljYXRlZEFjdG9yQ2xhc3NCYXNlLmNwcAorKysgYi9ydW50aW1lL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC9zcmMvY29tbW9uL21vZGVsYmFzZS9SZXBsaWNhdGVkQWN0b3JDbGFzc0Jhc2UuY3BwCkBAIC0xOSw4ICsxOSw5IEBACiB9CiAKIFJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZTo6flJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZSgpIHsKLQlmb3Ioc3RkOjp2ZWN0b3I8QWN0b3JDbGFzc0Jhc2UqPjo6aXRlcmF0b3IgaXQgPSBtX2l0ZW1zLmJlZ2luKCk7IGl0ICE9IG1faXRlbXMuZW5kKCk7IGl0KyspCisJZm9yKHN0ZDo6dmVjdG9yPEFjdG9yQ2xhc3NCYXNlKj46Oml0ZXJhdG9yIGl0ID0gbV9pdGVtcy5iZWdpbigpOyBpdCAhPSBtX2l0ZW1zLmVuZCgpOyArK2l0KSB7CiAJCWRlbGV0ZSAqaXQ7CisJfQogfQogCiB2b2lkIFJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZTo6Y3JlYXRlU3ViQWN0b3JzKGludCBudW1iZXIpIHsKQEAgLTMzLDEyICszNCwxMyBAQAogfQogCiB2b2lkIFJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZTo6aW5pdGlhbGl6ZSgpIHsKLQlmb3Ioc3RkOjp2ZWN0b3I8QWN0b3JDbGFzc0Jhc2UqPjo6aXRlcmF0b3IgaXQgPSBtX2l0ZW1zLmJlZ2luKCk7IGl0ICE9IG1faXRlbXMuZW5kKCk7IGl0KyspCisJZm9yKHN0ZDo6dmVjdG9yPEFjdG9yQ2xhc3NCYXNlKj46Oml0ZXJhdG9yIGl0ID0gbV9pdGVtcy5iZWdpbigpOyBpdCAhPSBtX2l0ZW1zLmVuZCgpOyArK2l0KSB7CiAJCSgqaXQpLT5pbml0aWFsaXplKCk7CisJfQogfQogCiB2b2lkIFJlcGxpY2F0ZWRBY3RvckNsYXNzQmFzZTo6c2V0UHJvYmVzQWN0aXZlKGJvb2wgcmVjdXJzaXZlLCBib29sIGFjdGl2ZSkgewotCWZvcihzdGQ6OnZlY3RvcjxBY3RvckNsYXNzQmFzZSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0gbV9pdGVtcy5lbmQoKTsgaXQrKykKKwlmb3Ioc3RkOjp2ZWN0b3I8QWN0b3JDbGFzc0Jhc2UqPjo6aXRlcmF0b3IgaXQgPSBtX2l0ZW1zLmJlZ2luKCk7IGl0ICE9IG1faXRlbXMuZW5kKCk7ICsraXQpCiAJCQkoKml0KS0+c2V0UHJvYmVzQWN0aXZlKHJlY3Vyc2l2ZSwgYWN0aXZlKTsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jb21tb24udGVzdHMvbW9kZWxzL1BpbmdQb25nVGhyZWFkLmV0cGh5cyBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuY29tbW9uLnRlc3RzL21vZGVscy9QaW5nUG9uZ1RocmVhZC5ldHBoeXMKaW5kZXggNWU1MzMyMS4uMTIxNWI4NCAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5jb21tb24udGVzdHMvbW9kZWxzL1BpbmdQb25nVGhyZWFkLmV0cGh5cworKysgYi90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmNvbW1vbi50ZXN0cy9tb2RlbHMvUGluZ1BvbmdUaHJlYWQuZXRwaHlzCkBAIC0zLDcgKzMsNyBAQAogCVBoeXNpY2FsU3lzdGVtIFN5cyB7CiAJCU5vZGVSZWYgbm9kZTE6IFBDCiAJfQotCQorCiAJTm9kZUNsYXNzIFBDIHsKIAkJcnVudGltZSA9IFBDCiAJCXByaW9taW4gPSAxCkBAIC0xMyw3ICsxMyw3IEBACiAJCQlleGVjbW9kZSA9IGJsb2NrZWQKIAkJCXByaW8gPSA1CiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDMyCiAJCX0KIAkJCkBAIC0yMSw3ICsyMSw3IEBACiAJCQlleGVjbW9kZSA9IGJsb2NrZWQKIAkJCXByaW8gPSA1CiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDMyCiAJCX0KIAkJCkBAIC0yOSw3ICsyOSw3IEBACiAJCQlleGVjbW9kZSA9IGJsb2NrZWQKIAkJCXByaW8gPSA1CiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDMyCiAJCX0KIAkJCkBAIC0zNyw3ICszNyw3IEBACiAJCQlleGVjbW9kZSA9IGJsb2NrZWQKIAkJCXByaW8gPSA1CiAJCQlzdGFja3NpemUgPSAxMDI0Ci0JCQltc2dibG9ja3NpemUgPSA2NAorCQkJbXNnYmxvY2tzaXplID0gMTI4CiAJCQltc2dwb29sc2l6ZSA9IDMyCiAJCX0KIAkJCkBAIC00Niw3ICs0Niw3IEBACiAJCQlpbnRlcnZhbCA9IDEwMCBtcwogCQkJcHJpbyA9IDUKIAkJCXN0YWNrc2l6ZSA9IDEwMjQKLQkJCW1zZ2Jsb2Nrc2l6ZSA9IDY0CisJCQltc2dibG9ja3NpemUgPSAxMjgKIAkJCW1zZ3Bvb2xzaXplID0gMzIKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvUnVuQWxsVGVzdENhc2VzLmNwcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvUnVuQWxsVGVzdENhc2VzLmNwcAppbmRleCAzZDc2OTUyLi43Mzc3NTRjIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL1J1bkFsbFRlc3RDYXNlcy5jcHAKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9SdW5BbGxUZXN0Q2FzZXMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAibWVzc2FnaW5nL01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5oIgogI2luY2x1ZGUgIm1lc3NhZ2luZy9NZXNzYWdlU2VydmljZVRlc3QuaCIKICNpbmNsdWRlICJtZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2VDb250cm9sbGVyVGVzdC5oIgorI2luY2x1ZGUgIm1lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5VGVzdC5oIgogCiAjaW5jbHVkZSAiZXRVbml0L2V0VW5pdC5oIgogCkBAIC03Miw2ICs3Myw5IEBACiAJTWVzc2FnZVNlcnZpY2VDb250cm9sbGVyVGVzdCBtc2dTdmNDdHJsVGVzdDsKIAltc2dTdmNDdHJsVGVzdC5ydW4oKTsKIAorCVN0YXRpY01lc3NhZ2VNZW1vcnlUZXN0IHN0YXRpY01zZ01lbVRlc3Q7CisJc3RhdGljTXNnTWVtVGVzdC5ydW4oKTsKKwogCWV0VW5pdF9jbG9zZSgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlVGVzdC5jcHAgYi90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL2RlYnVnZ2luZy9EZWJ1Z2dpbmdTZXJ2aWNlVGVzdC5jcHAKaW5kZXggOWI0ODlkOS4uN2E1M2UyZiAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9kZWJ1Z2dpbmcvRGVidWdnaW5nU2VydmljZVRlc3QuY3BwCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvZGVidWdnaW5nL0RlYnVnZ2luZ1NlcnZpY2VUZXN0LmNwcApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9kZWJ1Z2dpbmcvRGVidWdnaW5nU2VydmljZS5oIgogI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2UuaCIKICNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL1JUU2VydmljZXMuaCIKKyNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnkuaCIKICNpbmNsdWRlICJldFVuaXQvZXRVbml0LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBldFJ1bnRpbWU7CkBAIC0yMSw3ICsyMiw3IEBACiB2b2lkIERlYnVnZ2luZ1NlcnZpY2VUZXN0Ojp0ZXN0TG9nZ2luZygpIHsKIAogCU1lc3NhZ2VTZXJ2aWNlIG1zZ1N2YyhOVUxMLCBJTWVzc2FnZVNlcnZpY2U6OkJMT0NLRUQsIDAsIDAsCi0JCQkiVGVzdE1lc3NhZ2VTZXJ2aWNlIik7CisJCQkiVGVzdE1lc3NhZ2VTZXJ2aWNlIiwgbmV3IFN0YXRpY01lc3NhZ2VNZW1vcnkoTlVMTCwgIlRlc3RNZW1vcnkiLCA2NCwgMTAwKSk7CiAJUlRTZXJ2aWNlczo6Z2V0SW5zdGFuY2UoKS5nZXRNc2dTdmNDdHJsKCkuYWRkTXNnU3ZjKG1zZ1N2Yyk7CiAJUlRTZXJ2aWNlczo6Z2V0SW5zdGFuY2UoKS5nZXRNc2dTdmNDdHJsKCkuc3RhcnQoKTsKIAlTdWJTeXN0ZW1DbGFzcyBzdWJTeXN0ZW0oTlVMTCwgIlRlc3RTdWJTeXN0ZW0iKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5jcHAgYi90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlclRlc3QuY3BwCmluZGV4IGY4MWMzYWUuLjczMGEzYTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5jcHAKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZURpc3BhdGNoZXJUZXN0LmNwcApAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgIm1lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlclRlc3QuaCIKICNpbmNsdWRlICJldFVuaXQvZXRVbml0LmgiCiAjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlRGlzcGF0Y2hlci5oIgorI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2UuaCIKKyNpbmNsdWRlICJjb21tb24vbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnkuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGV0UnVudGltZTsKIApAQCAtNTgsMTkgKzYwLDI3IEBACiAJY29uc3QgY2hhciAqZmFpbE1zZyA9ICJNZXNzYWdlRGlzcGF0Y2hlciBkaXNwYXRjaGluZyB0ZXN0IGZhaWxlZCI7CiAKIAkvLyBUZXN0IGRpc3BhdGNoaW5nIE1lc3NhZ2VzCi0JTWVzc2FnZURpc3BhdGNoZXIgbXNnRGlzcChOVUxMLCBBZGRyZXNzKDEsIDIsIDApLCAiVGVzdE1lc3NhZ2VEaXNwYXRjaGVyIik7CisJTWVzc2FnZVNlcnZpY2UgbXNnU3ZjKE5VTEwsIElNZXNzYWdlU2VydmljZTo6QkxPQ0tFRCwgMSwgMiwKKwkJCQkiVGVzdCBNZXNzYWdlU2VydmljZSIsIG5ldyBTdGF0aWNNZXNzYWdlTWVtb3J5KE5VTEwsICJUZXN0TWVtb3J5IiwgNjQsIDEwMCkpOworCU1lc3NhZ2VEaXNwYXRjaGVyIG1zZ0Rpc3AoJm1zZ1N2YywgQWRkcmVzcygxLCAyLCAwKSwgIlRlc3RNZXNzYWdlRGlzcGF0Y2hlciIpOwogCUFkZHJlc3MgYWRkcjEgPSBtc2dEaXNwLmdldEZyZWVBZGRyZXNzKCk7CiAJQWRkcmVzcyBhZGRyMiA9IG1zZ0Rpc3AuZ2V0RnJlZUFkZHJlc3MoKTsKIAlBZGRyZXNzIGFkZHIzID0gbXNnRGlzcC5nZXRGcmVlQWRkcmVzcygpOwogCVNpbXBsZU1lc3NhZ2VSZWNlaXZlciByZWN2MShOVUxMLCAiVGVzdCByZWNlaXZlcjEiLCBhZGRyMSk7CiAJU2ltcGxlTWVzc2FnZVJlY2VpdmVyIHJlY3YyKE5VTEwsICJUZXN0IHJlY2VpdmVyMiIsIGFkZHIyKTsKIAlTaW1wbGVNZXNzYWdlUmVjZWl2ZXIgcmVjdjMoTlVMTCwgIlRlc3QgcmVjZWl2ZXIzIiwgYWRkcjMpOwotCU1lc3NhZ2UgKm1zZzEgPSBuZXcgTWVzc2FnZShhZGRyMSwgMSwgTlVMTCk7Ci0JTWVzc2FnZSAqbXNnMiA9IG5ldyBNZXNzYWdlKGFkZHIyLCAyLCBOVUxMKTsKLQlNZXNzYWdlICptc2czID0gbmV3IE1lc3NhZ2UoYWRkcjMsIDMsIE5VTEwpOwotCU1lc3NhZ2UgKm1zZzQgPSBuZXcgTWVzc2FnZShhZGRyMSwgNCwgTlVMTCk7Ci0JTWVzc2FnZSAqbXNnNSA9IG5ldyBNZXNzYWdlKGFkZHIyLCA1LCBOVUxMKTsKLQlNZXNzYWdlICptc2c2ID0gbmV3IE1lc3NhZ2UoYWRkcjMsIDYsIE5VTEwpOworCU1lc3NhZ2UgKm1zZzEgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCU1lc3NhZ2UgKm1zZzIgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCU1lc3NhZ2UgKm1zZzMgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCU1lc3NhZ2UgKm1zZzQgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCU1lc3NhZ2UgKm1zZzUgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCU1lc3NhZ2UgKm1zZzYgPSBtc2dTdmMuZ2V0TWVzc2FnZUJ1ZmZlcihzaXplb2YoTWVzc2FnZSkpOworCW1zZzEgPSBuZXcgKG1zZzEpIE1lc3NhZ2UoYWRkcjEsIDEpOworCW1zZzIgPSBuZXcgKG1zZzIpIE1lc3NhZ2UoYWRkcjIsIDIpOworCW1zZzMgPSBuZXcgKG1zZzMpIE1lc3NhZ2UoYWRkcjMsIDMpOworCW1zZzQgPSBuZXcgKG1zZzQpIE1lc3NhZ2UoYWRkcjEsIDQpOworCW1zZzUgPSBuZXcgKG1zZzUpIE1lc3NhZ2UoYWRkcjIsIDUpOworCW1zZzYgPSBuZXcgKG1zZzYpIE1lc3NhZ2UoYWRkcjMsIDYpOwogCiAJbXNnRGlzcC5hZGRNZXNzYWdlUmVjZWl2ZXIocmVjdjEpOwogCW1zZ0Rpc3AucmVjZWl2ZShtc2cxKTsKQEAgLTk4LDE2ICsxMDgsMTcgQEAKIAltc2dEaXNwLnJlbW92ZU1lc3NhZ2VSZWNlaXZlcihyZWN2Myk7CiAKIAkvLyBUZXN0IHBvbGxpbmcgTWVzc2FnZXMKLQlNZXNzYWdlIHBvbGxNc2coQWRkcmVzcygxLCAyLCAwKSwgMCwgTlVMTCk7CisJTWVzc2FnZSAqcG9sbE1zZyA9IG1zZ1N2Yy5nZXRNZXNzYWdlQnVmZmVyKHNpemVvZihNZXNzYWdlKSk7CisJcG9sbE1zZyA9IG5ldyAocG9sbE1zZykgTWVzc2FnZShBZGRyZXNzKDEsIDIsIDApLCAwKTsKIAltc2dEaXNwLmFkZFBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjdjEpOwogCW1zZ0Rpc3AuYWRkUG9sbGluZ01lc3NhZ2VSZWNlaXZlcihyZWN2Mik7CiAJbXNnRGlzcC5hZGRQb2xsaW5nTWVzc2FnZVJlY2VpdmVyKHJlY3YzKTsKLQltc2dEaXNwLnJlY2VpdmUoJnBvbGxNc2cpOwotCUVYUEVDVF9FUVVBTF9QVFIobV9jYXNlSWQsIGZhaWxNc2csICZwb2xsTXNnLAorCW1zZ0Rpc3AucmVjZWl2ZShwb2xsTXNnKTsKKwlFWFBFQ1RfRVFVQUxfUFRSKG1fY2FzZUlkLCBmYWlsTXNnLCBwb2xsTXNnLAogCQkJcmVjdjEuZ2V0TGFzdFJlY2VpdmVkTWVzc2FnZVB0cigpKTsKLQlFWFBFQ1RfRVFVQUxfUFRSKG1fY2FzZUlkLCBmYWlsTXNnLCAmcG9sbE1zZywKKwlFWFBFQ1RfRVFVQUxfUFRSKG1fY2FzZUlkLCBmYWlsTXNnLCBwb2xsTXNnLAogCQkJcmVjdjIuZ2V0TGFzdFJlY2VpdmVkTWVzc2FnZVB0cigpKTsKLQlFWFBFQ1RfRVFVQUxfUFRSKG1fY2FzZUlkLCBmYWlsTXNnLCAmcG9sbE1zZywKKwlFWFBFQ1RfRVFVQUxfUFRSKG1fY2FzZUlkLCBmYWlsTXNnLCBwb2xsTXNnLAogCQkJcmVjdjMuZ2V0TGFzdFJlY2VpdmVkTWVzc2FnZVB0cigpKTsKIAltc2dEaXNwLnJlbW92ZVBvbGxpbmdNZXNzYWdlUmVjZWl2ZXIocmVjdjEpOwogCW1zZ0Rpc3AucmVtb3ZlUG9sbGluZ01lc3NhZ2VSZWNlaXZlcihyZWN2Mik7CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9NZXNzYWdlU2VydmljZUNvbnRyb2xsZXJUZXN0LmNwcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlclRlc3QuY3BwCmluZGV4IDM3NGFhYmEuLjQzOWQ5YzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlclRlc3QuY3BwCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlclRlc3QuY3BwCkBAIC02MSw5ICs2MSw5IEBACiAJTWVzc2FnZVNlcnZpY2VDb250cm9sbGVyJiBtc2dTdmNDb250cm9sbGVyID0KIAkJCVJUU2VydmljZXM6OmdldEluc3RhbmNlKCkuZ2V0TXNnU3ZjQ3RybCgpOwogCU1lc3NhZ2VTZXJ2aWNlIG1zZ1N2YzEoTlVMTCwgSU1lc3NhZ2VTZXJ2aWNlOjpCTE9DS0VELCAxLAotCQkJbXNnU3ZjQ29udHJvbGxlci5nZXROZXdJRCgpLCAiTWVzc2FnZVNlcnZpY2UxIik7CisJCQltc2dTdmNDb250cm9sbGVyLmdldE5ld0lEKCksICJNZXNzYWdlU2VydmljZTEiLCBuZXcgU3RhdGljTWVzc2FnZU1lbW9yeShOVUxMLCAiVGVzdE1lbW9yeSIsIDY0LCAxMDApKTsKIAlNZXNzYWdlU2VydmljZSBtc2dTdmMyKE5VTEwsIElNZXNzYWdlU2VydmljZTo6UE9MTEVELCAxLAotCQkJbXNnU3ZjQ29udHJvbGxlci5nZXROZXdJRCgpLCAiTWVzc2FnZVNlcnZpY2UyIik7CisJCQltc2dTdmNDb250cm9sbGVyLmdldE5ld0lEKCksICJNZXNzYWdlU2VydmljZTIiLCBuZXcgU3RhdGljTWVzc2FnZU1lbW9yeShOVUxMLCAiVGVzdE1lbW9yeSIsIDY0LCAxMDApKTsKIAogCW1zZ1N2Y0NvbnRyb2xsZXIuYWRkTXNnU3ZjKG1zZ1N2YzEpOwogCW1zZ1N2Y0NvbnRyb2xsZXIuYWRkTXNnU3ZjKG1zZ1N2YzIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2VUZXN0LmNwcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VTZXJ2aWNlVGVzdC5jcHAKaW5kZXggZTc3N2I0MC4uNzI4YjhlZiAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVNlcnZpY2VUZXN0LmNwcAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9NZXNzYWdlU2VydmljZVRlc3QuY3BwCkBAIC02Niw3ICs2Niw3IEBACiAJTWVzc2FnZVNlcnZpY2VDb250cm9sbGVyJiBtc2dTdmNDdHJsID0KIAkJCVJUU2VydmljZXM6OmdldEluc3RhbmNlKCkuZ2V0TXNnU3ZjQ3RybCgpOwogCU1lc3NhZ2VTZXJ2aWNlIG1zZ1NlcnZpY2UoTlVMTCwgSU1lc3NhZ2VTZXJ2aWNlOjpCTE9DS0VELCAxLCAyLAotCQkJIlRlc3QgTWVzc2FnZVNlcnZpY2UiKTsKKwkJCSJUZXN0IE1lc3NhZ2VTZXJ2aWNlIiwgbmV3IFN0YXRpY01lc3NhZ2VNZW1vcnkoTlVMTCwgIlRlc3RNZW1vcnkiLCBzaXplb2YoTWVzc2FnZSksIDEwMDAwMDAwKSk7CiAJbXNnU3ZjQ3RybC5hZGRNc2dTdmMobXNnU2VydmljZSk7CiAJTWVzc2FnZUNvdW50ZXIgbXNnQ291bnRlcihOVUxMLCAiTWVzc2FnZUNvdW50ZXIiLCBhZGRyKTsKIAltc2dTZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcihtc2dDb3VudGVyKTsKQEAgLTExMCw3ICsxMTAsNyBAQAogCU1lc3NhZ2VTZXJ2aWNlQ29udHJvbGxlciYgbXNnU3ZjQ3RybCA9CiAJCQlSVFNlcnZpY2VzOjpnZXRJbnN0YW5jZSgpLmdldE1zZ1N2Y0N0cmwoKTsKIAlNZXNzYWdlU2VydmljZSBtc2dTZXJ2aWNlKE5VTEwsIElNZXNzYWdlU2VydmljZTo6UE9MTEVELCBpbnRlcnZhbCwgMSwgMiwKLQkJCSJUZXN0IE1lc3NhZ2VTZXJ2aWNlIik7CisJCQkiVGVzdCBNZXNzYWdlU2VydmljZSIsIG5ldyBTdGF0aWNNZXNzYWdlTWVtb3J5KE5VTEwsICJUZXN0TWVtb3J5IiwgNjQsIDEwMCkpOwogCW1zZ1N2Y0N0cmwuYWRkTXNnU3ZjKG1zZ1NlcnZpY2UpOwogCU1lc3NhZ2VDb3VudGVyIG1zZ0NvdW50ZXIoTlVMTCwgIk1lc3NhZ2UgQ291bnRlciIsCiAJCQltc2dTZXJ2aWNlLmdldEZyZWVBZGRyZXNzKCkpOwpAQCAtMTYyLDcgKzE2Miw5IEBACiAKIHZvaWQgU2VuZGVyOjpydW4oKSB7CiAJd2hpbGUgKG1fcnVubmluZykgewotCQltX21zZ1NlcnZpY2UucmVjZWl2ZShuZXcgTWVzc2FnZShtX2FkZHIsIDApKTsKKwkJTWVzc2FnZSogbXNnID0gbV9tc2dTZXJ2aWNlLmdldE1lc3NhZ2VCdWZmZXIoc2l6ZW9mKE1lc3NhZ2UpKTsKKwkJbXNnID0gbmV3IChtc2cpIE1lc3NhZ2UobV9hZGRyLCAwKTsKKwkJbV9tc2dTZXJ2aWNlLnJlY2VpdmUobXNnKTsKIAkJbV9tZXNzYWdlc1NlbnQrKzsKIAl9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUZXN0LmNwcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUZXN0LmNwcAppbmRleCBkYjhjMjlkLi41NDlkMzE0IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9NZXNzYWdlVGVzdC5jcHAKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVRlc3QuY3BwCkBAIC0zNiwxMiArMzYsMTUgQEAKIAlFWFBFQ1RfRVFVQUxfSU5UMTYobV9jYXNlSWQsIGZhaWxNc2csIDEsIG1zZzIuZ2V0RXZ0SWQoKSk7CiAJRVhQRUNUX0VRVUFMX1BUUihtX2Nhc2VJZCwgZmFpbE1zZywgJmRhdGEsIG1zZzIuZ2V0RGF0YSgpKTsKIAotCS8vIFRlc3QgY29uc3RydWN0b3IgTWVzc2FnZShjb25zdCBBZGRyZXNzJiBhZGRyLCBpbnQgZXZ0bV9jYXNlSWQsIGNvbnN0IHZvaWQqIGRhdGFUb0NvcHksIHN0ZDo6c2l6ZV90IGRhdGFTaXplKQotCU1lc3NhZ2UgbXNnMyhhZGRyLCAxLCAmZGF0YSwgc2l6ZW9mKGludCkpOwotCUVYUEVDVF9UUlVFKG1fY2FzZUlkLCBmYWlsTXNnLCBtc2czLmdldEFkZHJlc3MoKSA9PSBhZGRyKTsKLQlFWFBFQ1RfRVFVQUxfSU5UMTYobV9jYXNlSWQsIGZhaWxNc2csIDEsIG1zZzMuZ2V0RXZ0SWQoKSk7CisJLy8gVGVzdCBjb25zdHJ1Y3RvciBEYXRhTWVzc2FnZShjb25zdCBBZGRyZXNzJiBhZGRyLCBpbnQgZXZ0bV9jYXNlSWQsIGNvbnN0IFQmIGRhdGFUb0NvcHkpCisJTWVzc2FnZSogbXNnMyA9IChNZXNzYWdlKikgbmV3IHVpbnQ4X3Rbc2l6ZW9mKERhdGFNZXNzYWdlPGludD4pXTsKKwluZXcgKG1zZzMpIERhdGFNZXNzYWdlPGludD4oYWRkciwgMSwgZGF0YSk7CisJRVhQRUNUX1RSVUUobV9jYXNlSWQsIGZhaWxNc2csIG1zZzMtPmdldEFkZHJlc3MoKSA9PSBhZGRyKTsKKwlFWFBFQ1RfRVFVQUxfSU5UMTYobV9jYXNlSWQsIGZhaWxNc2csIDEsIG1zZzMtPmdldEV2dElkKCkpOwogCUVYUEVDVF9UUlVFKG1fY2FzZUlkLCBmYWlsTXNnLAotCQkJKihzdGF0aWNfY2FzdDxpbnQqPihtc2czLmdldERhdGEoKSkpID09IGRhdGEpOworCQkJKihzdGF0aWNfY2FzdDxpbnQqPihtc2czLT5nZXREYXRhKCkpKSA9PSBkYXRhKTsKKwltc2czLT5+TWVzc2FnZSgpOworCWRlbGV0ZVtdICh1aW50OF90KikgbXNnMzsKIH0KIAogdm9pZCBNZXNzYWdlVGVzdDo6dGVzdEdldHRlcnMoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5VGVzdC5jcHAgYi90ZXN0cy9vcmcuZWNsaXBzZS5ldHJpY2UucnVudGltZS5jcHAudGVzdHMvc3JjL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkNzNiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnlUZXN0LmNwcApAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENPTlRSSUJVVE9SUzoKKyAqIAkJSmFuIEJlbGxlIChpbml0aWFsIGNvbnRyaWJ1dGlvbikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN0YXRpY01lc3NhZ2VNZW1vcnlUZXN0LmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9NZXNzYWdlLmgiCisjaW5jbHVkZSAiY29tbW9uL21lc3NhZ2luZy9TdGF0aWNNZXNzYWdlTWVtb3J5LmgiCisjaW5jbHVkZSAiZXRVbml0L2V0VW5pdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZXRSdW50aW1lOworCit2b2lkIFN0YXRpY01lc3NhZ2VNZW1vcnlUZXN0Ojp0ZXN0KCkgeworCWNvbnN0IGNoYXIqIGZhaWxNc2cgPSAiU3RhdGljTWVzc2FnZU1lbW9yeVRlc3QgZmFpbGVkIjsKKworCVN0YXRpY01lc3NhZ2VNZW1vcnkgbWVtKE5VTEwsICJUZXN0TWVtb3J5Iiwgc2l6ZW9mKERhdGFNZXNzYWdlPHVpbnQzMl90PiksIDEwKTsKKworCUVYUEVDVF9FUVVBTF9JTlQzMihtX2Nhc2VJZCwgZmFpbE1zZywgc2l6ZW9mKERhdGFNZXNzYWdlPHVpbnQzMl90PiksIG1lbS5nZXRCdWZmZXJTaXplKCkpOworCUVYUEVDVF9FUVVBTF9JTlQzMihtX2Nhc2VJZCwgZmFpbE1zZywgMTAsIG1lbS5nZXRNZXNzYWdlUG9vbFNpemUoKSk7CisKKwlNZXNzYWdlKiBtc2dbMTBdOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisJCW1zZ1tpXSA9IG1lbS5nZXRNZXNzYWdlQnVmZmVyKDApOworCQlFWFBFQ1RfVFJVRShtX2Nhc2VJZCwgZmFpbE1zZywgbXNnW2ldICE9IE5VTEwpOworCQlFWFBFQ1RfRVFVQUxfSU5UMzIobV9jYXNlSWQsIGZhaWxNc2csIDkgLSBpLCBtZW0uZ2V0TWVzc2FnZVBvb2xTaXplKCkpOworCQluZXcgKG1zZ1tpXSkgTWVzc2FnZShBZGRyZXNzOjpFTVBUWSwgMCwgTlVMTCk7CisJfQorCUVYUEVDVF9FUVVBTF9QVFIobV9jYXNlSWQsIGZhaWxNc2csIE5VTEwsIG1lbS5nZXRNZXNzYWdlQnVmZmVyKDApKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKwkJbWVtLnJldHVybk1lc3NhZ2VCdWZmZXIobXNnW2ldKTsKKwkJRVhQRUNUX0VRVUFMX0lOVDMyKG1fY2FzZUlkLCBmYWlsTXNnLCBpICsgMSwgbWVtLmdldE1lc3NhZ2VQb29sU2l6ZSgpKTsKKwl9CisKKwltc2dbMF0gPSBtZW0uZ2V0TWVzc2FnZUJ1ZmZlcig0KTsKKwlFWFBFQ1RfVFJVRShtX2Nhc2VJZCwgZmFpbE1zZywgbXNnWzBdICE9IE5VTEwpOworCW1zZ1sxXSA9IG1lbS5nZXRNZXNzYWdlQnVmZmVyKDIpOworCUVYUEVDVF9UUlVFKG1fY2FzZUlkLCBmYWlsTXNnLCBtc2dbMV0gIT0gTlVMTCk7CisJbXNnWzJdID0gbWVtLmdldE1lc3NhZ2VCdWZmZXIoMSk7CisJRVhQRUNUX1RSVUUobV9jYXNlSWQsIGZhaWxNc2csIG1zZ1syXSAhPSBOVUxMKTsKKwl1aW50MzJfdCogdWkzMiA9IG5ldyB1aW50MzJfdCgzMik7CisJdWludDE2X3QqIHVpMTYgPSBuZXcgdWludDE2X3QoMTYpOworCXVpbnQ4X3QqIHVpOCA9IG5ldyB1aW50OF90KDgpOworCW5ldyAobXNnWzBdKSBEYXRhTWVzc2FnZTx1aW50MzJfdD4oQWRkcmVzczo6RU1QVFksIDEsICp1aTMyKTsKKwluZXcgKG1zZ1sxXSkgRGF0YU1lc3NhZ2U8dWludDE2X3Q+KEFkZHJlc3M6OkVNUFRZLCAxLCAqdWkxNik7CisJbmV3IChtc2dbMl0pIERhdGFNZXNzYWdlPHVpbnQ4X3Q+KEFkZHJlc3M6OkVNUFRZLCAxLCAqdWk4KTsKKwlkZWxldGUgdWkzMjsKKwlkZWxldGUgdWkxNjsKKwlkZWxldGUgdWk4OworCXVpMzIgPSAodWludDMyX3QqKSBtc2dbMF0tPmdldERhdGEoKTsKKwl1aTE2ID0gKHVpbnQxNl90KikgbXNnWzFdLT5nZXREYXRhKCk7CisJdWk4ID0gKHVpbnQ4X3QqKSBtc2dbMl0tPmdldERhdGEoKTsKKwlFWFBFQ1RfRVFVQUxfVUlOVDMyKG1fY2FzZUlkLCBmYWlsTXNnLCAzMiwgKnVpMzIpOworCUVYUEVDVF9FUVVBTF9VSU5UMTYobV9jYXNlSWQsIGZhaWxNc2csIDE2LCAqdWkxNik7CisJRVhQRUNUX0VRVUFMX1VJTlQ4KG1fY2FzZUlkLCBmYWlsTXNnLCA4LCAqdWk4KTsKKwltc2dbMF0tPn5NZXNzYWdlKCk7CisJbXNnWzFdLT5+TWVzc2FnZSgpOworCW1zZ1syXS0+fk1lc3NhZ2UoKTsKKwltZW0ucmV0dXJuTWVzc2FnZUJ1ZmZlcihtc2dbMl0pOworCW1lbS5yZXR1cm5NZXNzYWdlQnVmZmVyKG1zZ1sxXSk7CisJbWVtLnJldHVybk1lc3NhZ2VCdWZmZXIobXNnWzBdKTsKK30KKwordm9pZCBTdGF0aWNNZXNzYWdlTWVtb3J5VGVzdDo6cnVuQWxsVGVzdENhc2VzKCkgeworCUFERF9URVNUQ0FTRV9DUFAodGVzdCkKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuZXRyaWNlLnJ1bnRpbWUuY3BwLnRlc3RzL3NyYy9tZXNzYWdpbmcvU3RhdGljTWVzc2FnZU1lbW9yeVRlc3QuaCBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnlUZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiNzRkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLmV0cmljZS5ydW50aW1lLmNwcC50ZXN0cy9zcmMvbWVzc2FnaW5nL1N0YXRpY01lc3NhZ2VNZW1vcnlUZXN0LmgKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBwcm90b3Mgc29mdHdhcmUgZ21iaCAoaHR0cDovL3d3dy5wcm90b3MuZGUpLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDT05UUklCVVRPUlM6CisgKiAJCUphbiBCZWxsZSAoaW5pdGlhbCBjb250cmlidXRpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU1JDX01FU1NBR0lOR19TVEFUSUNNRVNTQUdFTUVNT1JZVEVTVF9IXworI2RlZmluZSBTUkNfTUVTU0FHSU5HX1NUQVRJQ01FU1NBR0VNRU1PUllURVNUX0hfCisKKyNpbmNsdWRlICJ1dGlsL2V0VGVzdFN1aXRlLmgiCisKK2NsYXNzIFN0YXRpY01lc3NhZ2VNZW1vcnlUZXN0OiBwdWJsaWMgZXRUZXN0U3VpdGUgeworcHVibGljOgorCVN0YXRpY01lc3NhZ2VNZW1vcnlUZXN0KHZvaWQpIDoKKwkJCWV0VGVzdFN1aXRlKCJTdGF0aWNNZXNzYWdlTWVtb3J5VGVzdCIpIHsKKwl9CisKK3Byb3RlY3RlZDoKKwl2b2lkIHJ1bkFsbFRlc3RDYXNlcyh2b2lkKTsKKwl2b2lkIHRlc3Qodm9pZCk7Cit9OworCisjZW5kaWYgLyogU1JDX01FU1NBR0lOR19TVEFUSUNNRVNTQUdFTUVNT1JZVEVTVF9IXyAqLwo=